Belegtes Gerät auf Umount

41

Ich habe oft ein Problem beim Ummounten eines Verzeichnisses:

umount / mnt / dir
umount: / mnt / dir: Gerät ist beschäftigt

Es gibt viele Gründe, warum das Gerät ausgelastet ist. Manchmal laufen Prozesse mit offenen Sperren, manchmal sind andere Verzeichnisse darüber angehängt /mnt/dir.

Meine Frage:

Was sind die Schritte, um zu überprüfen, warum ein Verzeichnis nicht abgehängt werden konnte.

Ich weiß, dass es viele Gründe gibt, aber es ist in Ordnung, wenn Sie eine bestimmte Lösung erläutern.

[BEARBEITEN]

[X] Ausführen von Prozessen auf bereitgestellten Volumes.
[X] Ein anderes Volume wird über einem Volume bereitgestellt, dessen Bereitstellung aufgehoben werden soll.
[_] NFS sperrt das Volume, dessen Bereitstellung aufgehoben werden soll


quelle

Antworten:

75

Der Weg zu überprüfen ist fuser -vm /mnt/dir, welche als root ausgeführt werden muss. Hier erfahren Sie, welche Prozesse auf den Mount-Punkt zugreifen.

Eine Alternative ist lsof /mnt/dir, die jede geöffnete Datei auf dem Mount anzeigt. Wieder am besten als root ausführen.

Sie können einen dieser Prozesse als Nicht-Root ausführen, die Ausgabe ist jedoch auf Ihre Prozesse beschränkt. Die Prozesse anderer Benutzer werden nur stillschweigend nicht angezeigt, obwohl sie das Aufheben der Bereitstellung des Dateisystems verhindern.

Beispiel:

Watt:~# fuser -vm /mnt/Zia/src
                     USER        PID ACCESS COMMAND
/mnt/Zia/src:        root     kernel mount /mnt/Zia/src
                     anthony   24909 ..c.. bash
                     anthony   25041 F.c.. gvim

Das Feld "Zugriff" informiert Sie darüber, wie darauf zugegriffen wird. In diesem Fall wird der Kernel als Mount verwendet. bashhat es als aktuelles Arbeitsverzeichnis (muss cdvor dem Unmounten in ein anderes Verzeichnis) und gvim hat sowohl das aktuelle Verzeichnis als auch eine geöffnete Datei (muss dieses gvim schließen).

Watt:~# lsof /mnt/Zia/src
COMMAND   PID    USER   FD   TYPE DEVICE SIZE/OFF    NODE NAME
bash    24909 anthony  cwd    DIR   0,26    12288 3527682 /mnt/Zia/src/perl (zia.vpn.home:/home/anthony/src)
gvim    25041 anthony  cwd    DIR   0,26    12288 3527682 /mnt/Zia/src/perl (zia.vpn.home:/home/anthony/src)
gvim    25041 anthony    6u   REG   0,26    16384 3526219 /mnt/Zia/src/perl/.utf8.c.swp (zia.vpn.home:/home/anthony/src)

In dieser Ausgabe sehen Sie die aktuellen Verzeichnisse für bash und gvim (als Typ DIR). Sie können auch sehen, welche Datei gvim zum Schreiben geöffnet hat.

So erzwingen Sie das Problem:

fuserhat eine -kOption, die ein Signal (Standard:) SIGKILLan jeden Prozess sendet , der den Mount verwendet. Dies ist eine ziemlich gewaltsame Methode, um zu verhindern, dass das Reittier beschäftigt ist. (Und natürlich pass auf was du willst SIGKILL!)

umounthat die -lOption, ein Lazy Unmount durchzuführen. Der Mount wird aus dem Dateisystem-Namespace entfernt (daher wird er /mnt/Zia/srcim Beispiel nicht mehr angezeigt), bleibt jedoch gemountet, sodass Programme, die darauf zugreifen, dies weiterhin tun können. Wenn das letzte Programm, das darauf zugreift, beendet wird, wird die Bereitstellung tatsächlich aufgehoben.

Es gibt eine letzte Ursache, die behoben werden kann, wenn das Aufheben der Bereitstellung fehlschlägt. Dies ist ein NFS-Server, der ausfällt. Hier können Sie verwenden umount -f, aber Sie riskieren Datenverlust, wenn Sie dies tun. (Der Client hat möglicherweise Schreibvorgänge zwischengespeichert, die vom Server noch nicht bestätigt wurden, und diese werden verworfen. Apps wurde jedoch bereits mitgeteilt, dass der Schreibvorgang erfolgreich war.)

derobert
quelle
4
Beachten Sie, dass fuser -kist extrem riskant, wie Sie es als root tun würden , und wenn Sie nicht sind sehr sicher , von denen Prozesse werden getötet off Sie wirklich spektakulären Schaden mit einem sorglosen Befehl tun können ...
Shadur
1
@Shadur Nun, hoffentlich haben Sie es bereits ohne die -kOption ausgeführt, sodass Sie wissen, welche Prozesse Sie beenden werden . Aber ich werde eine Warnung hinzufügen.
Derobert
1
fuser -vmzeigte "Kernel Mount". musste man systemctl stop opt.mountstatt manuell machen umount.
lkraav
2
Aus irgendeinem Grund funktioniert umount -f bei mir nicht, aber das Ausführen von umount -l funktioniert einwandfrei.
Firze
Danke für den Hinweis zu umount -fund NFS. Mein Problem bestand im Zusammenhang mit NFS, bei dem die IP-Adressen meiner Entwickler geändert wurden und ich die Freigabe nicht entfernen konnte.
Eric
19

