Linux : umount를 수행 할 때 어떤 프로세스가 "장치 사용 중"을 유발합니까? [닫은]


79

Linux : umount를 수행 할 때 어떤 프로세스가 "장치 사용 중"을 유발합니까?


더 많은 정보를 제공해야합니다. 다른 대답의 수 ....가있을 수 있습니다
AAA

어떤 정보가 필요합니까? 가능한 답은 무엇입니까?
flybywire

최근 편집 내용을 되돌립니다. 먼저 쉘 스크립팅은 .net, SQL 쿼리 또는 아이폰 개발만큼이나 많은 프로그래밍입니다. 둘째, 리눅스 지정을 제거하는 것은이 질문을 야심 차게 만듭니다. BSD, OSX 등은 의미가 약간 다르며 Solaris 등은 훨씬 더 그렇습니다.
MarkusQ

잊지 마세요 NFS! 원하는 드라이브에서 모든 NFS 내보내기 또는 마운트 지점을 중지해야합니다 umount. NFS는 lsof또는 fuser... 에 표시되지 않으므로 매우 까다 롭습니다!
Trevor Boyd Smith

답변:


108

상기 봐 lsof를의 명령 (목록 열려있는 파일) -이 프로세스가 무엇인지가 열려 유지하는 당신에게 말할 수 있습니다. 때로는 까다 롭지 만 종종 sudo lsof | grep (your device name here)당신을 위해 할 수있는 간단한 일입니다.


14
제 경우에는 장치 이름을 검색해도 결과가 표시되지 않았습니다. 그러나 장치가 실제로 마운트 된 경로를 찾아 보았습니다. 마침내 그 프로세스를 종료함으로써 장치를 성공적으로 마운트 해제 할 수있었습니다.
brAzzi64

제 경우에는 명령이 아무것도 표시하지 않았습니다. SSH 클라이언트를 종료하고 다시 로그인했습니다.
machineaddict

4
마운트 해제를 시도하는 동안 그 방향 안에 있었을 것입니다.
Bosiwow

4
lsof /mountpoint대신lsof /mountpoint/
songhir

lsof +f /dev/devicemountpoint 대신 사용 하는 것이 유리합니다 . 해당 목록에도 표시되지 않을 수있는 익명의 inode가있는 커널 프로세스에 대해서도 동일합니다.
Tom Hale

43

만일을 대비해 ... 때때로 터미널에서 umount를 호출하고 현재 디렉토리가 마운트 된 파일 시스템에 속합니다.


4
나도 알았어. lsof가 "bash"프로세스 (debian)를 나열하면 이것을 알 수 있습니다.
Matthias Bayer

fuser내가 믿는 이와 같은 현재 작업 디렉토리를 잡습니다.
트레버 보이드 스미스

26

fuser 명령을 사용해야합니다 .

예 : fuser /dev/cdrom를 사용하여 프로세스의 pid (s)를 반환합니다 /dev/cdrom.

마운트 해제를 시도하는 경우 -k스위치를 사용하여 이러한 프로세스를 종료 할 수 있습니다 (참조 man fuser).


2
FYI fuser는 때때로 lsof그렇지 않은 것과 반대 되는 것을 보여줄 것입니다 . 그래서 당신은 하나 또는 다른 것을 할 수 없습니다!
Trevor Boyd Smith

작동하지 않았다, 그러나 당신은 ;-) 아이디어를 주셔서 감사합니다, 그래서 일한 나에게 내 미디어 플레이어를 죽일 생각을주고,
PJ 검은 머리를

18

"losetup -a"를 사용하여 파일 시스템의 파일에 매핑 된 개방 루프 장치를 확인합니다. lsof 또는 fuser로 표시되지 않습니다.


1
바로 그거죠! 문제의 파티션에있는 .iso 파일에 루프 장치를 마운트했습니다. 는 umount -l /data나중에 마운트 해제 - FS 사라 - 실제로 일을 /dev/loop0하고 /dev/loop1잠시 동안 교수형. 하지만 지금은 괜찮은 것 같습니다. 그것이 알고 있었다 사람들을 돕기 때문에이 대답은 매우 중요 lsof하고 fuser연령대에 ...
토마스 Gandor

이것이 제게 핵심이었습니다. 제 경우에는 docker devicemapper 스토리지 드라이브가 /dev/loop0 /dev/loop1루프 장치를 생성했습니다 . 내가 그들을 제거 할 수있는 유일한 방법 dmsetup ls 은 의심스러운 docker devicemapper 장치 docker-253 : 0-4291588-pool을 사용하여 장치를 나열하는 것 입니다. dmsetup remove docker-253:0-4291588-pool깨끗하게 없애있어
robododge

16

또한 확인하십시오 /etc/exports. NFS를 통해 마운트 지점 내 경로를 내보내는 경우 마운트 해제를 시도 할 때이 오류가 발생하고 fuser또는에 아무것도 표시되지 않습니다 lsof.


우리의 경우 그것은 우리의 문제였습니다.
raulsaeztapia 2014

1
왜 나타나지 않습니까? 이것은 nfs가 부분적으로 커널에 있기 때문입니까? (완전한 사용자 공간과는 대조적으로)
hbogert

9
lsof +f -- /mountpoint

