umount: Gerät ist beschäftigt. Warum?

171

Beim Laufen umount /pathbekomme ich:

umount: /path: device is busy.

Das Dateisystem ist riesig und daher lsof +D /pathkeine realistische Option.

lsof /path, lsof +f -- /pathund fuser /pathalle geben nichts zurück. fuser -v /pathgibt:

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

Das ist normal für alle unbenutzten gemounteten Dateisysteme.

umount -lund umount -fist nicht gut genug für meine situation.

Wie finde ich heraus, warum der Kernel meint, dass dieses Dateisystem ausgelastet ist?

Ole Tange
quelle
11
Befindet sich das aktuelle Verzeichnis Ihrer Shell im Mountpoint-Pfad?
LawrenceC
Nein, dann würde Fixiereinheit das sagen.
Ole Tange
12
Sie wollen eigentlich fuser -vm /path...
derobert
5
Für umount --forcewird härter versuchen zu auszuhängen und -voder -vvvnoch mehr wird reaveal , was das Problem mit dem Berg ist. Also versuchen Sie:umount -vvv --force /babdmount
Gaoithe

Antworten:

139

Es scheint, dass der Grund für mein Problem darin nfs-kernel-serverbestand, dass das Verzeichnis exportiert wurde. Das nfs-kernel-servergeht wohl hinter die normal geöffneten Dateien und wird somit nicht von lsofund aufgelistet fuser.

Als ich das stoppte nfs-kernel-serverkonnte ich umountdas Telefonbuch.

Ich habe hier eine Seite mit Beispielen für alle Lösungen erstellt: http://oletange.blogspot.com/2012/04/umount-device-is-busy-why.html

Ole Tange
quelle
54
Vielen Dank, dass Sie Ihre eigene Frage beantwortet haben, anstatt sie bei der Implementierung Ihrer Lösung abzubrechen. Ihre Antwort hat mir geholfen, eine ähnlich exportierte NFS-Freigabe zu finden.
Jeff Welling
7
Dasselbe Problem kann auch auftreten, wenn Sie Loopback-Geräte im Dateisystem eingerichtet haben - beispielsweise, wenn / dev / loop0 durch eine Datei in / path gesichert ist.
BCran
1
Ich musste sudo service samba stopzuerst Ihre Antwort wirklich aushelfen!
Malat
1
Dieser Beitrag erinnerte mich daran, dass der nfs-Dienst nach einigen Stunden ausgeführt wurde, nachdem ich versucht hatte, dies herauszufinden. Verwenden sudo service nfs stopSie in RHEL6 / CentOS6 und müssen Sie möglicherweise (nicht) auch tun, sudo exportfs -uum das Exportieren rückgängig zu machen. Denken Sie daran, dann sudo exportfs -rund sudo service nfs startwieder auszuführen und den Dienst neu starten.
Code_dredd
1
In meinem Fall musste der nfs-Server nicht gestoppt werden, sondern nur exportfs -udas betreffende Verzeichnis.
Law29
42

Hinzufügen zu BruceCran ‚s Kommentar war oben, die Ursache für meine Manifestation dieses Problems gerade jetzt eine veraltete Loopback montieren. Ich würde überprüft bereits die Ausgabe von fuser -vm <mountpoint>/ lsof +D <mountpoint>, mountund cat /proc/mounts, überprüft , ob ein alter nfs-kernel-server ausgeführt wurde, ausgeschaltet Quoten, versucht (aber nicht) ein umount -f <mountpoint>und alle , aber fand mich 924 Tage uptime , bevor sie schließlich zum Verzicht auf die Ausgangsprüfung von losetupund Auffinden von zwei veralteten, konfigurierten, aber nicht gemounteten Loopbacks:

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

dann

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#

Ein Gentoo- Forumbeitrag listet auch Swap-Dateien als möglichen Schuldigen auf. Obwohl das Austauschen von Dateien heutzutage sehr selten ist, kann es nicht schaden, die Ausgabe von zu überprüfen cat /proc/swaps. Ich bin mir nicht sicher, ob Quoten jemals ein Absteigen verhindern könnten - ich habe mich an Strohhalme geklammert.

