Jak dowiedzieć się, które procesy uniemożliwiają odmontowanie urządzenia?

58

Czasami chciałabym odmontować urządzenie USB z umount /run/media/theDrive, ale pojawia się drive is busybłąd.

Jak dowiedzieć się, które procesy lub programy uzyskują dostęp do urządzenia?

Stefan
źródło
1
więcej pozytywnych opinii na to samo pytanie / odpowiedź tutaj: stackoverflow.com/questions/624154/…
Trevor Boyd Smith

Odpowiedzi:

57

Użyj, lsof | grep /media/whateveraby dowiedzieć się, co używa uchwytu.

Rozważ także umount -l(leniwy umount), aby uniemożliwić nowym procesom korzystanie z dysku podczas czyszczenia.

Peter Eisentraut
źródło
24
fuser -mv /path/to/mountpointmoże być bardziej czytelną alternatywą dla wyszukiwania procesów za pomocą punktu kontrolnego.
Riccardo Murri
@RiccardoMurri lsof | grepdziała dla mnie lepiej. fuser -mvwydaje się po prostu zrzucić ponad 80 niepowiązanych procesów. Korzystam z katalogów powiązanych z montowaniem.
Ricky Boyce
1
umount -ljest niebezpieczny . mount -o bind tryb 000pusty katalog na górze zamiast i wyczyść za pomocą lsof +f -- /dev/device.
Tom Hale,
35

Większość czasu, najlepiej polecenie stosowania jest lsof ( „ l i y t O pióra f iles”).

lsof +f -- /media/usb0

gdzie /media/usb0jest punkt podłączenia napędu USB lub innego systemu plików do odmontowania. +f --mówi lsof, aby traktował kolejny argument jako punkt podłączenia; zwykle, ale nie zawsze, zarządza samodzielnie, więc to lsof /media/usb0też działa. Znajduje otwarte pliki (nawet niepowiązane), pliki zmapowane w pamięci, bieżące katalogi i niektóre bardziej niejasne zastosowania. Musisz uruchomić tę komendę jako root, aby uzyskać informacje o procesach innych użytkowników (i myślę, że istnieją jednorożce, w których lsoftrzeba uruchomić jako root).

Istnieją zastosowania, których lsof nie znajdzie; są one rzadkie na nośnikach wymiennych. Zawierają:

  • punkty montowania: nie można odmontować, /foojeśli /foo/barjest to punkt montowania.
  • mount mount: nie można odmontować, /foojeśli /foo/barjest to zamontowane urządzenie blokowe lub zwykły plik montowany w pętli, lub jeśli jest to źródło podłączenia do Linuxa.
  • Eksport NFS: lsof nie wykryje, że drzewo jest eksportowane przez serwer NFS jądra.

Innym poleceniem, które może być użyte w skrócie, jest utrwalacz, który wyświetla tylko PID procesów z otwartymi plikami na urządzeniu:

fuser -m /media/usb0
Gilles „SO- przestań być zły”
źródło
8

Możesz użyć, lsofjak powiedział Peter, lub jeśli jesteś pewien, że chcesz po prostu zabić wszystkie te rzeczy i odmontować je, prawdopodobnie możesz zrobić coś takiego:

fuser -Mk /mnt/path
umount /mnt/path
pioto
źródło
1
Jeśli masz zamiar to zrobić, sprawdź -Mbezpieczeństwo.
Tom Hale,
@TomHale Możesz wyjaśnić, do którego polecenia -Mnależy zastosować.
HSchmale,
1
fuser: -M, --ismountpoint Request will be fulfilled only if NAME specifies a mountpoint. This is an invaluable seatbelt which prevents you from killing the machine if NAME happens to not be a filesystem.
Tom Hale,
6

Otwórz pliki

Procesy z otwartymi plikami są zwykle sprawcami. Wyświetl je:

lsof +f -- <mountpoint or device>

Zaletą używania /dev/<device>zamiast jest /mountpoint: punkt montowania zniknie po umount -llub może zostać ukryty przez nakładane montowanie.

fusermożna również użyć, ale moim zdaniem lsofma bardziej użyteczny efekt. fuserJest to jednak przydatne, jeśli chodzi o zabijanie procesów powodujących twoje dramaty, abyś mógł dalej żyć.

