Seperti yang dijelaskan dalam log komit kernel yang ditautkan oleh jiliagre di atas, nsfs
filesystem adalah sistem file virtual yang menyediakan ruang nama kernel Linux. Ini terpisah dari /proc
sistem file "proc", di mana beberapa entri direktori proses mereferensikan inode dalam nsfs
sistem file untuk menunjukkan ruang nama mana yang sedang digunakan proses (atau utas) tertentu.
nsfs
tidak terdaftar di /proc/filesystems
(sementara proc
tidak), sehingga tidak dapat dipasang secara eksplisit. mount -t nsfs ./namespaces
gagal dengan "tipe sistem file tidak dikenal". Ini adalah, sebagai nsfs
karena terjalin erat dengan proc
sistem file.
Jenis sistem file nsfs
hanya terlihat melalui /proc/$PID/mountinfo
ketika mengikat-mount tautan sistem file namespace (!) yang ada ke target lain. Seperti yang disarankan oleh Stephen Kitt di atas, ini untuk menjaga ruang nama tetap ada meskipun tidak ada proses yang menggunakannya lagi.
Misalnya, buat namespace pengguna baru dengan namespace jaringan baru, lalu ikat-pasang, lalu keluar:namespace masih ada, tetapi lsns
tidak akan menemukannya, karena tidak terdaftar di /proc/$PID/ns
lagi, tetapi ada sebagai titik pemasangan (mengikat).
# bind mount only needs an inode, not necessarily a directory ;)
touch mynetns
# create new network namespace, show its id and then bind-mount it, so it
# is kept existing after the unshare'd bash has terminated.
# output: net:[##########]
NS=$(sudo unshare -n bash -c "readlink /proc/self/ns/net && mount --bind /proc/self/ns/net mynetns") && echo $NS
# notice how lsns cannot see this namespace anymore: no match!
lsns -t net | grep ${NS:5:-1} || echo "lsns: no match for net:[${NS:5:-1}]"
# however, findmnt does locate it on the nsfs...
findmnt -t nsfs | grep ${NS:5:-1} || echo "no match for net:[${NS:5:-1}]"
# output: /home/.../mynetns nsfs[net:[##########]] nsfs rw
# let the namespace go...
echo "unbinding + releasing network namespace"
sudo umount mynetns
findmnt -t nsfs | grep ${NS:5:-1} || echo "findmnt: no match for net:[${NS:5:-1}]"
# clean up
rm mynetns
Keluaran harus serupa dengan yang ini:
net:[4026532992]
lsns: no match for net:[4026532992]
/home/.../mynetns nsfs[net:[4026532992]] nsfs rw
unbinding + releasing network namespace
findmnt: no match for net:[4026532992]
Harap perhatikan bahwa tidak mungkin membuat ruang nama melalui sistem file nsfs, hanya melalui syscalls clone() (CLONE_NEW...
) dan batal berbagi. nsfs
hanya mencerminkan status kernel saat ini w.r.t. ruang nama, tetapi tidak dapat membuat atau menghancurkannya.
Ruang nama secara otomatis dihancurkan setiap kali tidak ada referensi yang tersisa, tidak ada proses (jadi tidak ada /proc/$PID/ns/...
) DAN tidak ada bind-mount juga, seperti yang telah kita jelajahi pada contoh di atas.
Itulah "Sistem File Ruang Nama", yang digunakan oleh setns
panggilan sistem dan, seperti yang ditunjukkan oleh kode sumbernya, ioctl terkait Name Space (mis. NS_GET_USERNS
, NS_GET_OWNER_UID
...)
NSFS
entri pseudo-file biasanya disediakan oleh /proc
sistem file hingga Linux 3.19. Inilah komit dari perubahan ini.
Lihat komentar Stephen Kitt tentang kemungkinan penjelasan tentang keberadaan file ini.