Jak odmontować zajęte urządzenie

245

Mam dyski samby, do których codziennie ma dostęp wielu użytkowników. Mam już kod do rozpoznawania udostępnionych dysków (z tabeli SQL) i montowania ich w specjalnym katalogu, w którym wszyscy użytkownicy mogą uzyskać do nich dostęp.

Chcę wiedzieć, jeśli usunę dysk ze swojej tabeli SQL (skutecznie przełączając go w tryb offline), w jaki sposób, a nawet czy istnieje sposób na odmontowanie zajętego urządzenia? Do tej pory odkryłem, że żadna forma umountnie działa.

Ignorując możliwość zniszczenia danych - czy można odmontować urządzenie, które jest obecnie odczytywane?

Max
źródło
3
Bardziej ogólną odpowiedź dotyczącą większej liczby przyczyn niepowodzenia umount można znaleźć tutaj oletange.blogspot.dk/2012/04/umount-device-is-busy-why.html
Ole Tange
2
Cześć, prawdopodobnie ty cdzamontowałeś katalog, potem zostałeś rootem lub zaloguj się ponownie, a druga powłoka została uwięziona. Zrób exitna wszystkich muszlach.
Smeterlink

Odpowiedzi:

457

TAK!! Istnieje sposób na natychmiastowe odłączenie zajętego urządzenia (nawet jeśli jest zajęte i nie można go odmontować na siłę). Możesz wyczyścić wszystko później:

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

UWAGA:

  1. Te polecenia mogą zakłócić uruchomiony proces, spowodować utratę danych LUB uszkodzić otwarte pliki. Programy uzyskujące dostęp do docelowych plików DEVICE / NFS mogą zgłaszać błędy LUB mogą nie działać poprawnie po wymuszonym odmontowaniu.
  2. Spróbuj wykonać te polecenia, gdy NIE znajdują się one w zamontowanym folderze / napędzie / urządzeniu.
Amit Verma
źródło
22
Uwaga: -ltutaj jest mała litera L(dla „leniwego odmontowywania”). (Zobacz tę pokrewną odpowiedź .)
ジ ョ ー ジ
4
Pracował Jeden niuans, jeśli jesteś zalogowany za pomocą klienta FTP, musisz się wylogować, aby pomyślnie odmontować folder.
Alexander Kim
Nie działają. Oboje wiszą na zawsze. (Debian 8, cifs-utils 2: 6.4-1)
Hubro,
1
-l/ --lazyNie będzie uszkodzonych Otwarte pliki, ale na Linux wydaje się , że nie może wiedzieć, kiedy urządzenie jest faktycznie odmontowana i mogą zostać usunięte
Tom Hale
1
Trochę straszne. Leniwie odmontowałem, a potem ponownie zamontowałem, gdy niektóre inne procesy nadal miały do ​​niego dostęp. Więc chyba zamontowałem go dwa razy w tym samym miejscu? Nie jestem pewien, co to zrobiło.
sudo
120

Jeśli to możliwe, zlokalizujmy / zidentyfikuj zajęty proces, zabij proces, a następnie odmontuj udział samby, aby zminimalizować uszkodzenia.

  • lsof | grep '<mountpoint of /dev/sda1>' (lub cokolwiek to jest zamontowane urządzenie)

  • pkill target_process(zabija zajętych proc. według nazwy | kill PID| killall target_process)

  • umount /dev/sda1 (lub cokolwiek to jest zamontowane urządzenie)

Frank Tudor
źródło
6
To nic nie zwraca. Zakładam, że to dlatego, że jest to dysk sieciowy i nie widzę procesów innych komputerów uzyskujących dostęp do dysku. To samo dotyczy poleceń „utrwalacza”.
Maks.
och, do diabła ... potrzebujesz komend samby ... / usr / bin / smbclient service <hasło>: Sprawdź, czy to cię uruchomi ... tldp.org/HOWTO/SMB-HOWTO-8.html
Frank Tudor
2
Komendy smb zostały w rzeczywistości przestarzałe i zastąpione przez „umount.cifs” .... co również nie działa. Wygląda na to, że utknąłem w sytuacji, gdy nie byłem w stanie się umountować, gdy jest zajęty.
Maks.
Jeśli używasz Asuswrt-Merlin, musisz zainstalować lsof:# opkg install lsof
Tonatio
1
musisz sudo lsof, aby uzyskać wyniki
aheigins
78

Upewnij się, że nadal nie jesteś w zamontowanym urządzeniu, gdy próbujesz odmontować.

Luci
źródło
4
Dokładnie, po prostu otwarcie bieżącego folderu (znajdującego się na urządzeniu docelowym) w terminalu (np. Za pomocą polecenia cd) pozwala zatrzymać proces odmontowywania :)
jave.web
2
Tak, miałem powłokę uruchomioną w katalogu na urządzeniu.
Zamknął
Upewnij się również, że nie ma żadnych innych punktów montowania wewnątrz tego, który próbujesz umount.
zwycięż
@victe Thanks; Moutowałem folder przy użyciu pfexec mount -F vboxfs carpetacompartida ~ / Documents na Solaris 11; ale Dokumenty miały podfoldery i to był problem.
Dani Aya
44

