So heben Sie die Bereitstellung eines ausgelasteten Geräts auf

244

Ich habe einige Samba-Laufwerke, auf die täglich mehrere Benutzer zugreifen. Ich habe bereits Code, um freigegebene Laufwerke (aus einer SQL-Tabelle) zu erkennen und in einem speziellen Verzeichnis bereitzustellen, auf das alle Benutzer zugreifen können.

Ich möchte wissen, ob oder ob es eine Möglichkeit gibt, ein ausgelastetes Gerät zu entfernen, wenn ich ein Laufwerk aus meiner SQL-Tabelle entferne (und es effektiv offline schalte). Bisher habe ich festgestellt, dass jede Form von umountnicht funktioniert.

Ignorieren Sie die Möglichkeit, Daten zu zerstören. Ist es möglich, ein Gerät zu entfernen, das gerade gelesen wird?

Max
quelle
3
Eine allgemeinere Antwort, die sich mit mehr Ursachen für das Versagen von umount befasst, finden Sie hier oletange.blogspot.dk/2012/04/umount-device-is-busy-why.html
Ole Tange
2
Hallo, wahrscheinlich hast du cddir gemountet, dann bist du root geworden oder hast dich wieder angemeldet, dann ist die andere Shell gefangen. Tun Sie exitauf allen Muscheln.
Smeterlink

Antworten:

456

JA!! Es gibt eine Möglichkeit, ein ausgelastetes Gerät sofort zu trennen (auch wenn es ausgelastet ist und nicht mit Gewalt abmontiert werden kann). Sie können alle später bereinigen:

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

HINWEIS:

  1. Diese Befehle können einen laufenden Prozess stören, Datenverlust verursachen ODER geöffnete Dateien beschädigen. Programme, die auf DEVICE / NFS-Zieldateien zugreifen, können Fehler auslösen ODER nach dem Erzwingen der Bereitstellung nicht ordnungsgemäß funktionieren.
  2. Versuchen Sie, diese Befehle auszuführen, wenn Sie sich NICHT im bereitgestellten Ordner / Laufwerk / Gerät befinden.
Amit Verma
quelle
22
Hinweis: -lHier ist ein Kleinbuchstabe L(für "Lazy Unmounting"). (Siehe diese verwandte Antwort .)
ョ ー ジ
4
Hat funktioniert. Eine Nuance: Wenn Sie über den FTP-Client angemeldet sind, müssen Sie sich abmelden, um die Bereitstellung des Ordners erfolgreich aufzuheben.
Alexander Kim
Sie funktionieren nicht. Sie hängen beide für immer. (Debian 8, cifs-utils 2: 6.4-1)
Hubro
1
-lIch --lazywerde offene Dateien nicht beschädigen, aber unter Linux kann man anscheinend nicht wissen, wann das Gerät tatsächlich nicht gemountet ist und entfernt werden kann
Tom Hale
1
Ein bisschen gruselig. Ich habe faul-unmounted und dann wieder gemountet, während einige andere Prozesse noch darauf zugegriffen haben. Also habe ich es wohl am Ende zweimal an derselben Stelle montiert? Ich bin mir nicht sicher, was das getan hat.
Sudo
120

Wenn möglich, suchen / identifizieren wir den ausgelasteten Prozess, beenden den Prozess und entfernen dann die Samba-Freigabe, um den Schaden zu minimieren.

  • lsof | grep '<mountpoint of /dev/sda1>' (oder was auch immer das montierte Gerät ist)

  • pkill target_process(tötet beschäftigte Prozesse mit Namen | kill PID| killall target_process)

  • umount /dev/sda1 (oder was auch immer das montierte Gerät ist)

