사용중인 장치를 마운트 해제하는 방법


246

매일 여러 사용자가 액세스하는 삼바 드라이브가 있습니다. 이미 SQL 테이블에서 공유 드라이브를 인식하고 모든 사용자가 액세스 할 수있는 특수 디렉토리에 마운트하는 코드가 있습니다.

SQL 테이블에서 드라이브를 제거하면 (효과적으로 오프라인 상태로 전환하는 경우) 사용중인 장치를 마운트 해제하는 방법 또는 방법이 무엇인지 알고 싶습니다. 지금까지 나는 어떤 형태의 umount것도 작동하지 않는다는 것을 알았 습니다.

데이터 삭제 가능성 무시-현재 읽고있는 장치를 마운트 해제 할 수 있습니까?


3
언 마운트에 실패 더 많은 원인을 해결 더 일반적인 대답은 여기에서 발견된다 oletange.blogspot.dk/2012/04/umount-device-is-busy-why.html
올레 단게

2
안녕하세요, 아마도 cddir을 마운트 한 다음 루트 또는 로그인이되어 다시 다른 쉘이 갇히게됩니다. 수행 exit모든 쉘에.
Smeterlink

답변:


458

예!! 사용중인 장치를 사용하지 않고 강제로 마운트 해제 할 수없는 경우에도 즉시 사용중인 장치를 분리 할 수 ​​있습니다. 나중에 정리할 수 있습니다.

umount -l /PATH/OF/BUSY-DEVICE
umount -f /PATH/OF/BUSY-NFS(NETWORK-FILE-SYSTEM)

노트:

  1. 이러한 명령은 실행중인 프로세스를 방해하거나 데이터 손실 또는 열린 파일 손상을 유발할 수 있습니다. 대상 DEVICE / NFS 파일에 액세스하는 프로그램은 강제 마운트 해제 후 오류가 발생하거나 제대로 작동하지 않을 수 있습니다.
  2. 마운트 된 폴더 / 드라이브 / 장치 내부에없는 경우이 명령을 실행하십시오.

22
참고 : -l여기에는 소문자가 있습니다 L( "게으른 마운트 해제"). ( 이 관련 답변을 참조하십시오 .)
ジ ョ ー ジ

4
일했다. FTP 클라이언트를 통해 로그인 한 경우 폴더를 마운트 해제하려면 로그 아웃해야합니다.
Alexander Kim

그들은 작동하지 않습니다. 그들은 둘 다 영원히 매달려 있습니다. (Debian 8, cifs-utils 2 : 6.4-1)
Hubro


1
무섭다. 다른 프로세스가 여전히 액세스하는 동안 지연 마운트 해제 후 다시 마운트했습니다. 그래서 나는 그것을 같은 위치에 두 번 장착했다고 생각합니까? 그게 뭔지 잘 모르겠습니다.
sudo

120

가능하면 사용중인 프로세스를 찾아서 식별하고 프로세스를 종료 한 다음 삼바 공유를 마운트 해제하여 손상을 최소화하십시오.

  • lsof | grep '<mountpoint of /dev/sda1>' (또는 장착 된 장치가 무엇이든)

  • pkill target_process(이름별로 바쁘게 진행되는 프로세스를 종료합니다. | kill PID| killall target_process)

  • umount /dev/sda1 (또는 장착 된 장치가 무엇이든)


6
그것은 아무것도 반환하지 않습니다. 네트워크 드라이브이므로 드라이브에 액세스하는 다른 컴퓨터의 프로세스를 볼 수 없기 때문에 가정하고 있습니다. "fuser"명령도 마찬가지입니다.
최대

오 지옥 ... 당신은 삼바 명령이 필요합니다 ... / usr / bin / smbclient service <password> : 이것이 시작되는지 확인하십시오 ... tldp.org/HOWTO/SMB-HOWTO-8.html
Frank Tudor

2
smb 명령은 실제로 더 이상 사용되지 않으며 "umount.cifs"로 대체되었습니다. 작동하지 않습니다. 바쁘신 동안 나는 마운트 할 수없는 것으로 붙어 있습니다.
Max

Asuswrt-Merlin을 사용하는 경우 다음을 설치해야합니다 lsof.# opkg install lsof
Tonatio

1
결과를 얻으려면 lsof를 sudo해야합니다
aheigins

78

마운트를 해제 할 때 마운트 된 장치에 있지 않은지 확인하십시오.


4
정확히, 터미널에서 현재 폴더 (대상 장치에 위치)를 열어 놓은 것 (예 : cd 명령을 통해)은 프로세스를 중지하기 위해 대기합니다.)
jave.web

2
네, 장치의 디렉토리에서 셸을 실행했습니다. 터미널 창 봐라 폐쇄
sh78

또한, 마운트하려는 다른 마운트 지점이 없는지 확인하십시오 umount.
victe

@victe 감사합니다; Solaris 11에서 pfexec mount -F vboxfs carpetacompartida ~ / Documents를 사용하여 폴더를 뮤팅하고있었습니다. 그러나 문서에는 하위 폴더가 있었고 문제였습니다.
Dani Aya

