我有一个基于 Yocto 的嵌入式 Linux 系统(内核版本 5.10.48),并且遇到 USB 闪存驱动器移除问题。
我有一个在插入 USB 驱动器时由 udev 运行的脚本。插入时,它应该在 /run/media 中创建一个目录并在那里挂载文件系统,拔出时应该卸载文件系统并删除挂载点。
当安装 USB 闪存驱动器上的文件系统并且某些进程将其上的文件保持打开状态时,删除闪存驱动器不会导致该文件关闭。因此,无法卸载文件系统并删除其挂载点目录。
例如,我连接了USB闪存驱动器,它被检测为/dev/sdc,其中有一个FAT32分区/dev/sdc1。因此,我在 shell 中执行以下命令:
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>