GNU/Linux >> Znalost Linux >  >> Linux

Co je to souborový systém NSFS?

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ů.


Linux
  1. Čím je linuxová komunita výjimečná?

  2. Odstraňte problémy s použitím souborového systému proc na Linuxu

  3. Co znamená *nix?

  1. Co dělá Linux udržitelným OS

  2. Linux vs. Unix:Jaký je rozdíl?

  3. Jaké je ID oddílu / typ souborového systému pro UDF?

  1. Jaký je trik LD_PRELOAD?

  2. Co znamená POSIX?

  3. Jaký je koncept vruntime v CFS