44

다음을 시도하지만 실행하기 전에이 점을 유의 -k플래그가 바쁜 장치를 유지하는 실행중인 프로세스를 종료합니다.

-i플래그 차종은 fuser사망 전에 부탁드립니다.

fuser -kim /address  # kill any processes accessing file
unmount /address

5
lsof | grep '/dev/<my-device>아무것도 반환하지 않았지만 이것은 훌륭하게 작동합니다! fuser -m /dev/<my-device>프로세스를 종료하기 전에 프로세스를 찾으려면 제안 할 수도 있습니다.
modulitos

3
퓨저 명령을 실행하면 VPS에서 즉시 연결이 끊어졌습니다.
giorgio79

21

기피 umount -l

글을 쓰는 시점에서 가장 인기있는 답변은을 사용하는 것이 좋습니다 umount -l.

umount -l위험하거나 안전하지 않습니다 . 요약해서 말하자면:

  • 실제로 장치를 마운트 해제하지 않고 네임 스페이스에서 파일 시스템을 제거합니다. 파일을 쓰기 위해 계속 쓸 수 있습니다.
  • btrfs 파일 시스템 손상을 일으킬 수 있습니다

해결 방법 / 대안

유용한 동작은 절대 경로 이름 으로umount -l 파일 시스템에 액세스하지 못하도록하여 추가 moutpoint 사용을 최소화하는 것입니다.

000마운트 해제 할 디렉토리에 대한 권한이있는 빈 디렉토리를 마운트하면 동일한 동작을 수행 할 수 있습니다 .

그런 다음 마운트 지점 아래의 파일 이름에 대한 새로운 액세스는 권한이없는 새로 겹쳐진 디렉토리에 도달합니다. 따라서 마운트 해제에 대한 새 차단기가 방지됩니다.

먼저 시도 remount,ro

잠금 해제해야 할 주요 마운트 해제 업적은 읽기 전용 마운트입니다. remount,ro배지를 받으면 다음 을 알게됩니다.

  1. 보류중인 모든 데이터가 디스크에 기록되었습니다
  2. 향후 모든 쓰기 시도가 실패합니다
  3. 장치를 물리적으로 분리해야하는 경우 데이터가 일관된 상태입니다.

mount -o remount,ro /dev/device 쓰기 위해 열린 파일이 있으면 실패 할 것이므로 똑바로 시도하십시오. 운이 좋을 수도 있습니다, 펑크!

운이 좋지 않은 경우 파일을 쓰기 위해 열린 프로세스 에만 집중하십시오 .

lsof +f -- /dev/<devicename> | awk 'NR==1 || $4~/[0-9]+[uw -]/'

그런 다음 장치를 읽기 전용으로 다시 마운트하고 일관성있는 상태를 유지할 수 있어야합니다.

이 시점에서 읽기 전용을 다시 마운트 할 수 없으면 여기에 나열된 다른 가능한 원인 중 일부를 조사 하십시오 .

읽기 전용 다시 마운트 업적 잠금 해제 🔓☑

축하합니다. 이제 마운트 지점의 데이터가 일관되고 향후 쓰기로부터 보호됩니다.

fuser열등한가lsof

fuser일찍 사용하지 않습니까? 글쎄, 당신은 할 수는 있지만 장치가 아닌 디렉토리 에서 fuser작동 하므로 파일 이름 공간에서 마운트 포인트를 제거하고 여전히 사용 하려면 다음을 수행해야합니다.fuser

  1. 마운트 지점 mount -o bind /media/hdd /mnt을 다른 위치로 임시 복제
  2. 원래 마운트 지점을 숨기고 네임 스페이스를 차단하십시오.

방법은 다음과 같습니다.

