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

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

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

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



답변

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

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

노트:

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

답변

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

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

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

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


답변

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


답변

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

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

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


답변

기피 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그로 인해 의미가 있습니다. 기본적으로 마운트 지점이 /파일 시스템 아래에 마운트되어 있으면 이것을 피하고 싶을 것입니다.


답변

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


답변

체크 아웃 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가 적절하게 설정됩니다.