(/ mountpoint에 마운트 된 마운트의 파일을 사용하는 프로세스를 나열합니다. 특히 마운트 된 USB 스틱 또는 CD / DVD를 사용중인 프로세스를 찾는 데 유용합니다.


이것은 현재 작업 디렉토리가 루프 장치 마운트의 AUTOCLEAR를 방해하는 프로세스를 찾는 데 도움이되었습니다. fuser또는 표준에 나열되지 않았습니다 lsof.
Tom Hale

더 나은 사용하는 것 /dev/<device>보다는 /mountpoint같은 /mountpoint애프터 사라집니다 umount -l.
Tom Hale

7

lsof와 fuser는 실제로 특정 파일을 열어 두는 프로세스를 찾는 두 가지 방법입니다. umount가 성공하도록하려면 -f 및 -l 옵션을 조사해야합니다.


1
최근에이 문제가 발생했으며 fuser 또는 lsof는 장치를 사용하여 아무것도 표시하지 않지만 umount -l을 사용하여 마운트 해제 할 수있었습니다. 적어도 (-l은 Lazy Unmount를 의미하고, 파일 시스템 계층 구조에서 파일 시스템을 지금 분리하고, 더 이상 바쁘지 않으면 파일 시스템에 대한 모든 참조를 정리합니다.)
Jeff Welling

5

이것이 바로 "fuser -m / mount / point"가 존재하는 이유입니다.

BTW, "fuser"또는 "lsof"가 커널 모듈이 리소스를 보유하는시기를 나타내지는 않는다고 생각합니다. 일반적으로 그 문제는 발생하지 않습니다.


8
하지만 이것이 내가 가진 문제인 것 같습니다. 어떻게 이것을 디버그합니까?
K3 --- rnc

2

lsof와 퓨저도 나에게 아무것도주지 않았다.

가능한 모든 디렉토리의 이름을 .old로 바꾸고 변경 한 후 매번 시스템을 재부팅하는 과정을 거친 후 책임이있는 특정 디렉토리 (접미사 관련)를 찾았습니다.

SDCARD 기반 루트 파일 시스템 (Sheeva Plug)에서 디스크 쓰기를 최소화하기 위해 / var / spool / postfix에서 / disk2 / pers / mail / postfix / varspool로 심볼릭 링크를 만든 적이 있습니다.

이 심볼릭 링크를 사용하면 postfix 및 dovecot 서비스를 중지 한 후에도 (ps aux 및 netstat -tuanp 모두 관련 항목을 표시하지 않음) / disk2 / pers를 마운트 해제 할 수 없습니다.

심볼릭 링크를 제거하고 / disk2 / pers /의 새 디렉토리를 직접 가리 키도록 postfix 및 dovecot 구성 파일을 업데이트했을 때 성공적으로 서비스를 중지하고 디렉토리를 마운트 해제 할 수있었습니다.

다음 번에는 다음의 결과를 더 자세히 살펴 보겠습니다.

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

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


실제로 기호 링크 (내 명령의 ^ l)를 찾고 있는데, 명령이 더 빠를 수 있지만 동일한 효과가 없습니다.
보안 문자

도 ... 그건 내가 명령을 입력했기 때문입니다. 그것은find /var -lname *disk2*
womble

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]

이들은 가장 애매한 유형의 포켓몬이며 lsofTYPE열에 다음과 같이 표시됩니다 a_inode( lsofman 페이지에 문서화되지 않음).

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

lsof | grep a_inode

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


1

열려있는 파일이있는 모든 서비스 및 프로세스를 중지 한 후에도 장치를 마운트 해제하거나 다시 마운트 할 수없는 경우 장치를 계속 사용하는 스왑 파일 또는 스왑 파티션이있을 수 있습니다. 이것은로 표시되지 않습니다 fuserlsof. 다음으로 스와핑 끄기 :

sudo swapoff -a

미리 확인하고 다음을 사용하여 스왑 파티션 또는 스왑 파일의 요약을 표시 할 수 있습니다.

swapon -s

또는:

cat /proc/swaps

명령을 사용하는 대신 sudo swapoff -a서비스 또는 systemd 장치 를 중지하여 스왑을 비활성화 할 수도 있습니다 . 예를 들면 :

sudo systemctl stop dphys-swapfile

또는:

sudo systemctl stop var-swap.swap

필자의 경우에는 쓰기 위해 파일이 열려있는 서비스와 프로세스를 중지하는 것 외에도 스왑을 끄는 것이 필요했기 때문에 fsck재부팅하지 않고 루트 파티션 에서 실행하기 위해 루트 파티션을 읽기 전용으로 다시 마운트 할 수있었습니다 . 이것은 Raspbian Jessie를 실행하는 Raspberry Pi에서 필요했습니다.


0

마운트 해제하려는 파일 시스템에 마운트 된 파일 시스템 target is busy은 사용중인 파일 외에도 오류를 유발할 수 있습니다 . (예를 들어 거기 mount -o bind /dev /mnt/yourmount/dev에서 사용하기 위해 chroot.)

파일 시스템에 마운트 된 파일 시스템을 찾으려면 다음을 실행하십시오.

mount | grep '/mnt/yourmount'

사용중인 파일을 찾으려면 여기에서 다른 사용자가 이미 제안한 조언을 참조하십시오.

lsof | grep '/mnt/yourmount'

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