Perché il mio mount bind è visibile al di fuori del suo spazio dei nomi mount?


12

Quindi sto cercando di capire come funziona lo spazio dei nomi di mount di Linux. Quindi, ho fatto un piccolo esperimento, ho aperto due terminali ed eseguito il seguente:

Terminale 1

root@goliath:~# mkdir a b
root@goliath:~# touch a/foo.txt
root@goliath:~# unshare --mount -- /bin/bash
root@goliath:~# mount --bind a b
root@goliath:~# ls b
foo.txt

Terminale 2

root@goliath:~# ls b
foo.txt

Come mai il supporto è visibile nel Terminal 2? Dato che non fa parte dello spazio dei nomi mount, mi aspettavo che la directory apparisse vuota qui. Ho anche provato a passare -o shared=noe usare le --make-privateopzioni con mount, ma ho ottenuto lo stesso risultato.

Cosa mi manca e come posso renderlo effettivamente privato?


i mount sono a livello di sistema, non specifici per un ambiente shell. condiviso, schiavo, privato e insostituibile non sono ciò che pensi che siano. lettura man mount.
Cas

3
@cas: sono d'accordo che --make-privatenon è quello che voglio. Ma non è questo il punto di mount dei namespace (che non sono a livello di sistema)?
Errore irreversibile

Risposte:


11

Se sei su una distribuzione basata su systemd con una util-linuxversione inferiore alla 2.27, vedrai questo comportamento non intuitivo. Questo perché CLONE_NEWNSpropaga flag come shareddipendere da un'impostazione nel kernel. Questa impostazione è normalmente private, ma systemd la modifica in shared. A partire dalla util-linux2.27, è stata creata una patch che modifica il comportamento predefinito del unsharecomando da utilizzare privatecome comportamento di propagazione predefinito in modo da renderlo più intuitivo.

Soluzione

Se ci si trova su un sistema systemd con <2.27 util-linux, è necessario rimontare il filesystem di root dopo aver eseguito il unsharecomando:

# unshare --mount -- /bin/bash
# mount --make-private -o remount /

Se sei su un sistema systemd con> = 2.27 util-linux, dovrebbe funzionare come previsto nell'esempio che hai fornito nella tua domanda, alla lettera, senza la necessità di rimontare. In caso contrario: passare --propagation privateal unsharecomando per forzare la propagazione dello spazio dei nomi di mount su privato.


0

questo non ha funzionato in Ubuntu, (15.04 e 14.04). ha funzionato su fedora. e per fedora. se hai bisogno di --make-private o no, puoi anche controllare

cat / proc / self / mountinfo | grep ha condiviso

se condiviso, significa che qualche altro spazio dei nomi può ancora vedere che si monta. Quindi è un problema relativo al sistema. Puoi usare --make-private per farlo funzionare

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.