ZakW
quelle
12
Alle 924 Tage Betriebszeit bedeuten, dass Sie Ihre Kernel-Patches aktualisieren müssen :-)
w00t
+1 für Auslagerungsdateien zu erwähnen, sie tun Block Aushängen und sind so ziemlich nicht nachweisbar , wenn Sie sie nicht direkt einlagern möchten .
P.Péter,
22

Anstatt lsof zum Durchsuchen des Dateisystems zu verwenden, verwenden Sie einfach die Gesamtliste der geöffneten Dateien und suchen Sie danach. Ich finde, das muss schneller gehen, obwohl es weniger genau ist. Es sollte die Arbeit erledigen.

lsof | grep '/path'
Caleb
quelle
1
lsof / path schaut nur durch den Pfad.
Ole Tange
7
Ich habe nicht gesagt lsof /path, sagte ich lsof | grep '/path'. Der Unterschied ist, dass lsof ohne Argumente alle offenen Dateien mit einer Art Cache-Tabelle anzeigt und grep sehr schnell darin sucht. Die Dinge, die Sie mit lsof versucht haben, lassen es das Dateisystem durchsuchen, was sehr lange dauert.
Caleb
1
Wie gesagt: lsof /pathschaut nur auf den Weg. Es wird nicht jede einzelne Datei angezeigt. Es ist oft viel schneller als lsof | grep /path(in meinem unwissenschaftlichen Test war es YMMV 20-mal schneller), da es nicht alle geöffneten Dateien, sondern nur die Dateien für diesen Pfad betrachtet.
Ole Tange
Ich bin mir nicht sicher, was der technische Unterschied ist, aber als ich einen veralteten NFS-Mount untersuchte, lsof /pathergab sich nichts, während lsof | grep /pathmir der Prozess gezeigt hat, der geöffnete Dateien zurückhielt und mich daran hinderte, den Mount des Volumes aufzuheben.
dpw
20

Für mich war der beleidigende Prozess ein Daemon, der in einer Chroot läuft. Weil es in einer Chroot war lsofund fuseres nicht finden würde.

Wenn Sie den Verdacht haben, dass noch etwas in einer Chroot läuft, sudo ls -l /proc/*/root | grep chrootwerden Sie den Täter finden (ersetzen Sie "Chroot" durch den Pfad zur Chroot).

Cibyr
quelle
1
Nizza, und in FreeBSD habe ich sudo ls -l /proc/*/status | grep HOST
Folgendes
1
Auf meinem System (Mint Qiana) lsof /mountpointund fuser /mountpointbeiden finden einen Prozess, auch wenn chrooted.
Ole Tange
9

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
5

Damit die Fixiereinheit über die PIDs berichtet, die einen Mount offenhalten, müssen Sie -m verwenden

fuser -m /path
Patrick
quelle
2
lsof /pathRichtig , aber irrelevant: Bietet die gleiche Liste von PIDs wie fuser -m /path.
Gilles
fuser -M /pathprüft, ob /pathes sich um einen Mountpoint handelt.
user3804598
5

Wir haben ein proprietäres System, bei dem das Root-Dateisystem normalerweise schreibgeschützt ist. Gelegentlich, wenn Dateien kopiert werden müssen, wird der Schreib- / Lesezugriff erneut aktiviert:

mount -oremount,rw /

Und dann wieder montiert:

mount -oremount,ro /

Diesmal gab es jedoch mountimmer wieder den mount: / is busyFehler. Es wurde von einem Prozess verursacht einen offenen Descriptor in eine Datei hält , das war ersetzt durch einen Befehl, der ausgeführt wurde , wenn das Dateisystem read-write wurde. Die wichtige Zeile aus der lsof -- /Ausgabe ist (Namen wurden geändert):

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

Beachten Sie die DELin der Ausgabe. Durch einen einfachen Neustart des Prozesses, bei dem die gelöschte Datei beibehalten wurde, wurde das Problem behoben.

