Я спробую відповісти і на це, і на ваше попереднє запитання, оскільки вони пов'язані.
Двері в простори імен - це файли в /proc/*/ns/*
і /proc/*/task/*/ns/*
.
Простір імен створюється процесом, який видаляє його простір імен. Простір імен може бути зроблено постійним, скрутне-монтажним на ns
файл в іншому місці.
Це те, що ip netns
стосується, наприклад, чистих просторів імен. Це його заборонити обмін використання net
простору імен і Bind-кріплення /proc/self/ns/net
до ./run/netns/netns-name
У /proc
змонтованому просторі імен кореневого підпису ви можете перелічити всі простори імен, які мають у них процес, виконавши:
# readlink /proc/*/task/*/ns/* | sort -u
ipc:[4026531839]
mnt:[4026531840]
mnt:[4026531856]
mnt:[4026532469]
net:[4026531956]
net:[4026532375]
pid:[4026531836]
pid:[4026532373]
uts:[4026531838]
Число в квадратних дужках - це число індексу.
Щоб отримати це для певного процесу:
# ls -Li /proc/1/ns/pid
4026531836 /proc/1/ns/pid
Тепер можуть бути постійні простори імен, у яких немає жодного процесу. Виявити їх може бути набагато складніше AFAICT.
По- перше, ви повинні мати на увазі , що там може бути кілька монтування просторів імен.
# awk '$9 == "proc" {print FILENAME,$0}' /proc/*/task/*/mountinfo | sort -k2 -u
/proc/1070/task/1070/mountinfo 15 19 0:3 / /proc rw,nosuid,nodev,noexec,relatime - proc proc rw
/proc/19877/task/19877/mountinfo 50 49 0:3 / /run/netns/a rw,nosuid,nodev,noexec,relatime shared:2 - proc proc rw
/proc/19877/task/19877/mountinfo 57 40 0:3 / /proc rw,nosuid,nodev,noexec,relatime - proc proc rw
/proc/1070/task/1070/mountinfo 66 39 0:3 / /run/netns/a rw,nosuid,nodev,noexec,relatime shared:2 - proc proc rw
/proc/19877/task/19877/mountinfo 68 67 0:3 / /mnt/1/a rw,nosuid,nodev,noexec,relatime unbindable - proc proc rw
Ті /mnt/1/a
, /run/netns/a
можуть бути файлами простір імен.
Ми можемо отримати номер inode:
# nsenter --mount=/proc/19877/task/19877/ns/mnt -- ls -Li /mnt/1/a
4026532471 /mnt/1/a
Але це не говорить нам багато іншого, ніж його немає у списку, обчисленому вище.
Ми можемо спробувати ввести його як будь-який із різних типів:
# nsenter --mount=/proc/19877/task/19877/ns/mnt -- nsenter --pid=/mnt/1/a true
nsenter: reassociate to namespace 'ns/pid' failed: Invalid argument
# nsenter --mount=/proc/19877/task/19877/ns/mnt -- nsenter --mount=/mnt/1/a true
nsenter: reassociate to namespace 'ns/mnt' failed: Invalid argument
# nsenter --mount=/proc/19877/task/19877/ns/mnt -- nsenter --net=/mnt/1/a true
#
Добре, це був net
файл простору імен.
Тому, здавалося б, у нас є метод перерахування просторів імен: перерахуйте ns
каталоги всіх завдань, а потім знайдіть усі точки proc
монтажу у всіх /proc/*/task/*/mountinfo
та визначте їх тип, намагаючись ввести їх.