Linux에서 분리형 장치(eSATA,USB 저장소) 마운트 해제

Linux에서 분리형 장치(eSATA,USB 저장소) 마운트 해제

eSATA, USB 드라이브와 같은 분리형 장치는 플러그를 당기기만 하면 갑자기 제거될 수 있습니다.

파티션에 열린 파일 핸들이 있는 경우 이 파티션은 마운트 해제되지 않습니다. 즉, umount드라이브가 물리적으로 분리된 후에도 Linux 명령이 실패합니다.

마운트 해제에 실패하면 장치를 다시 연결할 때도 mount실패합니다. 따라서 어떤 프로세스가 드라이브를 사용하고 있는지 찾아서 해당 프로세스를 종료하거나 모든 핸들을 닫아야 합니다. 둘 중 하나도 수행할 수 없는 경우 드라이브를 마운트하려면 상자를 재부팅해야 합니다. 그리고 나는 그것을 사용하여 프로세스를 확실히 죽일 수 없습니다.

"강제 마운트 해제" 옵션이 없습니다. -f옵션이 있지만 NFS에만 해당됩니다.

이것은 매우 이상하게 들립니다. Linux는 사용자가 단순히 드라이브를 잡아당기는 이러한 시나리오를 수용하지 않습니까? Linux에서 이 시나리오를 적절하게 처리하는 방법을 아는 사람이 있습니까?

특정 파티션/장치에 어떤 파일 핸들이 열려 있는지 확인하거나 특정 장치에 대해서만 모든 파일 핸들을 선택적으로 플러시하고 닫을 수 있는 방법이 있습니까?

참고: lsof현재 사용 중인 임베디드 Linux(busybox)에서는 이 명령을 사용할 수 없습니다.


내 임베디드 Linux에서는 "fuser"를 사용할 수 없습니다.

게으른 umount -l을 시도했습니다. 그러나 지속적으로 작동하지는 않는 것 같습니다. 예를 들어 파일 핸들을 열어 두었다고 가정해 보겠습니다(장치의 일부 파일에 "tail -f" 사용). 그런 다음 드라이브를 분리한 다음 "umount -l"을 수행하면 마운트가 해제됩니다. 그런 다음 드라이브를 다시 연결하고 테일이 계속 실행되는 동안 동일한 마운트 지점에 다시 마운트하려고 합니다. 지속적으로 작동하지 않습니다. 성공할 때도 있고 그렇지 않을 때도 있습니다. 이로 인해 파일 시스템이 일관되지 않은 상태로 남아 있으면 게으른 옵션을 사용하는 것이 불편해집니다. 또한 이 게으른 옵션이 그러한 시나리오에 사용되도록 의도되었는지 확실하지 않습니다.

파일 핸들이 열려 있는 프로세스를 종료할 수 없습니다.


/mnt/abc에 장치를 마운트했고 드라이브 연결을 끊었다가 다시 연결하면 Linux는 우리가 아무 것도 하지 않고도 장치의 파일 시스템을 동일한 마운트 지점 "/mnt/abc"에 다시 연결하는 것 같습니다. 마운트 해제 또는 마운트. 그런 다음 다시 연결한 후에 동일한 이전 열린 파일 핸들이 작동하기 시작하는 것 같습니다(적어도 파일 읽기 작업의 경우). 이것이 나의 관찰이다. 이것이 예상되는 동작인지 확실하지 않습니다. 그러나 이 역시 일관되게 작동하지 않는 것 같습니다.

읽기용으로 열려 있는 파일 핸들("tail -f")이 있어서 열어 둔 다음 분리했다가 다시 연결한 다음 테일링되는 파일을 수정했고 "tail -f" 출력이 변경 사항으로 업데이트되는 것을 보았습니다. 그러나 장치가 사라진 후(예상한 대로 오류가 발생함) 파일을 수정하려고 시도한 다음 다시 연결하면 장치의 파일 시스템이 동일한 마운트 지점에 제대로 다시 연결되지 않습니다. 파일 쓰기의 경우(장치가 없는 동안) 작동하지 않는 것 같습니다.

모든 핸들을 닫지 않고 모든 파티션을 적절하게 마운트 해제하지 않고 드라이브를 갑자기 제거할 때 Linux가 따르는 표준/일관적인 동작이 있습니까?

답변1

bash 스크립트를 작성하여 나열된 모든 파일 설명자를 검색하고 /proc(있는 것으로 가정) 프로세스를 나열/종료할 수 있습니다.

/proc/$m/fd/$n기호 링크로 표시되는 PID m에 대한 n번째 파일 설명자입니다. busyboxreadlink 지원이 있으므로 자동으로 수행할 수 있어야 합니다.

편집: 이것은 본질적으로 다시 구현하는 것이라고 말하지만 lsof실제로는 매우 간단합니다.

답변2

lsof를 사용하여 특정 디렉터리 아래에 열려 있는 파일을 나열하는 데 사용할 수 있습니다 lsof +D /path/to/mountpoint.

답변3

시도해 보셨나요:

umount -l /path/to/mountpoint
또는

fuser -km /path/to/mountpoint
?


좋아, 그래서 이전 제안이 효과가 없었습니다. 어리석은 짓일 수도 있다는 건 알지만 실제로 시도해 보셨나요?

umount -f /path/to/mountpoint

Busybox 문서에 따르면 이는 강제 마운트 해제 옵션이어야 합니다(NFS를 예로 표시).

그래도 문제가 해결되지 않으면 다음을 시도해 보셨나요?

eject -s /dev/my-sata-or-usb-device

답변4

부족한 경우 빠른 해결책은 mount_point를 실제 마운트 지점으로 바꾸는 lsof것입니다 . find /proc/*/fd | xargs readlink | grep /mount_point이는 위의 billc.cn 답변을 기반으로 합니다.

관련 정보