Wie im oben von jiliagre verlinkten Kernel-Commit-Log beschrieben, ist der nsfs
filesystem ist ein virtuelles Dateisystem, das Linux-Kernel-Namespaces verfügbar macht. Es ist getrennt von /proc
"proc"-Dateisystem, in dem einige Prozessverzeichniseinträge auf Inodes in nsfs
verweisen Dateisystem, um anzuzeigen, welche Namespaces ein bestimmter Prozess (oder Thread) gerade verwendet.
Die nsfs
wird nicht in /proc/filesystems
aufgeführt (während proc
tut), also kann es nicht explizit gemountet werden. mount -t nsfs ./namespaces
schlägt mit "unbekannter Dateisystemtyp" fehl. Dies ist als nsfs
da es eng mit der proc
verwoben ist Dateisystem.
Der Dateisystemtyp nsfs
wird nur über /proc/$PID/mountinfo
sichtbar beim Bind-Mounten eines bestehenden (!) Namespace-Dateisystems-Links zu einem anderen Ziel. Wie Stephen Kitt oben richtig angedeutet hat, dient dies dazu, Namensräume bestehen zu lassen, auch wenn kein Prozess sie mehr verwendet.
Erstellen Sie beispielsweise einen neuen Benutzer-Namespace mit einem neuen Netzwerk-Namespace, hängen Sie ihn dann ein und beenden Sie ihn dann:Der Namespace existiert noch, aber lsns
wird es nicht finden, da es nicht in /proc/$PID/ns
aufgeführt ist nicht mehr, existiert aber als (Bind-)Einhängepunkt.
# 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
Die Ausgabe sollte dieser ähneln:
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]
Bitte beachten Sie, dass es nicht möglich ist, Namespaces über das nsfs-Dateisystem zu erstellen, sondern nur über den Syscall clone() (CLONE_NEW...
) und Freigabe aufheben. Die nsfs
spiegelt nur den aktuellen Kernel-Status bzgl. Namespaces, aber es kann sie nicht erstellen oder zerstören.
Namespaces werden automatisch zerstört, wenn kein Verweis mehr auf sie vorhanden ist, keine Prozesse (also kein /proc/$PID/ns/...
) UND auch keine Bind-Mounts, wie wir im obigen Beispiel untersucht haben.
Das ist das "Name Space File System", das von setns
verwendet wird Systemaufruf und, wie der Quellcode zeigt, Namespace-bezogene ioctl's (z. B. NS_GET_USERNS
, NS_GET_OWNER_UID
...)
NSFS
Einträge in Pseudodateien wurden früher von /proc
bereitgestellt Dateisystem bis Linux 3.19. Hier ist das Commit dieser Änderung.
Siehe Stephen Kitts Kommentar zu einer möglichen Erklärung für das Vorhandensein dieser Datei.