Umount récursif après le montage rbind

13

Lors de la saisie d'un chroot, il est parfois nécessaire de monter / sys et / dev en utilisant -rbind au lieu de -bind afin de s'assurer que tout est au bon endroit lorsque quelqu'un cherche.

Le problème survient lors du démontage.

Un simple umount échoue toujours; avec les enfants montés également, il semble être utilisé:

$ 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))

Une autre solution possible consiste à répertorier les montages de proc et à démonter chacun d'eux comme ceci:

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

Cependant, cela échoue également car les montages récursifs ne sont pas réellement enregistrés dans la mtab:

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

Peut-être que la solution consiste à effectuer un umount paresseux, mais cela me semble assez dangereux.

Y a-t-il une meilleure façon de faire cela que j'ai raté?

natecornell
la source
1
Êtes-vous sûr qu'il /mnt/chroot/sys/kernel/securityest monté à ce point? Quelle est la sortie de grep /sys/kernel/security /proc/mounts? umountn'a pas besoin que son argument soit répertorié /etc/mtab. Si vous le réussissez -n, il n'ouvrira pas du tout le fichier.
Gilles 'SO- arrête d'être méchant'
Si vous regardez attentivement ma commande grep pour créer les xargs pour umount, je ne lui envoie que les montages répertoriés dans / proc / mounts
natecornell

Réponses:

11

Cela a fonctionné correctement pour moi - /unix//a/264488/4319 :

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

Il était important d'avoir les deux premières commandes comme deux commandes distinctes: ne pas combiner --rbindet --make-rslaveen une seule invocation de mount.

Sans --make-rslave, le comportement était indésirable (et non réussi):

  • umount -l affecterait également les anciens points de montage d'origine,
  • et umount -Rserait affecté par les fichiers occupés (ouverts) sous les anciens points de montage d'origine. (Très inattendu ...)
imz - Ivan Zakharyaschev
la source
Je ne sais pas si cela a été corrigé dans une version récente de mount, mais il est parfaitement correct de combiner --rbindet --make-rslavedans la même invocation de montage:mount --rbind --make-rslave /dev /mnt/test
Javi Merino
1
Bien que vous puissiez combiner les deux arguments, cela lui fait faire un montage non récursif à la place. Donc, cela ne fonctionne pas comme prévu.
Miral
10

Le mérite revient à Gilles pour cette réponse; Gilles a noté dans les commentaires de la question que le commutateur '-n' ignore le mtab et démonte tout ce qui est répertorié dans / proc / mounts.

Depuis la page de manuel:

-n     Unmount without writing in /etc/mtab.

Donc, pour répondre à ma question sur la façon de démêler une monture --rbind, voici la commande complète qui a fonctionné pour moi:

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

Merci, Gilles!

natecornell
la source
1
Essayer mount --rbind / /mnt && umount -n /mnt/dev/shm(ou pts), je comprends umount: /mnt/dev/shm: target is busy. umount -l /mnttue le système (par exemple sudo échoue en disant que stdin n'est pas un tty). C'est sur un système Fedora installé. Je suppose que c'est un vieux problème à moi: unix.stackexchange.com/questions/269695/…
sourcejedi
3

Depuis util-linux v2.23 (25-Apr-2013), la umountcommande prend en charge l' -R, --recursiveoption.

Voici ce que dit la page de manuel:

Démontez récursivement chaque répertoire spécifié. La récursivité de chaque répertoire s'arrêtera si une opération de démontage de la chaîne échoue pour une raison quelconque. La relation entre les points de montage est déterminée par les /proc/self/mountinfo entrées. Le système de fichiers doit être spécifié par le chemin du point de montage; un démontage récursif par nom de périphérique (ou UUID) n'est pas pris en charge.

Paul Tobias
la source
0

Merci pour ça. J'utilise ceci dans mes scripts pour démonter le chroot-tree entier: (Assurez-vous de définir $ MNT en conséquence)

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