[unix] Umount에서 사용중인 장치

디렉토리를 마운트 해제하는 데 종종 문제가 발생합니다.

umount / mnt / dir
umount : / mnt / dir : 장치가 사용 중입니다

장치가 사용중인 이유는 여러 가지가 있습니다. 때때로 열린 잠금이있는 프로세스가 실행 중이거나 위에 다른 디렉토리가 마운트되어있을 수 있습니다 /mnt/dir.

내 질문:

디렉토리를 마운트 해제 할 수없는 이유를 확인하는 단계는 무엇입니까?

여러 가지 이유가 있다는 것을 알고 있지만 특정 솔루션을 설명해도 괜찮습니다.

[편집하다]

[X] 마운트 된 볼륨에서 프로세스 실행
[X] 마운트 해제하려는 볼륨 위에 다른 볼륨이 마운트되었습니다.
[_] NFS 마운트 해제하려는 볼륨을 잠급니다.



답변

확인하는 방법 fuser -vm /mnt/dir은 루트로 실행해야합니다. 마운트 지점에 액세스중인 프로세스를 알려줍니다.

다른 방법은 lsof /mnt/dir마운트에서 열린 각 파일을 표시하는 것입니다. 다시 루트로 실행하는 것이 가장 좋습니다.

이들 중 하나를 루트가 아닌 것으로 실행할 수 있지만 출력은 프로세스로 제한됩니다. 다른 사용자의 파일은 파일 시스템 마운트 해제를 방해하더라도 자동으로 표시되지 않습니다.

예:

Watt:~# fuser -vm /mnt/Zia/src
                     USER        PID ACCESS COMMAND
/mnt/Zia/src:        root     kernel mount /mnt/Zia/src
                     anthony   24909 ..c.. bash
                     anthony   25041 F.c.. gvim

“액세스”필드는 액세스 방법을 알려줍니다. 이 경우 커널은 마운트로 사용하고 있습니다 (duh, 그러나 이것으로 만 마운트 해제는 정상입니다). bash현재 작업 디렉토리로 설정하고 ( cd언 마운트하기 전에 다른 디렉토리로 가져와야 함) gvim은 현재 디렉토리를 가지고 있으며 파일이 열려 있습니다 (그 gvim을 닫아야합니다).

Watt:~# lsof /mnt/Zia/src
COMMAND   PID    USER   FD   TYPE DEVICE SIZE/OFF    NODE NAME
bash    24909 anthony  cwd    DIR   0,26    12288 3527682 /mnt/Zia/src/perl (zia.vpn.home:/home/anthony/src)
gvim    25041 anthony  cwd    DIR   0,26    12288 3527682 /mnt/Zia/src/perl (zia.vpn.home:/home/anthony/src)
gvim    25041 anthony    6u   REG   0,26    16384 3526219 /mnt/Zia/src/perl/.utf8.c.swp (zia.vpn.home:/home/anthony/src)

이 출력에서 ​​bash 및 gvim의 현재 디렉토리를 유형으로 볼 수 있습니다 DIR. gvim이 쓰기 위해 연 파일을 볼 수도 있습니다.

문제를 해결하는 방법 :

fuser있다 -k: 신호 (기본 보내드립니다 옵션 SIGKILL(가) 마운트 사용하여 각 프로세스를). 이것은 마운트가 사용 중지되는 것을 막는 다소 강력한 방법입니다. (물론 조심하십시오 SIGKILL!)

umount-l게으른 마운트 해제를 수행 할 수있는 옵션을 선택합니다. 마운트는 파일 시스템 네임 스페이스에서 제거되므로 ( /mnt/Zia/src이 예에서는 더 이상 표시되지 않음 ) 마운트 상태를 유지하므로 액세스하는 프로그램이 계속 그렇게 할 수 있습니다. 마지막으로 액세스 한 프로그램이 종료되면 마운트 해제가 실제로 발생합니다.

