디렉토리를 마운트 해제하는 데 종종 문제가 발생합니다.
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 는 다음과 같은 방법으로 만들 수 있습니다.
- 임시 파일 (
open
과O_TMPFILE
) - 시계를 inotify
- [eventfd]
- [이벤트 폴]
- [timerfd]
다음은 포켓몬의 가장 어려운 유형과의 표시 lsof
의 TYPE
같은 열 a_inode
합니다 (에 문서화되지 않은 lsof
사람 페이지 ).
에 표시되지 lsof +f -- /dev/<device>
않으므로 다음을 수행해야합니다.
lsof | grep a_inode
익명의 inode를 보유한 프로세스를 종료하려면 현재 inotify 시계 나열 (경로 이름, PID)을 참조하십시오 .
답변
마운트 해제 할 디렉토리에 NFS가 액세스하는지 확인하는 방법에 대한 대답은 여전히 그렇습니다.
내가 가진 것은 이것뿐입니다.
nfsd가 실행 중인지 확인하십시오.
pidof nfsd
클라이언트별로 마운트 된 디렉토리 표시 :
showmount -a
그리고 showmount
w / 인수 쇼에만 클라이언트 호스트 오 그들은 오프라인 경우에도. 나는 이것이 NFS의 특별한 행동이라고 가정합니다.
답변
나에게 문제는 ssh를 통해 두 번 이상 로그인했으며 로그인 중 하나에서 pwd가 마운트 지점 하위 폴더 안에있는 명령 프롬프트에 있다는 것입니다.