GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Was ist das NSFS-Dateisystem?

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.


Linux
  1. Was Linux zum nachhaltigen Betriebssystem macht

  2. Was macht die Linux-Community besonders?

  3. Was bedeutet *nix?

  4. Was ist die Partitions-ID / der Dateisystemtyp für UDF?

  5. Was ist der Goldlinker?

Was ist die Shell unter Linux?

Die Vorzüge eines partitionslosen Dateisystems?

Was ist mit dem freien Speicherplatz passiert?

iptables vs. nftables:Was ist der Unterschied?

Was ist der Kill-Befehl in Linux?

Was ist die Logjam-Schwachstelle?