Du solltest benutzen:

sudo umount -l <path>
Felipe
quelle
7
⁺¹, ich habe keine Ahnung, welche dumme Person das ablehnen könnte. Dies -list genau die Option, die verwendet werden kann, wenn -fnicht einmal funktioniert.
Hi-Angel
@ Hi-angel Weil das nicht das ist, wonach der OP fragt?
Xhienne
Bei @xheinne Stack Exchange geht es nicht nur darum, eine Frage wie einen blöden Bot zu beantworten. Diese Antwort ist hilfreich. Viele Leute kommen auch aus der Google-Suche. Ich persönlich fand das hilfreich. Der Benutzer sollte die Antwort akzeptieren, die er für relevant hält. Deshalb ist der Akzeptanzknopf vorhanden.
user1735921
6

Ein anderes Volume wird über einem Volume bereitgestellt, dessen Bereitstellung aufgehoben werden soll:

Mit dem mountBefehl können Sie alle bereitgestellten Volumes kennen, wenn Sie ohne Argumente oder Optionen abgerufen werden (außer -v). Sie können eine Liste der aktiven Mountpunkte erstellen, indem Sie etwas Perl hinzufügen:

mount | perl -pe 's/.*on (\S+) type.*/\1/'

Greifen Sie dann einfach über den Punkt, von dem aus Sie die Bereitstellung aufheben möchten, und Sie werden wissen, ob über diesen Punkt Dateisysteme bereitgestellt sind.

mount | perl -pe 's/.*on (\S+) type.*/\1/' | grep '/mnt/dir/'

Dann haben Sie zwei Lösungen . Entweder die Dateisysteme aushängen oder mit mount --move olddir newdir(Kernel> 2.5.1) verschieben

mveroone
quelle
1
Ja dank. / etc / mtab und / proc / mounts sind ebenfalls möglich.
Ah, das stimmt, ich habe die immer vergessen.
Angenommen
1
Ich habe ein externes USB-Speichergerät "permanent" in einem bestimmten Verzeichnis meines Laptops installiert. Manchmal wird das Kabel versehentlich abgezogen. Es war sehr mühsam, das Gerät erneut in das Verzeichnis einzuhängen (wegen "Gerät ausgelastet"), bis ich diese Antwort gelesen habe. Jetzt wusste ich, dass ich mount --move olddir newdir benutze. Vielen Dank.
Silvio Levy
3

Dateien öffnen

Prozesse mit offenen Dateien sind die üblichen Schuldigen. Zeigen Sie sie an:

lsof +f -- <mountpoint or device>

Die Verwendung von /dev/<device>anstelle von hat den Vorteil, dass /mountpointein Mountpunkt nach einem verschwindet umount -loder von einem überlagerten Mount ausgeblendet wird.

fuserkann auch verwendet werden, aber meiner Meinung nach lsofhat eine nützlichere Ausgabe. Dies fuserist jedoch hilfreich, wenn es darum geht, die Prozesse zu beenden, die Ihre Dramen verursachen, damit Sie mit Ihrem Leben weitermachen können.

Dateien <mountpoint>auflisten (siehe Warnung oben):

fuser -vmM <mountpoint>

Beenden Sie interaktiv nur Prozesse mit Dateien, die zum Schreiben geöffnet sind:

fuser -vmMkiw <mountpoint>

Nach dem erneuten Einhängen von read-only ( mount -o remount,ro <mountpoint>) ist es sicher (r), alle verbleibenden Prozesse abzubrechen:

fuser -vmMk <mountpoint>

Mountpoints

Der Täter kann der Kernel selbst sein. Ein anderes Dateisystem, das auf dem Dateisystem gemountet ist, das Sie versuchen, umountverursacht Trauer. Erkundigen Sie sich bei:

mount | grep <mountpoint>/

Überprüfen Sie bei Loopback-Mounts auch die Ausgabe von:

losetup -la

Anonyme Inodes (Linux)

Anonyme Inodes können erstellt werden durch:

  • Temporäre Dateien ( openmit O_TMPFILE)
  • Uhren inotifizieren
  • [eventfd]
  • [eventpoll]
  • [timerfd]

Dies sind die am schwersten fassbaren Arten von Pokémon. Sie werden in lsofder TYPESpalte als a_inode(undokumentiert in der lsofManpage ) angezeigt .

Sie werden nicht in angezeigt lsof +f -- /dev/<device>, daher müssen Sie:

lsof | grep a_inode

Informationen zum Beenden von Prozessen mit anonymen Inodes finden Sie unter: Auflisten der aktuellen Inotify-Überwachungen (Pfadname, PID) .

Tom Hale
quelle
1

Die Frage, wie überprüft werden kann, ob NFS auf ein Verzeichnis zugreift, dessen Bereitstellung aufgehoben werden soll, ist noch nicht beantwortet.

Was ich habe, ist nur das:

Überprüfen Sie, ob nfsd ausgeführt wird:

pidof nfsd

Bereitgestellte Verzeichnisse nach Clients anzeigen:

showmount -a

und ohne showmountArgumente werden nur Client-Hosts angezeigt, auch wenn sie offline sind. Ich gehe davon aus, dass dies ein spezielles Verhalten von NFS ist.


quelle
1

Für mich bestand das Problem darin, dass ich mehrmals (über ssh) angemeldet war und mich bei einer der Anmeldungen an der Eingabeaufforderung befand, in der sich die pwd in einem Ordner befand, der dem Mount-Punkt untergeordnet war.

Lonniebiz
quelle