umount : 장치가 사용 중입니다. 왜?


171

실행할 때 umount /path나는 얻는다 :

umount: /path: device is busy.

파일 시스템은 크기가 크므 lsof +D /path로 현실적인 옵션은 아닙니다.

lsof /path, lsof +f -- /pathfuser /path모두는 아무것도 반환하지 않습니다. fuser -v /path제공합니다 :

                  USER        PID ACCESS COMMAND
/path:            root     kernel mount /path

이것은 사용하지 않는 마운트 된 모든 파일 시스템에 정상입니다.

umount -l그리고 umount -f내 상황에 충분하지 않습니다.

커널이 왜이 파일 시스템이 사용 중이라고 생각하는지 어떻게 알 수 있습니까?


11
쉘의 현재 디렉토리가 마운트 포인트 경로에 있습니까?
LawrenceC

아뇨. 그러면 퓨저가 그렇게 말할 것입니다.
Ole Tange 2016 년

12
당신은 실제로 원하는 fuser -vm /path...
derobert

5
언 마운트가 --force마운트 해제 열심히 노력 할 것이다 -v또는 -vvv더 마운트 문제가 무엇인지 reaveal 것조차. umount -vvv --force /babdmount
gaoithe

답변:


139

내 문제의 원인 nfs-kernel-server은 디렉토리를 내보내는 것 같습니다 . 은 nfs-kernel-server아마별로 나열되지 않은, 따라서 정상 열려있는 파일 뒤에 가서 lsof하고 fuser.

내가 멈출 때 나는 디렉토리를 nfs-kernel-server할 수 있었다 umount.

나는 지금까지 모든 솔루션의 예제가있는 페이지를 만들었습니다 : http://oletange.blogspot.com/2012/04/umount-device-is-busy-why.html


54
솔루션 구현시 포기하지 않고 자신의 질문에 답변 해 주셔서 감사합니다. 귀하의 답변은 비슷하게 내 보낸 NFS 공유를 분류하는 데 도움이되었습니다.
Jeff Welling

7
파일 시스템에 루프백 장치를 설정 한 경우에도 이와 동일한 문제가 발생할 수 있습니다 (예 : / dev / loop0이 / path의 파일에 의해 백업되는 경우).
BCran

1
나는했다 sudo service samba stop첫째, 당신의 대답은 정말 도와!
malat

1
이 게시물은 이것을 알아 내려고 몇 시간 동안 nfs 서비스가 실행 중임을 상기시켜주었습니다. RHEL6 / CentOS6에서는 사용 sudo service nfs stop하고 내보내기 sudo exportfs -u를 해제 할 필요가 없습니다 . 다음에 기억 sudo exportfs -r하고 sudo service nfs start수출을 다시하고 서비스를 다시 시작합니다.
code_dredd

1
내 경우에는 nfs 서버를 중지 할 필요가 없었고 exportfs -u문제의 디렉토리 만 중지했습니다 .
법률 29

42

위 의 BruceCran의견덧붙이 자면 ,이 문제의 원인은 방금 오래된 루프백 마운트였습니다. 난 이미의 출력 확인 것 fuser -vm <mountpoint>/을 lsof +D <mountpoint>, mount그리고 cat /proc/mounts, 오래된 NFS - 커널 서버가 실행되었는지 여부를 확인, 시도, 할당량을 해제 (그러나 실패)는 umount -f <mountpoint>모든하지만 마지막으로 출력을 확인하기 전에 924일 '가동 시간을 포기하고 자신을 사임 의 losetup두 개의 오래된 구성-하지만-장착하지 루프백을 찾는 :

parsley:/mnt# cat /proc/mounts 
rootfs / rootfs rw 0 0
none /sys sysfs rw,nosuid,nodev,noexec 0 0
none /proc proc rw,nosuid,nodev,noexec 0 0
udev /dev tmpfs rw,size=10240k,mode=755 0 0
/dev/mapper/stuff-root / ext3 rw,errors=remount-ro,data=ordered 0 0
tmpfs /lib/init/rw tmpfs rw,nosuid,mode=755 0 0
usbfs /proc/bus/usb usbfs rw,nosuid,nodev,noexec 0 0
tmpfs /dev/shm tmpfs rw,nosuid,nodev 0 0
devpts /dev/pts devpts rw,nosuid,noexec,gid=5,mode=620 0 0
fusectl /sys/fs/fuse/connections fusectl rw 0 0
/dev/dm-2 /mnt/big ext3 rw,errors=remount-ro,data=ordered,jqfmt=vfsv0,usrjquota=aquota.user 0 0

