Mengapa bind mount saya terlihat di luar mount namespace-nya?

12

Jadi saya mencoba memahami bagaimana cara kerja mount namespace Linux. Jadi, saya melakukan sedikit percobaan dan membuka dua terminal dan menjalankan yang berikut:

Terminal 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

Terminal 2

root@goliath:~# ls b
foo.txt

Kenapa mount terlihat di Terminal 2? Karena ini bukan bagian dari mount namespace, saya berharap direktori tersebut tampak kosong di sini. Saya juga mencoba melewati -o shared=nodan menggunakan --make-privateopsi dengan mount, tetapi saya mendapat hasil yang sama.

Apa yang saya lewatkan dan bagaimana cara menjadikannya benar-benar pribadi?

Kesalahan fatal
sumber
mount adalah sistem-lebar, tidak khusus untuk lingkungan shell. dibagikan, budak, pribadi, dan tidak terikat bukan seperti yang Anda pikirkan. baca man mount.
cas
3
@cas: Setuju --make-privatebukan itu yang saya inginkan. Tapi, bukankah itu titik mount namespaces (bahwa mereka tidak lebar sistem)?
FatalError

Jawaban:

11

Jika Anda menggunakan distribusi berbasis sistemd dengan util-linuxversi kurang dari 2.27, Anda akan melihat perilaku tidak intuitif ini. Ini karena CLONE_NEWNSflag-flag pendukung seperti sharedtergantung pada pengaturan di kernel. Pengaturan ini normal private, tetapi systemd mengubahnya ke shared. Pada util-linux2.27, sebuah tambalan dibuat yang mengubah perilaku default dari unshareperintah untuk digunakan privatesebagai perilaku propagasi default menjadi lebih intuitif.

Larutan

Jika Anda menggunakan sistem systemd dengan <2.27 util-linux, Anda harus mengount ulang sistem file root setelah menjalankan unshareperintah:

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

Jika Anda menggunakan sistem systemd dengan> = 2.27 util-linux, itu harus berfungsi seperti yang diharapkan dalam contoh yang Anda berikan dalam pertanyaan Anda, kata demi kata, tanpa perlu untuk mengount ulang. Jika tidak: lulus--propagation private dengan unshareperintah untuk memaksa penyebaran mount namespace untuk menjadi pribadi.

Dave
sumber
0

ini tidak berfungsi di ubuntu, (15.04 dan 14.04). itu bekerja pada fedora. dan untuk fedora. apakah Anda perlu --membuat pribadi atau tidak, Anda juga dapat memeriksa

cat / proc / self / mountinfo | grep dibagikan

jika dibagikan, itu berarti beberapa namespace lain masih bisa melihat tunggangan itu. Maka itu adalah masalah terkait systemd. Anda dapat menggunakan --make-private untuk membuatnya bekerja

Kennan
sumber