Estou verificando os namespaces associados a um processo de shell da seguinte maneira:
# ll /proc/$$/ns
total 0
dr-x--x--x 2 root root 0 May 2 15:10 ./
dr-xr-xr-x 9 root root 0 May 1 18:39 ../
lrwxrwxrwx 1 root root 0 May 2 15:11 cgroup -> cgroup:[4026531835]
lrwxrwxrwx 1 root root 0 May 2 15:11 ipc -> ipc:[4026531839]
lrwxrwxrwx 1 root root 0 May 2 15:11 mnt -> mnt:[4026531840]
lrwxrwxrwx 1 root root 0 May 2 15:11 net -> net:[4026531957]
lrwxrwxrwx 1 root root 0 May 2 15:11 pid -> pid:[4026531836]
lrwxrwxrwx 1 root root 0 May 2 15:11 user -> user:[4026531837]
lrwxrwxrwx 1 root root 0 May 2 15:11 uts -> uts:[4026531838]
Eu entendo que as entradas indicam a quais namespaces um processo está associado. Eu quero perguntar de onde vêm os números, identificando cada namespace?
Por exemplo, a saída acima indica que o namespace de montagem do processo é mnt:[4026531840]
. Eu verifiquei a estrutura do namespace de montagem :
8 struct mnt_namespace {
9 atomic_t count;
10 struct ns_common ns;
11 struct mount * root;
12 struct list_head list;
13 struct user_namespace *user_ns;
14 struct ucounts *ucounts;
15 u64 seq; /* Sequence number to prevent loops */
16 wait_queue_head_t poll;
17 u64 event;
18 unsigned int mounts; /* # of mounts in the namespace */
19 unsigned int pending_mounts;
20 } __randomize_layout;
Não vejo um campo que sirva como identificador a ser usado nas /proc/PID/ns/
entradas. Então, como esses identificadores são gerados?
Eles são os números de inode de arquivos implementados pelo
nsfs
sistema de arquivos, que podem ser abertos e usados com osetns(2)
para associar um processo a um namespace.Você pode dar uma olhada em
fs/nsfs.c
:e
fs/proc/namespaces.c
: