Rekursives umount nach rbind mount

13

Bei der Eingabe einer Chroot ist es manchmal erforderlich, / sys und / dev mit -rbind anstelle von -bind zu mounten, um sicherzustellen, dass sich beim Suchen alles an der richtigen Stelle befindet.

Das Problem tritt beim Aushängen auf.

Ein einfacher Umount schlägt immer fehl. Auch mit den Kindern scheint es in Gebrauch zu sein:

$ umount /mnt/chroot/sys
umount: /mnt/chroot/sys: device is busy.
    (In some cases useful info about processes that use
     the device is found by lsof(8) or fuser(1))

Eine andere mögliche Lösung besteht darin, die Mounts aus proc aufzulisten und die Mounts wie folgt umzuhängen:

$ grep /mnt/chroot/sys /proc/mounts | cut -f2 -d" " | sort -r | xargs umount

Dies schlägt jedoch ebenfalls fehl, da die rekursiven Mounts nicht tatsächlich im Mtab registriert sind:

/mnt/chroot/sys/kernel/security is not mounted (according to mtab)

Vielleicht besteht die Lösung darin, ein langsames Umount durchzuführen, aber das scheint mir ziemlich gefährlich zu sein.

Gibt es dafür einen besseren Weg, den ich verpasst habe?

Natecornell
quelle
1
Sind Sie sicher, dass /mnt/chroot/sys/kernel/securityan diesem Punkt montiert ist? Was ist die Ausgabe von grep /sys/kernel/security /proc/mounts? umountbraucht kein Argument, um in aufgeführt zu werden /etc/mtab. Wenn Sie es bestehen -n, wird die Datei überhaupt nicht geöffnet.
Gilles 'SO - hör auf böse zu sein'
Wenn Sie sich meinen grep-Befehl zum Erstellen der xargs für umount genau ansehen, sende ich ihm nur die in / proc / mounts
natecornell 22.03.14

Antworten:

11

Das hat bei mir korrekt funktioniert - /unix//a/264488/4319 :

mount --rbind /dev /mnt/test
mount --make-rslave /mnt/test
umount -R /mnt/test

Es war wichtig, die beiden ersten Befehle als zwei separate Befehle zu haben: nicht kombinieren --rbindund --make-rslavein einem Aufruf von mount.

Ohne --make-rslavewar das Verhalten unerwünscht (und nicht erfolgreich):

  • umount -l würde auch die ursprünglichen alten Mountpoints beeinflussen,
  • und umount -Rwürde von den ausgelasteten (offenen) Dateien unter den ursprünglichen alten Mountpunkten betroffen sein. (Sehr unerwartet ...)
imz - Ivan Zakharyaschev
quelle
Ich weiß nicht, ob dies in einer neueren Version von mount behoben wurde, aber es ist vollkommen in Ordnung, dies --rbindmit --make-rslavedemselben Aufruf von mount zu kombinieren :mount --rbind --make-rslave /dev /mnt/test
Javi Merino,
1
Sie können die beiden Argumente zwar kombinieren, es wird jedoch stattdessen ein nicht rekursiver Mount durchgeführt. Es funktioniert also nicht wie vorgesehen.
Miral
10

Die Antwort geht an Gilles . Gilles bemerkte in den Fragenkommentaren, dass der '-n'-Schalter das mtab ignoriert und alle in / proc / mounts aufgelisteten Aktivitäten beendet.

Aus der Manpage:

-n     Unmount without writing in /etc/mtab.

Um meine Frage zu beantworten, wie ein --rbind-Mount entschlüsselt werden kann, ist dies der vollständige Befehl, der für mich funktioniert hat:

grep /mnt/chroot/sys /proc/mounts | cut -f2 -d" " | sort -r | xargs umount -n

Merci, Gilles!

Natecornell
quelle
1
Versuche mount --rbind / /mnt && umount -n /mnt/dev/shm(oder Punkte), ich verstehe umount: /mnt/dev/shm: target is busy. umount -l /mntbricht das System ab (z. B. sagt sudo nicht, dass stdin kein tty ist). Dies ist auf einem installierten Fedora-System. Ich denke, es ist ein altes Problem von mir: unix.stackexchange.com/questions/269695/…
sourcejedi
3

Seit util-linux v2.23 (25. April 2013) umountunterstützt der Befehl die -R, --recursiveOption.

Folgendes steht auf der Manpage:

Hängen Sie jedes angegebene Verzeichnis rekursiv aus. Die Rekursion für jedes Verzeichnis wird beendet, wenn ein Vorgang zum Aufheben der Bereitstellung in der Kette aus irgendeinem Grund fehlschlägt. Die Beziehung zwischen Mountpunkten wird durch /proc/self/mountinfo Einträge bestimmt. Das Dateisystem muss durch den Mountpoint-Pfad angegeben werden. Ein rekursives Aufheben der Bereitstellung nach Gerätename (oder UUID) wird nicht unterstützt.

Paul Tobias
quelle
0

Dank dafür. Ich benutze dies in meinen Skripten, um den gesamten Chroot-Baum zu entladen: (Stellen Sie sicher, dass Sie $ MNT entsprechend einstellen)

for dir in $(grep "$MNT" /proc/mounts | cut -f2 -d" " | sort -r)
do
    umount $dir 2> /dev/null
    (( $? )) && umount -n $dir
done
Justin Sane
quelle