기피 umount -l
글을 쓰는 시점에서 가장 인기있는 답변은을 사용하는 것이 좋습니다 umount -l
.
umount -l
위험하거나 안전하지 않습니다 . 요약해서 말하자면:
- 실제로 장치를 마운트 해제하지 않고 네임 스페이스에서 파일 시스템을 제거합니다. 파일을 쓰기 위해 계속 쓸 수 있습니다.
- btrfs 파일 시스템 손상을 일으킬 수 있습니다
해결 방법 / 대안
유용한 동작은 절대 경로 이름 으로umount -l
파일 시스템에 액세스하지 못하도록하여 추가 moutpoint 사용을 최소화하는 것입니다.
000
마운트 해제 할 디렉토리에 대한 권한이있는 빈 디렉토리를 마운트하면 동일한 동작을 수행 할 수 있습니다 .
그런 다음 마운트 지점 아래의 파일 이름에 대한 새로운 액세스는 권한이없는 새로 겹쳐진 디렉토리에 도달합니다. 따라서 마운트 해제에 대한 새 차단기가 방지됩니다.
먼저 시도 remount,ro
잠금 해제해야 할 주요 마운트 해제 업적은 읽기 전용 마운트입니다. remount,ro
배지를 받으면 다음 을 알게됩니다.
- 보류중인 모든 데이터가 디스크에 기록되었습니다
- 향후 모든 쓰기 시도가 실패합니다
- 장치를 물리적으로 분리해야하는 경우 데이터가 일관된 상태입니다.
mount -o remount,ro /dev/device
쓰기 위해 열린 파일이 있으면 실패 할 것이므로 똑바로 시도하십시오. 운이 좋을 수도 있습니다, 펑크!
운이 좋지 않은 경우 파일을 쓰기 위해 열린 프로세스 에만 집중하십시오 .
lsof +f -- /dev/<devicename> | awk 'NR==1 || $4~/[0-9]+[uw -]/'
그런 다음 장치를 읽기 전용으로 다시 마운트하고 일관성있는 상태를 유지할 수 있어야합니다.
이 시점에서 읽기 전용을 다시 마운트 할 수 없으면 여기에 나열된 다른 가능한 원인 중 일부를 조사 하십시오 .
읽기 전용 다시 마운트 업적 잠금 해제 🔓☑
축하합니다. 이제 마운트 지점의 데이터가 일관되고 향후 쓰기로부터 보호됩니다.
왜 fuser
열등한가lsof
왜 fuser
일찍 사용하지 않습니까? 글쎄, 당신은 할 수는 있지만 장치가 아닌 디렉토리 에서 fuser
작동 하므로 파일 이름 공간에서 마운트 포인트를 제거하고 여전히 사용 하려면 다음을 수행해야합니다.fuser
- 마운트 지점
mount -o bind /media/hdd /mnt
을 다른 위치로 임시 복제
- 원래 마운트 지점을 숨기고 네임 스페이스를 차단하십시오.
방법은 다음과 같습니다.
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"
그러면 다음과 같은 결과가 나타납니다.
- 원래 네임 스페이스가 숨겨져 있습니다 (더 이상 파일을 열 수 없으며 문제가 악화되지 않습니다)
- 실행할 복제 바인드 마운트 디렉토리 (장치와 반대)
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
그로 인해 의미가 있습니다. 기본적으로 마운트 지점이 /
파일 시스템 아래에 마운트되어 있으면 이것을 피하고 싶을 것입니다.