Spróbuj wykonać następujące czynności, ale przed uruchomieniem zwróć uwagę, że -kflaga zabije wszystkie uruchomione procesy, utrzymując urządzenie w ruchu.

Te -imarki flag fuserzapytać przed zabiciem.

fuser -kim /address  # kill any processes accessing file
unmount /address
użytkownik3751769
źródło
5
lsof | grep '/dev/<my-device>nic nie zwróciło, ale działa świetnie! Może również zasugerować fuser -m /dev/<my-device>na wypadek, gdybyś chciał poznać proces przed jego zabiciem.
modulitos
3
Uruchomienie polecenia utrwalacza natychmiast rozłączyło mnie z VPS.
giorgio79
21

Uniknąć umount -l

W momencie pisania odpowiedzi najlepiej głosująca zaleca użycie umount -l.

umount -ljest 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 -ljest 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 000do 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,roodznaki wiesz, że:

  1. Wszystkie oczekujące dane zostały zapisane na dysku
  2. Wszystkie przyszłe próby zapisu zakończą się niepowodzeniem
  3. 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 fuserjest gorszy odlsof

Dlaczego nie skorzystać z użycia fuserwcześniej? Cóż, możesz mieć, ale fuserdział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:

  1. Tymczasowo zduplikuj punkt montowania za pomocą mount -o bind /media/hdd /mntdo innej lokalizacji
  2. 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:

  1. Oryginalna przestrzeń nazw ukryta (nie można otworzyć więcej plików, problem nie może się pogorszyć)
  2. 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 -wogranicza przełączyć się do procesów, a pisanie -ijest 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ć umountsię na punkcie montowania dwa razy, jeśli powiązałeś zamontowany 000katalog 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/devicedo 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-pointto pewnych konsekwencji . Zasadniczo, jeśli punkt montowania jest zamontowany w /systemie plików, należy tego uniknąć.

Tom Hale
źródło
1
Jeśli --lazyjest tak niebezpieczny, dlaczego na umountstronie podręcznika nie ma tak ostrzeżenia ? Mówi tylko: „ Leniwy odmontuj. Odłącz teraz system plików od hierarchii plików i wyczyść wszystkie odniesienia do tego systemu plików, jak tylko nie będzie on już zajęty.
bitinerant
7

Sprawdź eksportowane systemy plików NFS za pomocą exportfs -v. Jeśli znaleziono, usuń katalog exportfs -d share: /. Nie pojawiają się one na liście fuser / lsof i mogą uniemożliwić sukces umount.

numberer6
źródło
1
Dziękuję za tę radę. Musiałem użyć exportfs -ua, aby usunąć blokadę.
FuePi
6

Sprawdź umount2:

Linux 2.1.116 dodał wywołanie systemowe umount2 (), które, podobnie jak umount (), odmontowuje cel, ale pozwala na dodatkowe flagi kontrolujące zachowanie operacji:

MNT_FORCE (od Linuksa 2.1.116) Wymuś odmontowanie, nawet jeśli jest zajęty. (Tylko dla montowań NFS.) MNT_DETACH (od Linuksa 2.4.11) Wykonaj leniwy odmontowanie: ustaw punkt montowania niedostępny dla nowych dostępów i faktycznie wykonaj odmontowanie, gdy punkt montowania przestanie być zajęty. MNT_EXPIRE (od Linuksa 2.6.8) Oznacz punkt instalacji jako wygasły. Jeśli punkt montowania nie jest obecnie używany, wówczas pierwsze wywołanie umount2 () z tą flagą kończy się niepowodzeniem z błędem EAGAIN, ale oznacza punkt montowania jako wygasły. Punkt montowania wygasa, o ile żaden proces nie uzyska do niego dostępu. Drugie wywołanie umount2 () określające MNT_EXPIRE odmontowuje wygasły punkt montowania. Tej flagi nie można określić za pomocą MNT_FORCE ani MNT_DETACH. Zwracana wartość

Po sukcesie zwracane jest zero. W przypadku błędu zwracane jest -1 i odpowiednio ustawiane errno.

chown
źródło
Niestety nie są to montowania NFS, ale CIFS. Spróbuję jednak MNT_DETACH. Jeśli jednak umount -l nie zadziała, nie wyobrażam sobie, że byłoby inaczej. W każdym razie dzięki!
Maks.
2

Ktoś wspomniał, że jeśli używasz terminala, a bieżący katalog znajduje się w ścieżce, którą chcesz odmontować, otrzymasz błąd.
Jako uzupełnienie, w tym przypadku, lsof | grep path-to-be-unmountedmusisz mieć poniżej wyniku:

bash ... path-to-be-unmounted
Eugene
źródło
1

Inną alternatywą, gdy coś działa, jest edycja /etc/fstab, dodanie noautoflagi i ponowne uruchomienie komputera. Urządzenie nie zostanie zamontowane, a kiedy cokolwiek skończysz, usuń flagę i uruchom ponownie.

jesjimher
źródło
0

Odpowiedź niszowa:

Jeśli masz pulę ZFS na tym urządzeniu, przynajmniej gdy jest to pula oparta na plikach, lsofnie pokaże użycia. Ale możesz po prostu uciec

sudo zpool export mypoo

a następnie odmontować.

lucidbrot
źródło