Jak je popsáno v protokolu odevzdání jádra, na který odkazuje jiliagre výše, nsfs
filesystem je virtuální souborový systém zpřístupňující jmenné prostory linuxového jádra. Je oddělený od /proc
"proc" souborový systém, kde některé položky adresáře procesů odkazují na inody v nsfs
souborový systém, aby bylo možné ukázat, které jmenné prostory určitý proces (nebo vlákno) aktuálně používá.
nsfs
není uveden v /proc/filesystems
(zatímco proc
ano), takže jej nelze explicitně připojit. mount -t nsfs ./namespaces
selže s "neznámým typem souborového systému". Toto je jako nsfs
protože je úzce propojen s proc
souborový systém.
Typ souborového systému nsfs
se zobrazí pouze pomocí /proc/$PID/mountinfo
při připojování existujícího(!) jmenného prostoru souborového systému odkazu na jiný cíl. Jak Stephen Kitt správně naznačuje výše, jde o zachování jmenných prostorů existujících, i když je již žádný proces nepoužívá.
Vytvořte například nový uživatelský jmenný prostor s novým síťovým jmenným prostorem, poté jej připojte a ukončete:jmenný prostor stále existuje, ale lsns
nenajde, protože není uveden v /proc/$PID/ns
již, ale existuje jako (spojovací) bod připojení.
# 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
Výstup by měl být podobný tomuto:
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]
Vezměte prosím na vědomí, že není možné vytvářet jmenné prostory prostřednictvím souborového systému nsfs, pouze pomocí syscalls clone() (CLONE_NEW...
) a zrušit sdílení. nsfs
odráží pouze aktuální stav jádra w.r.t. jmenné prostory, ale nemůže je vytvořit ani zničit.
Jmenné prostory jsou automaticky zničeny, kdykoli na ně nezůstane žádný odkaz, žádné procesy (takže žádné /proc/$PID/ns/...
) A ani žádné bind-mounty, jak jsme prozkoumali ve výše uvedeném příkladu.
To je "Systém souborů jmenného prostoru", který používá setns
systémové volání a, jak ukazuje jeho zdrojový kód, ioctl související s Name Space (např. NS_GET_USERNS
, NS_GET_OWNER_UID
...)
NSFS
záznamy pseudo-souborů byly poskytovány pomocí /proc
souborový systém do Linuxu 3.19. Zde je potvrzení této změny.
Viz komentář Stephena Kitta o možném vysvětlení přítomnosti těchto souborů.