존재하지 않는 열린 파일이 있는 파일 시스템을 마운트 해제하는 방법은 무엇입니까?

존재하지 않는 열린 파일이 있는 파일 시스템을 마운트 해제하는 방법은 무엇입니까?

저는 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

리눅스 커널은 그렇지 않습니다revoke() 시스템 호출, 따라서 프로세스를 종료하는 것이 유일한 옵션입니다. 당신은 그것을 기여하는 것을 환영합니다.

답변2

--lazy옵션을 사용해 보셨나요 ?

sudo umount --lazy <mount-point>

관련 정보