umount: urządzenie jest zajęte. Dlaczego?


171

Podczas biegania umount /pathotrzymuję:

umount: /path: device is busy.

System plików jest ogromny, więc lsof +D /pathnie jest realistyczną opcją.

lsof /path, lsof +f -- /pathi fuser /pathwszyscy nic nie zwracają. fuser -v /pathdaje:

                  USER        PID ACCESS COMMAND
/path:            root     kernel mount /path

co jest normalne dla wszystkich nieużywanych zamontowanych systemów plików.

umount -li umount -fnie jest wystarczająco dobry dla mojej sytuacji.

Jak dowiedzieć się, dlaczego jądro uważa, że ​​ten system plików jest zajęty?


11
Czy bieżący katalog twojej powłoki znajduje się na ścieżce punktu montowania?
LawrenceC

Nie. Więc fuser by tak powiedział.
Ole Tange

12
Naprawdę chcesz fuser -vm /path...
derobert,

5
Dla umount --forcebędzie starać odmontować i -vlub -vvvnawet będzie reaveal więcej na czym polega problem z montażem. Więc spróbuj:umount -vvv --force /babdmount
graj

Odpowiedzi:


139

Wygląda na to, że przyczyną mojego problemu nfs-kernel-serverbyło eksportowanie katalogu. nfs-kernel-serverPrawdopodobnie idzie za normalne otwartych plików, a zatem nie znajduje się na liście lsofi fuser.

Kiedy zatrzymałem nfs-kernel-server, mogłem umountkatalog.

Stworzyłem stronę z przykładami wszystkich dotychczasowych rozwiązań: http://oletange.blogspot.com/2012/04/umount-device-is-busy-why.html


54
Dziękujemy za odpowiedź na własne pytanie zamiast rezygnacji z niego po wdrożeniu rozwiązania. Twoja odpowiedź pomogła mi uporządkować podobnie wyeksportowany udział NFS.
Jeff Welling,

7
Ten sam problem może również wystąpić, jeśli skonfigurowałeś urządzenia pętli zwrotnej w systemie plików - na przykład jeśli / dev / loop0 jest wspierany przez plik w / path.
BCran

1
Musiałem sudo service samba stopnajpierw, twoja odpowiedź naprawdę pomogła!
Malat

1
Ten post przypomniał mi, że po kilku godzinach próbowania rozwiązania tego problemu działała usługa nfs. W RHEL6 / CentOS6 użyj sudo service nfs stopi możesz (nie) również zrobić, sudo exportfs -uaby wyeksportować. Pamiętaj, aby potem sudo exportfs -ri sudo service nfs startdo powrotnego wywozu i ponownie uruchomić usługę.
code_dredd

1
W moim przypadku nie było konieczne zatrzymywanie serwera NFS, tylko exportfs -udany katalog.
Ustawa

42

Aby dodać do BruceCran „s komentarzu powyżej, przyczyną mojego przejaw tego problemu właśnie teraz był nieświeży zamontować sprzężenia zwrotnego. Ja już sprawdzone wyjście fuser -vm <mountpoint>/ lsof +D <mountpoint>, mounti cat /proc/mounts, sprawdził, czy jakiś stary nfs-kernel-server został uruchomiony, wyłączony kwot, próbował (ale nie powiodło się) A umount -f <mountpoint>i wszystkich, ale pogodziłem się do porzucenia uptime 924 dni, zanim wreszcie sprawdzenie wyjście od losetupi znalezienie dwóch przestarzałych skonfigurowany ale-nie-montowane loopback:

parsley:/mnt# cat /proc/mounts 
rootfs / rootfs rw 0 0
none /sys sysfs rw,nosuid,nodev,noexec 0 0
none /proc proc rw,nosuid,nodev,noexec 0 0
udev /dev tmpfs rw,size=10240k,mode=755 0 0
/dev/mapper/stuff-root / ext3 rw,errors=remount-ro,data=ordered 0 0
tmpfs /lib/init/rw tmpfs rw,nosuid,mode=755 0 0
usbfs /proc/bus/usb usbfs rw,nosuid,nodev,noexec 0 0
tmpfs /dev/shm tmpfs rw,nosuid,nodev 0 0
devpts /dev/pts devpts rw,nosuid,noexec,gid=5,mode=620 0 0
fusectl /sys/fs/fuse/connections fusectl rw 0 0
/dev/dm-2 /mnt/big ext3 rw,errors=remount-ro,data=ordered,jqfmt=vfsv0,usrjquota=aquota.user 0 0

następnie