마운트 해제 실패의 최종 수정 가능한 원인이 하나 있으며 이는 NFS 서버가 다운되는 것입니다. 여기서는 사용할 수 umount -f있지만 그렇게하면 데이터가 손실 될 위험이 있습니다. (클라이언트가 서버에서 아직 확인하지 않은 쓰기를 캐시했을 수 있으며 해당 쓰기는 버려집니다. 그러나 이미 쓰기가 성공했다고 앱에 알려졌습니다.)


답변

다음을 사용해야합니다.

sudo umount -l <path>


답변

마운트 해제하려는 볼륨 위에 다른 볼륨이 마운트됩니다.

mount명령을 사용하면 인수 나 옵션 (제외 -v) 없이 호출 한 경우 마운트 된 모든 볼륨을 알 수 있습니다 . perl 비트를 추가하여 활성 마운트 포인트 목록을 가질 수 있습니다.

mount | perl -pe 's/.*on (\S+) type.*/\1/'

그런 다음 마운트를 해제하려는 시작점을 통해 grep하면이 파일 시스템에 마운트 된 파일 시스템이 있는지 알 수 있습니다.

mount | perl -pe 's/.*on (\S+) type.*/\1/' | grep '/mnt/dir/'

그런 다음 두 가지 솔루션이 있습니다. 파일 시스템을 마운트 해제하거나 mount --move olddir newdir(커널> 2.5.1)로 이동하십시오.


답변

파일 열기

열린 파일이있는 프로세스가 일반적인 범인입니다. 그들을 표시하십시오 :

lsof +f -- <mountpoint or device>

사용하는 장점이있다 /dev/<device>보다는 /mountpoint마운트 지점이 후 사라집니다 : umount -l, 또는이 마운트 입혀진으로 숨겨져 될 수있다.

fuser사용할 수도 있지만 내 마음 lsof에는 더 유용한 출력이 있습니다. 그러나 fuser드라마의 원인이되는 프로세스를 중단하여 인생을 살아갈 수있는 경우에 유용합니다.

파일을 나열하십시오 <mountpoint>(위의 경고 참조).

fuser -vmM <mountpoint>

쓰기 위해 열린 파일이있는 프로세스 만 대화식으로 종료하십시오.

fuser -vmMkiw <mountpoint>

읽기 전용 ( mount -o remount,ro <mountpoint>)을 다시 마운트 한 후 나머지 모든 프로세스를 종료하는 것이 안전합니다 (r).

fuser -vmMk <mountpoint>

마운트 포인트

범인은 커널 자체가 될 수 있습니다. 파일 시스템에 마운트 된 다른 파일 시스템 umount이 슬픔을 일으킬 것입니다. 확인 :

mount | grep <mountpoint>/

루프백 마운트의 경우 다음 출력도 확인하십시오.

losetup -la

익명의 inode (Linux)

익명의 inode 는 다음과 같은 방법으로 만들 수 있습니다.

  • 임시 파일 ( openO_TMPFILE)
  • 시계를 inotify
  • [eventfd]
  • [이벤트 폴]
  • [timerfd]

다음은 포켓몬의 가장 어려운 유형과의 표시 lsofTYPE같은 열 a_inode합니다 (에 문서화되지 않은 lsof사람 페이지 ).

에 표시되지 lsof +f -- /dev/<device>않으므로 다음을 수행해야합니다.

lsof | grep a_inode

익명의 inode를 보유한 프로세스를 종료하려면 현재 inotify 시계 나열 (경로 이름, PID)을 참조하십시오 .


답변

마운트 해제 할 디렉토리에 NFS가 액세스하는지 확인하는 방법에 대한 대답은 여전히 ​​그렇습니다.

내가 가진 것은 이것뿐입니다.

nfsd가 실행 중인지 확인하십시오.

pidof nfsd

클라이언트별로 마운트 된 디렉토리 표시 :

showmount -a

그리고 showmountw / 인수 쇼에만 클라이언트 호스트 오 그들은 오프라인 경우에도. 나는 이것이 NFS의 특별한 행동이라고 가정합니다.


답변

나에게 문제는 ssh를 통해 두 번 이상 로그인했으며 로그인 중 하나에서 pwd가 마운트 지점 하위 폴더 안에있는 명령 프롬프트에 있다는 것입니다.


답변