pdp
quelle
3
Die Zusammenfassung lautet also: Prozess, bei dem eine Datei geöffnet wurde, die entfernt wurde. Guter Input.
Ole Tange
4

lsofund fuserhat mir auch nichts gegeben.

Nachdem ich alle möglichen Verzeichnisse in .old umbenannt und das System jedes Mal neu gestartet hatte, nachdem ich Änderungen vorgenommen hatte, fand ich ein bestimmtes Verzeichnis (in Bezug auf Postfix), das dafür verantwortlich war.

Es stellte sich heraus, dass ich einmal einen Symlink von /var/spool/postfixbis erstellt /disk2/pers/mail/postfix/varspoolhatte, um die Anzahl der Schreibvorgänge auf einem SDCARD-basierten Root-Dateisystem (Sheeva Plug) zu minimieren.

Mit diesem Symlink auch nach dem Anhalten postfixund dovecotDienstleistungen (sowohl ps auxals auch netstat -tuanpzeigte nichts verwandten) Ich war nicht in der Lage unmount /disk2/pers.

Als ich den Symlink entfernte und die Dateien postfixund dovecotconfig aktualisierte , um direkt auf die neuen Verzeichnisse zu verweisen, /disk2/pers/konnte ich die Dienste und unmountdas Verzeichnis erfolgreich stoppen .

Nächstes Mal werde ich mir die Ausgabe von:

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

Der obige Befehl listet rekursiv alle symbolischen Links in einem Verzeichnisbaum auf (hier beginnend mit /var) und filtert die Namen heraus, die auf einen bestimmten Ziel-Mount-Punkt verweisen (hier disk2).

captcha
quelle
3

Ich hatte dieses Problem und es stellte sich heraus, dass es im Hintergrund aktive Bildschirmsitzungen gab, von denen ich nichts wusste. Ich habe eine Verbindung zu der anderen aktiven Bildschirmsitzung hergestellt, und die Shell befand sich noch nicht einmal im bereitgestellten Verzeichnis. Das Beenden dieser anderen Shell-Sitzungen hat das Problem für mich behoben.

Ich dachte nur, ich würde meine Entschlossenheit teilen.

Colemanm
quelle
1

Heute war das Problem eine offene Steckdose (speziell 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
Ole Tange
quelle
1

Ich habe ein paar bindund overlayHalterungen unter meiner Halterung , die mich versperrten, überprüfen Sie die Tab - Vervollständigung für den Mount-Punkt , den Sie aushängen wollen. Ich vermute, es war vor allem das Overlay-Mount, könnte aber auch das Binding gewesen sein

ThorSummoner
quelle
1

Dies ist eher ein Workaround als eine Antwort, aber ich poste es, falls es jemandem helfen könnte.

In meinem Fall habe ich versucht, die LVM zu ändern, da ich die / var-Partition vergrößern wollte, also musste ich sie ummounten. Ich habe alle in diesem Beitrag kommentierten und beantworteten Fragen beantwortet (danke an alle und vor allem an @ ole-tange für das Sammeln) und trotzdem den Fehler "Gerät ist beschäftigt" erhalten.

Ich habe versucht, die meisten Prozesse in der im Runlevel 0 angegebenen Reihenfolge zu beenden, nur für den Fall, dass die Reihenfolge in meinem Fall relevant war, aber das hat auch nicht geholfen. Ich habe mir also ein benutzerdefiniertes Runlevel erstellt (das die Ausgabe von chkconfig in neue chkconfig --level-Befehle kombiniert), das 1 (Einzelbenutzermodus) sehr ähnlich ist, aber über Netzwerkfunktionen (mit ssh network und xinet) verfügt.

Da ich RedHat verwendet habe, ist Runlevel 4 als "unbenutzt / benutzerdefiniert" markiert, daher habe ich dieses verwendet und ausgeführt. init 4 In meinem Fall war dies in Ordnung, da ich den Server in jedem Fall neu starten musste , aber wahrscheinlich wird dies der Fall sein von jemandem, der die Scheiben zwickt.

Gabriel Xunqueira
quelle