Uniknąć umount -l
W momencie pisania odpowiedzi najlepiej głosująca zaleca użycie umount -l
.
umount -l
jest niebezpieczne lub w najlepszym razie niebezpieczne . W podsumowaniu:
- W rzeczywistości nie odmontowuje urządzenia, po prostu usuwa system plików z przestrzeni nazw. Zapisy do otwierania plików można kontynuować.
- Może to spowodować uszkodzenie systemu plików btrfs
Obejść / alternatywa
Przydatnym zachowaniem umount -l
jest ukrywanie systemu plików przed dostępem przez bezwzględne nazwy ścieżek, minimalizując w ten sposób dalsze użycie moutpointów.
To samo zachowanie można osiągnąć, montując pusty katalog z uprawnieniami 000
do odmontowania katalogu.
Wówczas wszelkie nowe dostępy do nazw plików poniżej punktu montowania trafią do nowo nałożonego katalogu z zerowymi uprawnieniami - w ten sposób zapobiega się nowym blokerom odmontowania.
Najpierw spróbuj remount,ro
Najważniejszym osiągnięciem odmontowanym do odblokowania jest ponowne zamontowanie tylko do odczytu. Po zdobyciu remount,ro
odznaki wiesz, że:
- Wszystkie oczekujące dane zostały zapisane na dysku
- Wszystkie przyszłe próby zapisu zakończą się niepowodzeniem
- Dane są w spójnym stanie, jeśli musisz fizycznie odłączyć urządzenie.
mount -o remount,ro /dev/device
z pewnością zawiedzie, jeśli istnieją pliki do zapisu , więc spróbuj tego od razu. Możesz mieć szczęście, punku!
Jeśli masz pecha, skup się tylko na procesach z plikami otwartymi do zapisu :
lsof +f -- /dev/<devicename> | awk 'NR==1 || $4~/[0-9]+[uw -]/'
Powinieneś być w stanie ponownie zamontować urządzenie tylko do odczytu i zapewnić spójny stan.
Jeśli w tym momencie nie możesz ponownie zamontować tylko do odczytu, sprawdź inne możliwe przyczyny wymienione tutaj .
Osiągnięcie ponownego montażu tylko do odczytu odblokowane 🔓☑
Gratulacje, Twoje dane w punkcie montowania są teraz spójne i chronione przed przyszłym zapisem.
Dlaczego fuser
jest gorszy odlsof
Dlaczego nie skorzystać z użycia fuser
wcześniej? Cóż, możesz mieć, ale fuser
działa na katalogu , a nie na urządzeniu , więc jeśli chcesz usunąć punkt montowania z przestrzeni nazw plików i nadal używać fuser
, musisz:
- Tymczasowo zduplikuj punkt montowania za pomocą
mount -o bind /media/hdd /mnt
do innej lokalizacji
- Ukryj oryginalny punkt montowania i zablokuj przestrzeń nazw:
Oto jak:
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"
Miałbyś wtedy:
- Oryginalna przestrzeń nazw ukryta (nie można otworzyć więcej plików, problem nie może się pogorszyć)
- Duplikat zamontowanego katalogu powiązania (w przeciwieństwie do urządzenia), na którym ma zostać uruchomiony
fuser
.
Jest to bardziej skomplikowane [1] , ale umożliwia użycie:
fuser -vmMkiw <mountpoint>
który interaktywnie poprosi o zabicie procesów z plikami otwartymi do zapisu. Oczywiście możesz to zrobić bez ukrywania punktu montowania, ale powyższe naśladowania umount -l
, bez żadnego niebezpieczeństwa.
Do -w
ogranicza przełączyć się do procesów, a pisanie -i
jest interaktywny, więc po read-only Remount, jeśli jesteś on pośpiechu można następnie użyć:
fuser -vmMk <mountpoint>
aby zabić wszystkie pozostałe procesy z plikami otwartymi pod punktem montowania.
Mam nadzieję, że w tym momencie możesz odmontować urządzenie. (Będziesz musiał uruchomić umount
się na punkcie montowania dwa razy, jeśli powiązałeś zamontowany 000
katalog trybu na górze.)
Albo użyj:
fuser -vmMki <mountpoint>
interaktywnie zabijać pozostałe procesy tylko do odczytu blokujące odmontowanie.
Cholera, wciąż dostaję target is busy
!
Otwarte pliki to nie jedyny odmontowany bloker. Zobacz tutaj i tutaj aby poznać inne przyczyny i ich rozwiązania.
Nawet jeśli masz jakiegoś czającego się gremlina, który uniemożliwia ci całkowite odmontowanie urządzenia, przynajmniej masz system plików w spójnym stanie.
Następnie można użyć lsof +f -- /dev/device
do wyświetlenia listy wszystkich procesów z otwartymi plikami na urządzeniu zawierającym system plików, a następnie zabić je.
[1] Jest mniej skomplikowany w użyciu mount --move
, ale wymaga mount --make-private /parent-mount-point
to pewnych konsekwencji . Zasadniczo, jeśli punkt montowania jest zamontowany w /
systemie plików, należy tego uniknąć.