Wenn möglich, lassen Sie uns den ausgelasteten Prozess lokalisieren/identifizieren, diesen Prozess beenden und dann unmount
die Samba-Freigabe/-Laufwerk, um den Schaden zu minimieren:
-
lsof | grep '<mountpoint of /dev/sda1>'
(oder was auch immer das gemountete Gerät ist) -
pkill target_process
(beendet beschäftigte Prozesse nach Namen |kill PID
|killall target_process
) -
umount /dev/sda1
(oder was auch immer das gemountete Gerät ist)
Vermeiden Sie umount -l
Zum Zeitpunkt des Verfassens dieses Artikels empfiehlt die am häufigsten bewertete Antwort die Verwendung von umount -l
.
umount -l
ist gefährlich oder bestenfalls unsicher . Zusammengefasst:
- Es hängt das Gerät nicht wirklich ab, es entfernt nur das Dateisystem aus dem Namensraum. Schreibvorgänge in geöffnete Dateien können fortgesetzt werden.
- Es kann eine Beschädigung des Btrfs-Dateisystems verursachen
Workaround / Alternative
Das nützliche Verhalten von umount -l
verbirgt das Dateisystem vor dem Zugriff durch absolute Pfadnamen, wodurch die weitere Moutpoint-Nutzung minimiert wird.
Dasselbe Verhalten kann erreicht werden, indem ein leeres Verzeichnis mit den Berechtigungen 000
gemountet wird über das auszuhängende Verzeichnis.
Dann treffen alle neuen Zugriffe auf Dateinamen unterhalb des Einhängepunkts das neu überlagerte Verzeichnis mit null Berechtigungen - neue Blocker zum Aushängen werden dadurch verhindert.
Versuchen Sie zuerst remount,ro
Der wichtigste Unmount-Erfolg, der freigeschaltet werden muss, ist der schreibgeschützte Remount. Wenn Sie die remount,ro
erhalten Abzeichen, das wissen Sie:
- Alle ausstehenden Daten wurden auf die Festplatte geschrieben
- Alle zukünftigen Schreibversuche schlagen fehl
- Die Daten befinden sich in einem konsistenten Zustand, falls Sie das Gerät physisch trennen müssen.
mount -o remount,ro /dev/device
wird garantiert fehlschlagen, wenn Dateien zum Schreiben geöffnet sind, also versuchen Sie es gleich. Vielleicht hast du Glück, Punk!
Wenn Sie Pech haben, konzentrieren Sie sich nur auf Prozesse mit zum Schreiben geöffneten Dateien:
lsof +f -- /dev/<devicename> | awk 'NR==1 || $4~/[0-9]+[uw -]/'
Sie sollten dann in der Lage sein, das Gerät schreibgeschützt neu zu mounten und einen konsistenten Zustand sicherzustellen.
Wenn Sie zu diesem Zeitpunkt nicht schreibgeschützt neu mounten können, untersuchen Sie einige der anderen möglichen Ursachen, die hier aufgeführt sind.
Nur-Lesen-Remount-Erfolg freigeschaltet ð☑
Herzlichen Glückwunsch, Ihre Daten auf dem Einhängepunkt sind jetzt konsistent und vor zukünftigem Schreiben geschützt.
Warum fuser
ist kleiner als lsof
Warum nicht use fuser
verwenden vorhin? Nun, hättest du, aber fuser
arbeitet mit einem Verzeichnis , kein Gerät , wenn Sie also den Einhängepunkt aus dem Dateinamensraum entfernen und trotzdem fuser
verwenden möchten , müssten Sie:
- Duplizieren Sie vorübergehend den Einhängepunkt mit
mount -o bind /media/hdd /mnt
an einen anderen Ort - Verstecken Sie den ursprünglichen Einhängepunkt und blockieren Sie den Namensraum:
So geht's:
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:
- Der ursprüngliche Namespace versteckt (es konnten keine Dateien mehr geöffnet werden, das Problem kann nicht schlimmer werden)
- Ein doppeltes Bind-gemountetes Verzeichnis (im Gegensatz zu einem Gerät), auf dem
fuser
ausgeführt werden soll .
Dies ist komplizierter, ermöglicht Ihnen aber die Verwendung von:
fuser -vmMkiw <mountpoint>
die interaktiv auffordert, die Prozesse mit zum Schreiben geöffneten Dateien zu beenden. Natürlich könnten Sie dies tun, ohne den Einhängepunkt zu verbergen, aber das obige ahmt umount -l
nach , ohne die Gefahren.
Der -w
Schalter beschränkt auf Schreibvorgänge und -i
ist interaktiv, wenn Sie es also eilig haben, können Sie nach einem schreibgeschützten Remount Folgendes verwenden:
fuser -vmMk <mountpoint>
um alle verbleibenden Prozesse mit geöffneten Dateien unter dem Einhängepunkt zu beenden.
Hoffentlich können Sie das Gerät an dieser Stelle aushängen. (Sie müssen umount
ausführen auf dem Einhängepunkt zweimal, wenn Sie einen Modus 000
gemountet haben Verzeichnis ganz oben.)
Oder verwenden Sie:
fuser -vmMki <mountpoint>
um die verbleibenden schreibgeschützten Prozesse, die das Unmounten blockieren, interaktiv zu beenden.
Verdammt, ich bekomme immer noch target is busy
!
Geöffnete Dateien sind nicht der einzige Unmount-Blocker. Siehe hier und hier für andere Ursachen und deren Abhilfe.
Selbst wenn Sie einen lauernden Gremlin haben, der Sie daran hindert, das Gerät vollständig auszuhängen, haben Sie zumindest Ihr Dateisystem in einem konsistenten Zustand.
Sie können dann lsof +f -- /dev/device
verwenden um alle Prozesse mit offenen Dateien auf dem Gerät aufzulisten, das das Dateisystem enthält, und sie dann zu beenden.
JA !! Es gibt eine Möglichkeit, ein ausgelastetes Gerät sofort zu trennen – selbst wenn es ausgelastet ist und nicht zwangsweise ausgehängt werden kann. Sie können später alles aufräumen:
umount -l /PATH/OF/BUSY-DEVICE
umount -f /PATH/OF/BUSY-NFS (NETWORK-FILE-SYSTEM)
HINWEIS/ACHTUNG
- Diese Befehle können einen laufenden Prozess unterbrechen, Datenverlust verursachen ODER offene Dateien beschädigen. Programme, die auf GERÄTE-/NFS-Zieldateien zugreifen, können Fehler auslösen ODER könnten nach dem erzwungenen Unmounten nicht richtig funktionieren.
- Tun Sie nicht oben ausführen
umount
Befehle, wenn sie sich innerhalb des gemounteten Pfads (Ordner/Laufwerk/Gerät) selbst befinden. Zuerst können Siepwd
verwenden Befehl, um Ihren aktuellen Verzeichnispfad zu validieren (der nicht der gemountete Pfad sein sollte), und verwenden Sie danncd
Befehl, um den gemounteten Pfad zu verlassen - um ihn später mit den obigen Befehlen zu unmounten.
Stellen Sie sicher, dass Sie sich nicht immer noch im gemounteten Gerät befinden, wenn Sie versuchen, es zu unmounten.