GNU/Linux >> Belajar Linux >  >> Linux

Apa itu sistem file NSFS?

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.


Linux
  1. Apa trik LD_PRELOAD?

  2. Apa gunanya $# di Bash

  3. Apa kata sandi default layar?

  1. Apa yang membuat Linux menjadi OS yang berkelanjutan

  2. Apa yang membuat komunitas Linux istimewa?

  3. Apa id partisi / tipe sistem file untuk UDF?

  1. Memecahkan masalah menggunakan sistem file proc di Linux

  2. Kelebihan Sistem File Tanpa Partisi?

  3. Apa yang Terjadi Pada Ruang Kosong?