Abnehmbare Geräte (eSATA, USB-Speicher) unter Linux aushängen

Abnehmbare Geräte (eSATA, USB-Speicher) unter Linux aushängen

Ein abnehmbares Gerät wie ein eSATA- oder USB-Laufwerk kann abrupt entfernt werden (durch einfaches Ziehen des Steckers).

Wenn auf einer Partition offene Dateihandles vorhanden sind, umountwird diese Partition nicht ausgehängt, d. h. der Linux-Befehl schlägt fehl, auch NACHDEM das Laufwerk physisch getrennt wurde.

Wenn das Aushängen fehlschlägt, wird auch das erneute Anschließen des Geräts mountfehlschlagen. Sie müssen also herausfinden, welche Prozesse das Laufwerk verwenden und diese beenden oder alle Handles schließen. Wenn Sie beides nicht tun können, müssen Sie die Box neu starten, um Ihr Laufwerk einzuhängen. Und ich kann den Prozess damit definitiv nicht beenden.

Ich sehe keine Option zum „Aushängen erzwingen“. Es gibt eine -fOption, aber sie gilt nur für NFS.

Das klingt sehr seltsam. Ist Linux nicht für dieses Szenario geeignet, bei dem ein Benutzer einfach ein Laufwerk herauszieht? Weiß jemand, wie man dieses Szenario unter Linux elegant handhaben kann?

Gibt es eine Möglichkeit herauszufinden, welche Dateihandles auf einer bestimmten Partition/einem bestimmten Gerät geöffnet sind, oder alle Dateihandles nur für ein bestimmtes Gerät selektiv zu leeren und zu schließen?

Hinweis: Der lsofBefehl ist im von mir verwendeten eingebetteten Linux (Busybox) nicht verfügbar.


„Fuser“ ist in meinem eingebetteten Linux nicht verfügbar.

Ich habe das Lazy-Umount -l ausprobiert. Es scheint jedoch nicht immer zu funktionieren. Nehmen wir zum Beispiel an, ich halte einen Datei-Handle offen (mit „tail -f“ auf einer Datei auf dem Gerät). Dann trenne ich ein Laufwerk und führe „umount -l“ aus, und es wird ausgehängt. Und dann schließe ich das Laufwerk wieder an und versuche, es erneut am selben Einhängepunkt einzuhängen, während das Tail noch läuft. Es funktioniert nicht immer. Manchmal klappt es, manchmal nicht. Das macht mir die Verwendung der Lazy-Option unangenehm, wenn das Dateisystem dadurch in einem inkonsistenten Zustand zurückbleibt. Und ich bin mir auch nicht sicher, ob diese Lazy-Option für solche Szenarien gedacht ist.

Ich kann den Prozess, der Dateihandles geöffnet hat, nicht beenden.


Wenn ich das Gerät beispielsweise auf /mnt/abc gemountet habe und das Laufwerk trenne und dann wieder verbinde, scheint Linux das Dateisystem des Geräts wieder an denselben Mount-Punkt „/mnt/abc“ anzuhängen, ohne dass wir es aushängen oder mounten müssen. Und dann scheinen dieselben alten offenen Datei-Handles nach dem erneuten Anhängen wieder zu funktionieren (zumindest für den Dateilesevorgang). Das ist meine Beobachtung. Ich bin nicht sicher, ob dies das erwartete Verhalten ist. Aber auch dies scheint nicht durchgängig zu funktionieren.

Ich hatte einen offenen Datei-Handle zum Lesen („tail -f“), den ich offen gelassen habe. Dann habe ich ihn abgetrennt und wieder angehängt und dann die Datei geändert, die angehängt wurde. Ich habe gesehen, dass die Ausgabe von „tail -f“ mit den Änderungen aktualisiert wurde. Wenn ich jedoch versuche, eine Datei zu ändern, nachdem das Gerät weg war (es tritt wie erwartet ein Fehler auf) und es dann wieder anhänge, wird das Dateisystem des Geräts nicht richtig wieder an denselben Einhängepunkt angehängt. Im Falle eines Dateischreibens (während das Gerät nicht da war) scheint es nicht zu funktionieren.

Gibt es ein standardmäßiges/konsistentes Verhalten, das Linux verfolgt, wenn ein Laufwerk abrupt entfernt wird, ohne alle Handles zu schließen und alle Partitionen ordnungsgemäß auszuhängen?

Antwort1

Sie können ein Bash-Skript schreiben, um alle aufgelisteten Datei-Deskriptoren zu scannen /proc(wir setzen voraus, dass Sie eines haben) und die Prozesse aufzulisten/zu beenden.

/proc/$m/fd/$nist der n-te Dateideskriptor für PID m, dargestellt als symbolischer Link. busyboxhat Readlink-Unterstützung, Sie sollten es also automatisieren können.

Bearbeiten: Ich möchte nur sagen, dass es sich hierbei im Wesentlichen um eine Neuimplementierung handelt lsof, aber eigentlich ist es ziemlich einfach.

Antwort2

Sie können verwenden, lsofum geöffnete Dateien in einem bestimmten Verzeichnis aufzulisten lsof +D /path/to/mountpoint.

Antwort3

Hast du es versucht:

umount -l /path/to/mountpoint
Oder

fuser -km /path/to/mountpoint
?


Ok, meine vorherigen Vorschläge haben also nicht funktioniert. Ich weiß, dass es vielleicht dumm ist, aber haben Sie tatsächlich Folgendes versucht:

umount -f /path/to/mountpoint

Laut der Busybox-Dokumentation sollte es die Option „Force Unmount“ sein (NFS wird als Beispiel angezeigt).

Wenn das nicht funktioniert, haben Sie Folgendes versucht:

eject -s /dev/my-sata-or-usb-device

Antwort4

Eine schnelle Lösung, wenn Sie keinen haben, lsofwäre, find /proc/*/fd | xargs readlink | grep /mount_pointmount_point durch den tatsächlichen Einhängepunkt zu ersetzen. Dies basiert auf der obigen Antwort von billc.cn.

verwandte Informationen