Frank Tudor
quelle
6
Das bringt nichts zurück. Ich gehe davon aus, dass es sich um ein Netzwerklaufwerk handelt und ich die Prozesse anderer Computer, die auf das Laufwerk zugreifen, nicht sehen kann. Gleiches gilt für die Befehle "Fixiereinheit".
Max
Oh, verdammt ... Sie brauchen die Samba-Befehle ... / usr / bin / smbclient service <Kennwort>: Sehen Sie, ob Sie damit anfangen können
Frank Tudor
2
Die smb-Befehle wurden tatsächlich veraltet und durch "umount.cifs" ersetzt .... was auch nicht funktioniert. Es scheint, dass ich nicht in der Lage bin, um zu steigen, während es beschäftigt ist.
Max
Wenn Sie Asuswrt-Merlin verwenden, müssen Sie lsof# opkg install lsof
Folgendes
1
Sie müssen sudo lsof, um einige Ergebnisse zu erhalten
aheigins
78

Stellen Sie sicher, dass Sie sich noch nicht im gemounteten Gerät befinden, wenn Sie versuchen, die Verbindung herzustellen.

Luci
quelle
4
Genau das einfache Öffnen des aktuellen Ordners (auf dem Zielgerät) in Ihrem Terminal (z. B. über den Befehl cd) reicht aus, um das Aufheben der Bereitstellung zu stoppen :)
jave.web
2
Ja, ich hatte eine Shell in einem Verzeichnis auf dem Gerät ausgeführt. Geschlossen das Terminalfenster und voila
sh78
Stellen Sie außerdem sicher, dass sich keine anderen Einhängepunkte in dem gewünschten befinden umount.
Victe
@victe Danke; Ich habe einen Ordner mit pfexec mount -F vboxfs carpacompartida ~ / Documents unter Solaris 11 erstellt. Aber Dokumente hatten Unterordner und es war das Problem.
Dani Aya
44

Versuchen Sie Folgendes, aber bevor Sie es ausführen, beachten Sie , dass das -kFlag alle laufenden Prozesse abbricht, die das Gerät beschäftigt halten.

Die -iFlagge fuserfragt vor dem Töten.

fuser -kim /address  # kill any processes accessing file
unmount /address
user3751769
quelle
5
lsof | grep '/dev/<my-device>habe nichts zurückgegeben, aber das funktioniert super! Vielleicht möchten Sie auch vorschlagen, fuser -m /dev/<my-device>falls Sie den Prozess herausfinden möchten, bevor Sie ihn beenden.
Modulitos
3
Durch Ausführen des Fixierbefehls wurde ich sofort vom VPS getrennt.
Giorgio79
21

Vermeiden umount -l

Zum Zeitpunkt des Schreibens empfiehlt die am besten gewählte Antwort die Verwendung umount -l.

umount -list gefährlich oder bestenfalls unsicher . Zusammenfassend:

  • Das Gerät wird nicht ausgehängt, sondern nur das Dateisystem aus dem Namespace entfernt. Das Schreiben in geöffnete Dateien kann fortgesetzt werden.
  • Dies kann zu einer Beschädigung des btrfs-Dateisystems führen

Umgehen / Alternative

Das nützliche Verhalten von umount -lbesteht darin, das Dateisystem durch absolute Pfadnamen vor dem Zugriff zu verbergen , wodurch die weitere Verwendung von Mundpunkten minimiert wird.

Das gleiche Verhalten kann erreicht werden, indem ein leeres Verzeichnis mit Berechtigungen 000für das Verzeichnis bereitgestellt wird, dessen Bereitstellung aufgehoben werden soll.

Dann werden alle neuen Zugriffe auf Dateinamen unterhalb des Mountpunkts mit null Berechtigungen auf das neu überlagerte Verzeichnis übertragen - neue Blocker für das Aufheben der Bereitstellung werden dadurch verhindert.

Versuchen Sie es zuerst remount,ro

Der wichtigste Erfolg beim Entsperren ist das schreibgeschützte Remount. Wenn Sie das remount,roAbzeichen erhalten, wissen Sie, dass:

  1. Alle ausstehenden Daten wurden auf die Festplatte geschrieben
  2. Alle zukünftigen Schreibversuche schlagen fehl
  3. Die Daten befinden sich in einem konsistenten Zustand, falls Sie das Gerät physisch trennen müssen.