parsley:/mnt# fuser -vm /mnt/big/
parsley:/mnt# lsof +D big
parsley:/mnt# umount -f /mnt/big/
umount2: Device or resource busy
umount: /mnt/big: device is busy
umount2: Device or resource busy
umount: /mnt/big: device is busy

parsley:/mnt# losetup -a    
/dev/loop0: [fd02]:59 (/mnt/big/dot-dropbox.ext2)
/dev/loop1: [fd02]:59 (/mnt/big/dot-dropbox.ext2)

parsley:/mnt# losetup -d /dev/loop0
parsley:/mnt# losetup -d /dev/loop1
parsley:/mnt# losetup -a
parsley:/mnt# umount big/
parsley:/mnt#

Gentoo forum po wymienia także swapfiles jako potencjalnego sprawcy; chociaż obecnie wymiana plików jest prawdopodobnie dość rzadka, nie może zaszkodzić sprawdzić wyjście cat /proc/swaps. Nie jestem pewien, czy kwoty mogłyby kiedykolwiek zapobiec odmontowaniu - trzymałem się słomy.


12
Wszystkie 924 dni bezawaryjności oznacza, że ​​musisz zaktualizować łaty do jądra :-)
w00t

+1 dla wspomnieć plików wymiany, oni zrobić blok odmontowywanie i są prawie niewykrywalne jeśli nie sprawdzając ich bezpośrednio.
P.Péter

22

Zamiast używać lsof do przeszukiwania systemu plików, po prostu użyj całkowitej listy otwartych plików i grep. Uważam, że ten zwrot musi być szybszy, chociaż jest mniej dokładny. Powinno to zakończyć pracę.

lsof | grep '/path'

1
lsof / path przegląda tylko ścieżkę.
Ole Tange

7
Nie powiedziałem lsof /path, powiedziałem lsof | grep '/path'. Różnica polega na tym, że lsof bez argumentów pokazuje wszystkie otwarte pliki przy użyciu pewnego rodzaju tabeli pamięci podręcznej, a grep bardzo szybko je przeszukuje. Rzeczy, których próbowałeś z lsof, powodują, że skanuje on system plików, co zajmuje dużo czasu.
Caleb

1
Tak jak powiedziałem: lsof /pathpatrzy tylko na ścieżkę. Nie patrzy na każdy pojedynczy plik. Często jest znacznie szybszy niż lsof | grep /path(w moim nienaukowym teście było to 20 razy szybsze YMMV), ponieważ nie patrzy na wszystkie otwarte pliki, ale tylko pliki dla tej ścieżki.
Ole Tange

Nie jestem pewien, jaka jest różnica techniczna, ale podczas badania nieaktualnego podłączenia NFS lsof /pathnic nie dało, lsof | grep /pathpokazując mi proces, który przechowywał otwarte pliki i uniemożliwiał mi odmontowanie woluminu.
dpw

20

Dla mnie proces obrażania był demonem działającym w chroot. Ponieważ był w chroot lsofi fusernie mógł go znaleźć.

Jeśli podejrzewasz, że coś zostało w chroocie, sudo ls -l /proc/*/root | grep chrootznajdziesz winowajcę (zastąp „chroot” ścieżką do chroota).


1
Fajnie, a we FreeBSD zrobiłem to: sudo ls -l /proc/*/status | grep HOSTgdzie HOST jest nazwą hosta więzienia
JGurtz

1
W moim systemie (Mint Qiana) lsof /mountpointi fuser /mountpointoboje znajdują proces, nawet jeśli jest chrootowany.
Ole Tange,

9

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 montowania w pętli zwrotnej sprawdź także dane wyjściowe:

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 dowiedzieć się więcej o procesach zabijania posiadających anonimowe i-węzły, patrz: Lista aktualnych zegarów inotify (ścieżka, PID) .


5

Aby utrwalacz mógł zgłaszać PID-y, w których mocowanie jest otwarte, musisz użyć -m

fuser -m /path

2
Prawda, ale nieistotna: lsof /pathzapewnia tę samą listę PID, co fuser -m /path.
Gilles

fuser -M /pathsprawdzi, czy /pathjest to punkt montowania.
user3804598

5

Mamy zastrzeżony system, w którym główny system plików jest zwykle tylko do odczytu. Czasami, gdy pliki muszą zostać skopiowane, jest ponownie montowane do odczytu i zapisu:

mount -oremount,rw /

A potem ponownie zamontował:

mount -oremount,ro /

