Umount ricorsivo dopo il montaggio rbind


13

Quando si entra in un chroot è talvolta necessario montare / sys e / dev usando -rbind anziché -bind per assicurarsi che tutto sia nel posto giusto quando qualcuno va a cercare.

Il problema si presenta quando si smonta.

Un semplice umount fallisce sempre; con i bambini montati pure sembra essere in uso:

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

Un'altra possibile soluzione è elencare i montaggi da proc e smontare ognuno di quelli in questo modo:

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

Tuttavia, ciò fallisce anche perché i montaggi ricorsivi non sono effettivamente registrati in mtab:

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

Forse la soluzione è eseguire un pigro umount, ma questo mi sembra piuttosto pericoloso.

C'è un modo migliore per farlo che mi sono perso?


1
Sei sicuro che /mnt/chroot/sys/kernel/securitysia montato a quel punto? Qual è l'output di grep /sys/kernel/security /proc/mounts? umountnon ha bisogno che il suo argomento sia elencato in /etc/mtab. Se lo passi -n, non aprirà affatto il file.
Gilles 'SO- smetti di essere malvagio' il

Se osservi attentamente il mio comando grep per creare gli xargs per umount, gli
invierò

Risposte:


11

Questo ha funzionato correttamente per me - /unix//a/264488/4319 :

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

Era importante avere i primi due comandi come due comandi separati: non combinare --rbinde --make-rslavein un'unica invocazione di mount.

Senza --make-rslave, il comportamento era indesiderato (e non ha avuto successo):

  • umount -l influenzerebbe anche i vecchi mountpoint originali,
  • e umount -Rsarebbero interessati dai file occupati (aperti) sotto i vecchi mountpoint originali. (Molto inaspettato ...)

Non so se questo è stato risolto in una versione recente di mount, ma è perfettamente ok combinare --rbinde --make-rslavenella stessa invocazione mount:mount --rbind --make-rslave /dev /mnt/test
Javi Merino

1
Mentre puoi combinare i due argomenti, fa invece un montaggio non ricorsivo. Quindi in realtà non funziona come previsto.
Miral,

10

Il merito va a Gilles per questa risposta; Gilles ha notato nella domanda commenti che l'opzione '-n' ignora il mtab e smonta tutto ciò che è elencato in / proc / mounts.

Dalla manpage:

-n     Unmount without writing in /etc/mtab.

Quindi, per rispondere alla mia domanda su come svelare un mount --rbind, questo è il comando completo che ha funzionato per me:

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

Merci, Gilles!


1
Provando mount --rbind / /mnt && umount -n /mnt/dev/shm(o punti), capisco umount: /mnt/dev/shm: target is busy. umount -l /mntuccide il sistema (es. sudo non riesce a dire che stdin non è un tty). Questo è su un sistema Fedora installato. Immagino sia un mio vecchio problema: unix.stackexchange.com/questions/269695/…
sourcejedi

3

Da util-linux v2.23 (25-apr-2013) il umountcomando supporta l' -R, --recursiveopzione.

Ecco cosa dice la pagina man:

Smontare ricorsivamente ogni directory specificata. La ricorsione per ciascuna directory verrà interrotta se qualsiasi operazione di smontaggio nella catena fallisce per qualsiasi motivo. La relazione tra mountpoint è determinata dalle /proc/self/mountinfo voci. Il filesystem deve essere specificato dal percorso mountpoint; uno smontaggio ricorsivo per nome dispositivo (o UUID) non è supportato.


0

Grazie per quello Lo uso nei miei script per smontare l'intero albero chroot: (Assicurati di impostare $ MNT di conseguenza)

for dir in $(grep "$MNT" /proc/mounts | cut -f2 -d" " | sort -r)
do
    umount $dir 2> /dev/null
    (( $? )) && umount -n $dir
done
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.