mount -o remount,ro /dev/device Es ist garantiert, dass dies fehlschlägt, wenn Dateien zum Schreiben geöffnet sind. Versuchen Sie es also direkt. Du fühlst dich vielleicht glücklich, Punk!

Wenn Sie Pech haben, konzentrieren Sie sich nur auf Prozesse mit Dateien, die zum Schreiben geöffnet sind :

lsof +f -- /dev/<devicename> | awk 'NR==1 || $4~/[0-9]+[uw -]/'

Sie sollten dann in der Lage sein, das Gerät schreibgeschützt erneut bereitzustellen und einen konsistenten Status sicherzustellen.

Wenn Sie zu diesem Zeitpunkt nicht schreibgeschützt erneut bereitstellen können, untersuchen Sie einige der anderen hier aufgeführten möglichen Ursachen .

Schreibgeschützter Re-Mount-Erfolg freigeschaltet 🔓☑

Herzlichen Glückwunsch, Ihre Daten auf dem Mountpoint sind jetzt konsistent und vor künftigem Schreiben geschützt.

Warum fuserist schlechter alslsof

Warum nicht fuserfrüher verwenden? Nun, Sie könnten es haben, arbeiten aber fusermit einem Verzeichnis , nicht mit einem Gerät . Wenn Sie also den Mountpoint aus dem Dateinamenraum entfernen und dennoch verwenden fusermöchten, müssen Sie:

  1. Duplizieren Sie den Mountpoint vorübergehend mit mount -o bind /media/hdd /mntan einen anderen Ort
  2. Blenden Sie den ursprünglichen Einhängepunkt aus und blockieren Sie den Namespace:

Hier ist wie:

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"

Sie hätten dann:

  1. Der ursprüngliche Namespace ist ausgeblendet (es konnten keine weiteren Dateien geöffnet werden, das Problem kann nicht schlimmer werden)
  2. Ein doppelt gebundenes gebundenes Verzeichnis (im Gegensatz zu einem Gerät), auf dem ausgeführt werden soll fuser.

Dies ist komplizierter [1] , ermöglicht Ihnen jedoch Folgendes:

fuser -vmMkiw <mountpoint>

Hier werden Sie interaktiv aufgefordert, die Prozesse mit zum Schreiben geöffneten Dateien abzubrechen. Natürlich können Sie dies tun, ohne den Einhängepunkt überhaupt zu verbergen, aber die oben genannten Nachahmungen umount -l, ohne die Gefahren.

Der -wSchalter beschränkt sich auf Schreibvorgänge und -iist interaktiv. Wenn Sie es also nach einem schreibgeschützten Remount eilig haben, können Sie Folgendes verwenden:

fuser -vmMk <mountpoint>

um alle verbleibenden Prozesse mit Dateien abzubrechen, die unter dem Mountpoint geöffnet sind.

Hoffentlich können Sie das Gerät an dieser Stelle aushängen. (Sie müssen umountzweimal auf dem Mountpoint ausgeführt werden, wenn Sie ein Modusverzeichnis 000oben gebunden haben .)

Oder verwenden Sie:

fuser -vmMki <mountpoint>

um die verbleibenden schreibgeschützten Prozesse, die das Aufheben der Bereitstellung blockieren, interaktiv zu beenden.

Verdammt, ich verstehe immer noch target is busy!

Offene Dateien sind nicht der einzige Blocker zum Aufheben der Bereitstellung. Weitere Ursachen und deren Abhilfemaßnahmen finden Sie hier und hier .

Selbst wenn Sie einen lauernden Gremlin haben, der Sie daran hindert, das Gerät vollständig abzumelden, haben Sie Ihr Dateisystem zumindest in einem konsistenten Zustand.

Anschließend können Sie lsof +f -- /dev/devicealle Prozesse mit geöffneten Dateien auf dem Gerät mit dem Dateisystem auflisten und anschließend beenden.