Tym razem jednak mountciągle podawałem mount: / is busybłąd. Było to spowodowane procesem trzymania otwartego deskryptora pliku, który został zastąpiony przez jakąś komendę, która została wykonana, gdy system plików był w trybie odczytu-zapisu. Ważnym wierszem lsof -- /danych wyjściowych jest (nazwy zostały zmienione):

replicate  1719 admin DEL REG 8,5  204394 /opt/gns/lib/replicate/modules/md_es.so

Zwróć uwagę DELna wynik. Ponowne uruchomienie procesu zatrzymującego usunięty plik rozwiązało problem.


3
Podsumowując: proces ma otwarty plik, który został usunięty. Dobry wkład.
Ole Tange

4

lsofi fusernic mi też nie dał.

Po zmianie nazwy wszystkich możliwych katalogów na .old i ponownym uruchomieniu systemu za każdym razem, gdy dokonałem zmian, znalazłem jeden konkretny katalog (związany z postfiksem), który był odpowiedzialny.

Okazało się, że kiedyś utworzyłem dowiązanie symboliczne od /var/spool/postfixdo /disk2/pers/mail/postfix/varspoolw celu zminimalizowania zapisów na dysku w głównym systemie plików opartym na SDCARD (wtyczka Sheeva).

Z tym dowiązaniem symbolicznym nawet po zatrzymaniu usług postfixi dovecot(zarówno, ps auxjak i netstat -tuanpnie pokazując niczego związanego) nie byłem w stanie unmount /disk2/pers.

Kiedy usunąłem dowiązanie symboliczne i zaktualizowałem pliki postfixi dovecotconfig, aby wskazywały bezpośrednio na nowe katalogi, /disk2/pers/byłem w stanie z powodzeniem zatrzymać usługi i unmountkatalog.

Następnym razem przyjrzę się dokładniej wynikowi:

ls -lR /var | grep ^l | grep disk2

Powyższe polecenie rekurencyjnie wyświetli listę wszystkich dowiązań symbolicznych w drzewie katalogów (tutaj zaczynając od /var) i odfiltruje te nazwy, które wskazują na konkretny docelowy punkt montowania (tutaj disk2).


3

Miałem ten problem i okazało się, że w tle były aktywne sesje ekranowe, o których nie wiedziałem. Połączyłem się z inną aktywną sesją ekranu, a jej powłoka nawet nie znajdowała się w zamontowanym katalogu. Zabicie tych innych sesji powłoki rozwiązało problem.

Pomyślałem, że podzielę się swoją rezolucją.


1

Dzisiaj problemem było otwarte gniazdo (konkretnie tmux):

mount /mnt/disk
export TMPDIR=/mnt/disk
tmux
<<detatch>>
umount /mnt/disk
umount: /mnt/disk: device is busy.
lsof | grep /mnt/disk
tmux      20885             root    6u     unix 0xffff880022346300        0t0    3215201 /mnt/disk/tmux-0/default

1

Mam kilka bindi overlaymocowań pod moim wierzchowcem, które mnie blokowały, sprawdź zakończenie zakładki dla punktu montowania, który chcesz odmontować. Podejrzewam, że w szczególności była to nakładka wierzchnia, ale mogła to być również oprawa


1

Jest to bardziej obejście niż odpowiedź, ale zamieszczam je na wypadek, gdyby mogło komuś pomóc.

W moim przypadku próbowałem zmodyfikować LVM, ponieważ chciałem powiększyć partycję / var, więc musiałem ją umountować. Próbowałem wszystkich skomentowanych i odpowiedziałem w tym poście (dziękuję wszystkim, a zwłaszcza @ ole-tange za ich zebranie) i nadal dostaję błąd „urządzenie jest zajęte”.

Próbowałem też zabić większość procesów w kolejności określonej na poziomie uruchamiania 0, na wypadek, gdyby kolejność była odpowiednia w moim przypadku, ale to też nie pomogło. Więc stworzyłem niestandardowy poziom uruchamiania (łącząc dane wyjściowe chkconfig z nowymi poleceniami chkconfig --level), który byłby bardzo podobny do 1 (tryb pojedynczego użytkownika), ale z możliwościami sieciowymi (z siecią ssh i xinet).

Ponieważ korzystałem z narzędzia redhat, poziom działania 4 jest oznaczony jako „nieużywany / zdefiniowany przez użytkownika”, więc użyłem tego i uruchomiłem. init 4 W moim przypadku było to w porządku, ponieważ w każdym przypadku musiałem zrestartować serwer, ale prawdopodobnie tak będzie każdego, kto poprawia dyski.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.