그때

parsley:/mnt# fuser -vm /mnt/big/
parsley:/mnt# lsof +D big
parsley:/mnt# umount -f /mnt/big/
umount2: Device or resource busy
umount: /mnt/big: device is busy
umount2: Device or resource busy
umount: /mnt/big: device is busy

parsley:/mnt# losetup -a    
/dev/loop0: [fd02]:59 (/mnt/big/dot-dropbox.ext2)
/dev/loop1: [fd02]:59 (/mnt/big/dot-dropbox.ext2)

parsley:/mnt# losetup -d /dev/loop0
parsley:/mnt# losetup -d /dev/loop1
parsley:/mnt# losetup -a
parsley:/mnt# umount big/
parsley:/mnt#

젠투 포럼 게시물은 또한 잠재적 인 범죄자로 swapfiles를 나열; 요즘에는 파일로 바꾸는 것이 매우 드물지만의 출력을 확인하는 데 상처를 줄 수는 없습니다 cat /proc/swaps. 할당량이 마운트 해제를 막을 수 있는지 확실하지 않습니다.


12
924일 가동 시간을 의미 모든 당신이 :-) 커널 패치를 업데이트 할 필요가 있다는 것입니다
w00t에게

한 스왑 파일을 언급, 그들은 블록 마운트 해제를, 당신이 직접 확인하지 않으면 거의 발견 할 수없는 경우가 많습니다.
P.Pter

22

lsof를 사용하여 파일 시스템을 크롤링하는 대신 열린 파일의 전체 목록을 사용하여 grep하십시오. 정확하지는 않지만이 반품이 더 빨라야한다는 것을 알았습니다. 작업이 완료되어야합니다.

lsof | grep '/path'

1
lsof / path는 경로 만 살펴 봅니다.
Ole Tange 2016 년

7
내가 말을하지 않았다 lsof /path, 나는 말했다 lsof | grep '/path'. 차이점은 인수가없는 lsof는 일종의 캐시 테이블을 사용하여 열려있는 모든 파일을 표시하고 grep이이를 빠르게 검색한다는 점입니다. lsof로 시도한 것은 파일 시스템을 스캔하는 데 시간이 오래 걸립니다.
Caleb

1
내가 말했듯이 : lsof /path경로 만 봅니다. 모든 단일 파일을 보지는 않습니다. 그것은 종종보다 훨씬 빠르다 lsof | grep /path는 그 경로에 열려있는 모든 파일 만 파일을 보지 않기 때문에 (내 비 과학적 테스트는 YMMV 20 배 빠른했다).
Ole Tange

기술적 인 차이점이 무엇인지 잘 모르겠지만 오래된 NFS 마운트를 조사하는 동안 lsof /path아무것도 찾지 못했습니다. 반면 lsof | grep /path열린 파일을 보유하고 볼륨을 마운트 해제하지 못하게하는 프로세스를 보여주었습니다.
dpw

20

나에게 문제가되는 프로세스는 chroot에서 실행되는 데몬이었습니다. 그것은 chroot에 lsof있었고 fuser찾을 수 없기 때문입니다.

chroot에 무언가가 남아 있다고 의심되는 경우 sudo ls -l /proc/*/root | grep chroot범인을 찾을 수 있습니다 ( "chroot"를 chroot의 경로로 바꿉니다).


1
sudo ls -l /proc/*/status | grep HOST
좋았고

1
내 시스템 (Mint Qiana) lsof /mountpointfuser /mountpoint둘 다 chroot 된 경우에도 프로세스를 찾습니다.
Ole Tange

9

파일 열기

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

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)을 참조하십시오 .


5

퓨저가 마운트를 열어 둔 PID에 대해보고하려면 -m을 사용해야합니다.

fuser -m /path

2
사실이지만 관련이 없음 : lsof /path와 동일한 PID 목록을 제공합니다 fuser -m /path.
Gilles

fuser -M /path/path마운트 포인트 인지 확인합니다 .
user3804598

5

루트 파일 시스템이 일반적으로 읽기 전용 인 독점 시스템이 있습니다. 때로는 파일을 복사해야 할 때 읽기-쓰기로 다시 마운트됩니다.

mount -oremount,rw /

그런 다음 다시 장착했습니다.

mount -oremount,ro /