[1] Die Verwendung ist weniger kompliziert mount --move, aber das erfordert mount --make-private /parent-mount-pointAuswirkungen . Wenn der Mountpoint unter dem /Dateisystem bereitgestellt wird , möchten Sie dies grundsätzlich vermeiden.

Tom Hale
quelle
1
Wenn --lazyes so gefährlich ist, warum gibt es in der umountManpage nicht einmal eine Warnung ? Alles, was darin steht, ist " Lazy unmount. Trennen Sie das Dateisystem jetzt von der Dateihierarchie und bereinigen Sie alle Verweise auf dieses Dateisystem, sobald es nicht mehr ausgelastet ist. "
bitinerant
7

Suchen Sie mit exportfs -v nach exportierten NFS-Dateisystemen. Wenn gefunden, entfernen Sie mit exportfs -d share: / directory. Diese werden nicht in der Liste fuser / lsof angezeigt und können den Erfolg von umount verhindern.

numberer6
quelle
1
Danke für diesen Rat. Ich musste exportfs -ua verwenden, um die Sperre zu entfernen.
FuePi
6

Check out umount2:

Linux 2.1.116 fügte den Systemaufruf umount2 () hinzu, der wie umount () die Bereitstellung eines Ziels aufhebt, jedoch zusätzliche Flags zulässt, die das Verhalten der Operation steuern:

MNT_FORCE (seit Linux 2.1.116) Erzwingen Sie die Bereitstellung, auch wenn sie beschäftigt ist. (Nur für NFS-Bereitstellungen.) MNT_DETACH (seit Linux 2.4.11) Führen Sie eine verzögerte Bereitstellung durch: Machen Sie den Bereitstellungspunkt für neue Zugriffe nicht verfügbar, und führen Sie die Bereitstellung aus, wenn der Bereitstellungspunkt nicht mehr ausgelastet ist. MNT_EXPIRE (seit Linux 2.6.8) Markieren Sie den Mountpunkt als abgelaufen. Wenn derzeit kein Mountpunkt verwendet wird, schlägt ein erster Aufruf von umount2 () mit diesem Flag mit dem Fehler EAGAIN fehl, markiert den Mountpunkt jedoch als abgelaufen. Der Einhängepunkt bleibt abgelaufen, solange kein Prozess darauf zugreift. Ein zweiter umount2 () -Aufruf, der MNT_EXPIRE angibt, hebt die Bereitstellung eines abgelaufenen Einhängepunkts auf. Dieses Flag kann weder mit MNT_FORCE noch mit MNT_DETACH angegeben werden. Rückgabewert

Bei Erfolg wird Null zurückgegeben. Bei einem Fehler wird -1 zurückgegeben und errno wird entsprechend eingestellt.

chown
quelle
Leider sind dies keine NFS-Mounts, sondern CIFS. Ich werde aber den MNT_DETACH ausprobieren. Wenn umount -l jedoch nicht funktioniert hätte, könnte ich mir nicht vorstellen, dass dies viel anders wäre. Trotzdem danke!
Max
2

Jemand hat erwähnt, dass der Fehler angezeigt wird, wenn Sie ein Terminal verwenden und sich Ihr aktuelles Verzeichnis innerhalb des Pfads befindet, den Sie aushängen möchten.
Als Ergänzung müssen Sie in diesem Fall lsof | grep path-to-be-unmounteddie folgende Ausgabe haben:

bash ... path-to-be-unmounted
Eugene
quelle
1

Eine andere Alternative, wenn etwas funktioniert, ist das Bearbeiten /etc/fstab, Hinzufügen eines noautoFlags und ein Neustart des Computers. Das Gerät wird nicht gemountet. Wenn Sie fertig sind, entfernen Sie das Flag und starten Sie es erneut.

jesjimher
quelle
0

Nischenantwort:

Wenn auf diesem Gerät ein zfs-Pool vorhanden ist, lsofwird die Verwendung zumindest dann nicht angezeigt, wenn es sich um einen dateibasierten Pool handelt . Aber du kannst einfach rennen

sudo zpool export mypoo

und dann abmontieren.

lucidbrot
quelle