Czasami chciałabym odmontować urządzenie USB z umount /run/media/theDrive
, ale pojawia się drive is busy
błąd.
Jak dowiedzieć się, które procesy lub programy uzyskują dostęp do urządzenia?
Czasami chciałabym odmontować urządzenie USB z umount /run/media/theDrive
, ale pojawia się drive is busy
błąd.
Jak dowiedzieć się, które procesy lub programy uzyskują dostęp do urządzenia?
Odpowiedzi:
Użyj, lsof | grep /media/whatever
aby dowiedzieć się, co używa uchwytu.
Rozważ także umount -l
(leniwy umount), aby uniemożliwić nowym procesom korzystanie z dysku podczas czyszczenia.
fuser -mv /path/to/mountpoint
może być bardziej czytelną alternatywą dla wyszukiwania procesów za pomocą punktu kontrolnego.
lsof | grep
działa dla mnie lepiej. fuser -mv
wydaje się po prostu zrzucić ponad 80 niepowiązanych procesów. Korzystam z katalogów powiązanych z montowaniem.
umount -l
jest niebezpieczny . mount -o bind
tryb 000
pusty katalog na górze zamiast i wyczyść za pomocą lsof +f -- /dev/device
.
Większość czasu, najlepiej polecenie stosowania jest lsof ( „ l i y t O pióra f iles”).
lsof +f -- /media/usb0
gdzie /media/usb0
jest 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/usb0
też 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 lsof
trzeba uruchomić jako root).
Istnieją zastosowania, których lsof nie znajdzie; są one rzadkie na nośnikach wymiennych. Zawierają:
/foo
jeśli /foo/bar
jest to punkt montowania./foo
jeśli /foo/bar
jest 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.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
Możesz użyć, lsof
jak 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
-M
bezpieczeństwo.
-M
należy zastosować.
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.
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 -l
lub może zostać ukryty przez nakładane montowanie.
fuser
można również użyć, ale moim zdaniem lsof
ma bardziej użyteczny efekt. fuser
Jest 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>
Winowajcą może być samo jądro. Inny system plików zamontowany w systemie plików, który próbujesz umount
wywoł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 mogą być tworzone przez:
open
z O_TMPFILE
)Są to najbardziej nieuchwytne typu pokemon i pojawiają się w lsof
„S TYPE
kolumnę jako a_inode
(który Undocumented w lsof
stronę 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_count
zmienną i powodują, żev_os_hold value
pozostaje ona podniesiona do momentu zwolnienia blokady przez obserwatora inotify.
lsof
.
Mountpoints
sekcji.
Dla (przynajmniej) OpenBSD:
$ fstat /mnt/mountpoint
Na przykład (użycie doas
do wykonania fstat
jako 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/ports
dopóki użytkownik _pbuild
nie zakończy tych dwóch make
procesów.
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. lsof
pokazuje powłokę, z której bieżącego katalogu korzysta to urządzenie. Możesz chcieć ponownie su jako ten użytkownik, aby zmienić katalog.