그러나 이번에 mountmount: / is busy오류가 계속 발생했습니다. 파일 시스템이 읽기 / 쓰기 일 때 실행 된 일부 명령 으로 대체 된 파일에 열린 디스크립터를 보유하는 프로세스로 인해 발생했습니다 . lsof -- /출력 에서 중요한 행은 다음과 같습니다 (이름이 변경되었습니다).

replicate  1719 admin DEL REG 8,5  204394 /opt/gns/lib/replicate/modules/md_es.so

주목 DEL출력에. 삭제 된 파일을 보류 한 프로세스를 다시 시작하면 문제가 해결되었습니다.


3
요약은 다음과 같습니다. 제거 된 파일을 연 프로세스입니다. 입력이 양호합니다.
Ole Tange

4

lsoffuser중 하나를 나에게 아무것도주지 않았다.

가능한 모든 디렉토리의 이름을 .old로 바꾸고 시스템을 재부팅 할 때마다 변경 한 후에 시스템을 재부팅 한 후 책임이있는 특정 디렉토리 (postfix 관련)를 찾았습니다.

내가로부터 심볼릭 링크를 만들어 한 번했다고 밝혀졌다 /var/spool/postfix/disk2/pers/mail/postfix/varspool디스크가 SDCARD 기반 루트 파일 시스템 (다 .Sheeva 플러그)에 글을 최소화하기 위해.

이 심볼릭 링크와, 심지어 정지 후 postfixdovecot서비스를 (둘 ps aux뿐만 아니라 netstat -tuanp관련 아무것도 보여주지 않았다) 나는 할 수 없습니다 unmount /disk2/pers.

symlink를 제거하고 새 디렉토리를 직접 가리 키 도록 postfixdovecot구성 파일을 업데이트 /disk2/pers/하면 서비스와 unmount디렉토리 를 성공적으로 중지 할 수있었습니다 .

다음에 나는 다음의 결과를 좀 더 자세히 살펴볼 것이다.

ls -lR /var | grep ^l | grep disk2

위의 명령은 디렉토리 트리의 모든 심볼릭 링크를 재귀 적으로 나열하고 (여기서는 시작 /var) 특정 대상 마운트 지점 (여기서는 disk2)을 가리키는 이름을 필터링합니다.


3

나는이 문제가 있었고, 내가 알지 못하는 백그라운드에서 활성 스크린 세션이있는 것으로 판명되었습니다. 다른 활성 화면 세션에 연결했는데 쉘이 현재 마운트 된 디렉토리에 있지 않았습니다. 다른 쉘 세션을 종료하면 문제가 해결되었습니다.

내 결의안을 공유 할 줄 ​​알았는데


1

오늘 문제는 개방 소켓 (특히 tmux) 이었습니다 .

mount /mnt/disk
export TMPDIR=/mnt/disk
tmux
<<detatch>>
umount /mnt/disk
umount: /mnt/disk: device is busy.
lsof | grep /mnt/disk
tmux      20885             root    6u     unix 0xffff880022346300        0t0    3215201 /mnt/disk/tmux-0/default

1

나는 몇이 bindoverlay나를 차단 한 내 마운트에서 마운트, 당신은 언 마운트 할 마운트 지점의 탭 완료를 확인합니다. 특히 오버레이 마운트라고 생각하지만 바인드 일 수도 있습니다.


1

이것은 답변보다 더 많은 해결 방법이지만 누군가에게 도움이 될 수 있도록 게시하고 있습니다.

필자의 경우 / var 파티션을 더 크게 만들고 싶을 때 LVM을 수정하려고 했으므로 마운트 해제해야했습니다. 이 게시물에서 모든 의견을 작성하고 답변했습니다 (모두에게 감사드립니다. 특히 @ ole-tange에게 감사드립니다).

주문이 내 경우와 관련이있는 경우를 대비하여 0 실행 수준에 지정된 순서대로 대부분의 프로세스를 종료하려고 시도했지만 도움이되지 않았습니다. 그래서 내가 한 것은 사용자 정의 런레벨 (chkconfig의 출력을 새로운 chkconfig --level 명령으로 결합)을 생성하는 것이 었습니다 .1 (단일 사용자 모드)와 매우 유사하지만 네트워크 기능 (ssh 네트워크 및 xinet 사용)과 비슷합니다.

redhat을 사용하면서 runlevel 4는 "unused / user defined"로 표시되었으므로이를 사용하고 실행 init 4 했습니다. 어떤 경우에도 서버를 재부팅해야했기 때문에 괜찮 았습니다. 디스크를 조정하는 사람.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.