私はYoctoベースの組み込みLinuxシステム(カーネルバージョン5.10.48)を使用しており、USBフラッシュドライブの取り外しに問題があります。
USBドライブが接続されると、udevで実行されるスクリプトがあります。接続が完了したら、/run/media にディレクトリを作成し、そこにファイルシステムをマウントし、接続を解除するとファイルシステムをアンマウントし、マウントポイントを削除する必要があります。
ファイルシステムがUSBフラッシュドライブにマウントされていて、一部のプロセスでファイルを開いたままにしている場合、フラッシュドライブを取り外してもファイルは閉じられません。したがって、ファイルシステムをマウント解除できず、そのマウントポイントディレクトリが削除されます。
たとえば、USBフラッシュドライブを接続し、FAT32パーティション/ dev / sdc1を持つ/ dev / sdcとして検出されました。そのため、シェルで次のコマンドを実行します。
root@host:media$ mkdir usbflash
root@host:media$ mount /dev/sdc1 usbflash
root@host:media$ tail -F usbflash/dir/file &
[1] 2544
その後、USBフラッシュドライブを物理的に取り外します。その後、ファイルシステムをアンマウントしようとしましたが、ファイルがまだ開いているため、それを行うことはできませんでした。
root@host:media$ umount usbflash
umount: /run/media/usbflash: target is busy.
root@host:media$ lsof -p 2544 | grep file
tail 2544 root 3r REG 8,33 0 1043 /run/media/usbflash/dir/file
このファイルを使用してプロセスを終了し、ファイルシステムをアンマウントしてマウントポイントを削除できることを知っていますが、他のタスクを実行するアプリケーションなので、プロセス全体を終了することはできません。
ファイルを強制的に閉じたり、ファイルが開いているファイルシステムを強制的にマウント解除したり、ファイルシステムがインストールされているディレクトリを強制的に削除したりする方法はありますか?
答え1
Linuxカーネルはそうではありませんrevoke() システムコールしたがって、プロセスを終了することが唯一のオプションです。あなたはそれを貢献することを歓迎します。
答え2
--lazy
オプションを試してみましたか?
sudo umount --lazy <mount-point>