Wyświetl listę plików <mountpoint>(patrz zastrzeżenie powyżej):

fuser -vmM <mountpoint>

Interaktywnie zabijaj tylko procesy z plikami otwartymi do zapisu:

fuser -vmMkiw <mountpoint>

Po ponownym zamontowaniu tylko do odczytu ( mount -o remount,ro <mountpoint>) można bezpiecznie (r) zabić wszystkie pozostałe procesy:

fuser -vmMk <mountpoint>

Punkty montażowe

Winowajcą może być samo jądro. Inny system plików zamontowany w systemie plików, który próbujesz umountwywołać, jest smutny. Sprawdź z:

mount | grep <mountpoint>/

W przypadku mocowań z pętlą zwrotną ( dzięki Stephen Kitt ) sprawdź także wyjście:

losetup -la

Anonimowe i-węzły (Linux)

Anonimowe i-węzły mogą być tworzone przez:

  • Pliki tymczasowe ( openz O_TMPFILE)
  • inotify zegarki
  • [eventfd]
  • [eventpoll]
  • [timerfd]

Są to najbardziej nieuchwytne typu pokemon i pojawiają się w lsof„S TYPEkolumnę jako a_inode(który Undocumented w lsofstronę człowieka ).

Nie pojawią się w lsof +f -- /dev/<device>, więc musisz:

lsof | grep a_inode

Aby poznać procesy zabijania posiadające anonimowe i-węzły, patrz: Lista aktualnych zegarów inotify (ścieżka, PID) .

inotify zegarki (Linux)

Komentarz ten wyjaśnia, dlaczego inotify nie powinno zapobiec odinstalowania, ale uwaga ta opisuje sytuacje, w których będzie :

odmontowany może zawiesić vx_softcnt_flush()połączenie. Zawieszenie występuje, ponieważ zegarki inotify zwiększają i_countzmienną i powodują, że v_os_hold valuepozostaje ona podniesiona do momentu zwolnienia blokady przez obserwatora inotify.

Tom Hale
źródło
Jest jeszcze jedno, montowanie pętli zwrotnej: jeśli zamontujesz system plików, a następnie zamontujesz plik w tym systemie plików przy użyciu pętli zwrotnej, nie będziesz w stanie odmontować pierwszego systemu plików, ale nic się nie pojawi lsof.
Stephen Kitt,
Twoje zdrowie. Dodano do Mountpointssekcji.
Tom Hale,
5

Jeśli korzystasz z GNOME, odmontowanie za pomocą Nautilus spowoduje wyświetlenie komunikatu informującego, który proces nadal korzysta z napędu i pliku, z którego korzysta.

alternatywny tekst

tshepang
źródło
1

Dla (przynajmniej) OpenBSD:

$ fstat /mnt/mountpoint

Na przykład (użycie doasdo wykonania fstatjako root, ponieważ inaczej widzielibyśmy tylko nasze własne procesy):

$ doas fstat /usr/ports
USER     CMD          PID   FD MOUNT        INUM MODE         R/W    SZ|DV NAME
_pbuild  make       15172   wd /usr/ports  3923598  drwxrwxr-x     r     1536 /usr/ports/
_pbuild  make       40034   wd /usr/ports  3923598  drwxrwxr-x     r     1536 /usr/ports/

W takim przypadku nie byłbym w stanie odmontować, /usr/portsdopóki użytkownik _pbuildnie zakończy tych dwóch makeprocesów.

Kusalananda
źródło
-2

Jest to częsta pułapka: su do innego użytkownika (root lub dowolnego innego użytkownika), przejdź do katalogu podłączonego urządzenia, a następnie wyloguj się jako ten użytkownik. Kiedy zapomnisz, że opuściłeś ten katalog, możesz spróbować znaleźć, dopóki nie będziesz ślepy. lsofpokazuje powłokę, z której bieżącego katalogu korzysta to urządzenie. Możesz chcieć ponownie su jako ten użytkownik, aby zmienić katalog.

Hans Linkels
źródło
2
Ta odpowiedź jest niekompletna lub niepoprawna. Nie jestem pewien co, ponieważ jest to również niejasne.
hildred