null_dir=$(sudo mktemp --directory --tmpdir empty.XXXXX")
sudo chmod 000 "$null_dir"

# A request to remount,ro will fail on a `-o bind,ro` duplicate if there are
# still files open for writing on the original as each mounted instance is
# checked.  https://unix.stackexchange.com/a/386570/143394
# So, avoid remount, and bind mount instead:
sudo mount -o bind,ro "$original" "$original_duplicate"

# Don't propagate/mirror the empty directory just about hide the original
sudo mount --make-private "$original_duplicate"

# Hide the original mountpoint
sudo mount -o bind,ro "$null_dir" "$original"

그러면 다음과 같은 결과가 나타납니다.

  1. 원래 네임 스페이스가 숨겨져 있습니다 (더 이상 파일을 열 수 없으며 문제가 악화되지 않습니다)
  2. 실행할 복제 바인드 마운트 디렉토리 (장치와 반대) fuser.

이것은 더욱 복잡 하지만 [1] 을 사용할 수 있습니다 :

fuser -vmMkiw <mountpoint>

파일을 쓰기 위해 열린 상태에서 프로세스를 중단하도록 대화식으로 요청합니다. 물론, 마운트 지점을 전혀 숨기지 umount -l않고 위의 모방 을 할 수 있지만 위험은 없습니다.

-w스위치 프로세스를 작성하는 제한합니다, 그리고는 -i당신이 당신이 후 사용할 수 서둘러 있다면, 읽기 전용 다시 마운트 그래서 후, 대화 형 :

fuser -vmMk <mountpoint>

마운트 포인트 아래에 파일이 열려있는 나머지 모든 프로세스를 종료합니다.

이 시점에서 장치를 마운트 해제 할 수 있기를 바랍니다. umount모드 000디렉토리를 맨 위에 마운트하여 마운트 한 경우 마운트 지점에서 두 번 실행해야합니다 .

또는 사용하십시오 :

fuser -vmMki <mountpoint>

마운트 해제를 차단하는 나머지 읽기 전용 프로세스를 대화식으로 종료합니다.

젠장, 난 아직도 얻는다 target is busy!

열린 파일 만이 마운트 해제 차단기가 아닙니다. 다른 원인과 해결 방법 은 여기여기 를 참조 하십시오 .

장치를 완전히 마운트 해제하지 못하게하는 숨어있는 gremlin이 있어도 최소한 파일 시스템이 일관된 상태에 있습니다.

그런 다음 lsof +f -- /dev/device파일 시스템을 포함하는 장치에서 열린 파일이있는 모든 프로세스를 나열한 다음 종료 할 수 있습니다 .


[1] 사용하는 것이 덜 복잡 mount --move하지만, mount --make-private /parent-mount-point그로 인해 의미가 있습니다. 기본적으로 마운트 지점이 /파일 시스템 아래에 마운트되어 있으면 이것을 피하고 싶을 것입니다.


1
--lazy너무 위험한 경우 umount맨 페이지에 경고만큼 많은 것이없는 이유는 무엇입니까? " 게으른 마운트 해제입니다. 이제 파일 시스템에서 파일 시스템을 분리하고 더 이상 사용하지 않는
즉시이

7

exportfs -v를 사용하여 내 보낸 NFS 파일 시스템을 확인하십시오. 발견되면 exportfs -d share : / directory로 제거하십시오. 이들은 퓨저 / lsof 목록에 표시되지 않으며 umount가 성공하지 못하게 할 수 있습니다.


1
이 조언에 감사드립니다. 잠금을 제거하려면 exportfs -ua를 사용해야했습니다.
FuePi

6

체크 아웃 umount2:

Linux 2.1.116에는 umount ()와 같이 umount2 () 시스템 호출이 추가되어 대상을 마운트 해제하지만 작업 동작을 제어하는 ​​추가 플래그를 허용합니다.

MNT_FORCE (Linux 2.1.116부터) 바쁘더라도 강제 마운트 해제. (NFS 마운트에만 해당) MNT_DETACH (Linux 2.4.11부터) 지연 마운트 해제 수행 : 새 액세스에 마운트 포인트를 사용할 수 없게하고 마운트 포인트가 사용 중이 아닐 때 마운트 해제를 실제로 수행하십시오. MNT_EXPIRE (Linux 2.6.8부터) 마운트 포인트를 만료 된 것으로 표시하십시오. 마운트 포인트가 현재 사용 중이 아닌 경우이 플래그를 사용하여 umount2 ()에 대한 초기 호출은 오류 EAGAIN과 함께 실패하지만 마운트 포인트가 만료 된 것으로 표시합니다. 마운트 포인트는 프로세스에 의해 액세스되지 않는 한 만료 된 상태로 유지됩니다. MNT_EXPIRE를 지정하는 두 번째 umount2 () 호출은 만료 된 마운트 포인트를 마운트 해제합니다. 이 플래그는 MNT_FORCE 또는 MNT_DETACH로 지정할 수 없습니다. 반환 값

성공하면 0이 반환됩니다. 오류가 발생하면 -1이 반환되고 errno가 적절하게 설정됩니다.


불행히도 이것들은 NFS 마운트가 아니라 CIFS입니다. 그래도 MNT_DETACH를 시도합니다. 그러나 umount -l이 작동하지 않으면 이것이 크게 다르다는 것을 상상할 수 없습니다. 그래도 고마워!
Max

2

누군가 터미널을 사용 중이고 현재 디렉토리가 마운트 해제하려는 경로 안에 있으면 오류가 발생한다고 언급했습니다.
보완적인 경우,이 경우 lsof | grep path-to-be-unmounted아래 출력이 있어야합니다.

bash ... path-to-be-unmounted

1

작동하는 다른 대안은 편집 /etc/fstab, noauto플래그 추가 및 시스템 재부팅입니다. 장치가 마운트되지 않으며, 아무 작업을 마치면 플래그를 제거하고 다시 부팅하십시오.


0

틈새 답변 :

해당 장치에 zfs 풀이있는 경우 적어도 파일 기반 풀인 lsof경우 사용법이 표시되지 않습니다. 그러나 당신은 단순히 실행할 수 있습니다

sudo zpool export mypoo

그런 다음 마운트를 해제하십시오.

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