Я постараюсь ответить на этот и ваш предыдущий вопрос, поскольку они связаны между собой.
Двери в пространства имен - это файлы в /proc/*/ns/*
и /proc/*/task/*/ns/*
.
Пространство имен создается процессом, не разделяющим его пространство имен. Пространство имен может быть сделано постоянным, затруднительное-монтажным на ns
файл в другом месте.
Вот что ip netns
делает, например, для сетевых пространств имен. Он разделяет свое net
пространство имен и привязывается /proc/self/ns/net
к ./run/netns/netns-name
В /proc
смонтированном в пространстве имен корневого pid вы можете перечислить все пространства имен, в которых есть процесс, выполнив:
# 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.
Во-первых, вы должны иметь в виду, что может быть несколько пространств имен mount .
# 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
могут быть файлами пространство имен.
Мы можем получить номер индекса:
# 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
и выясните их тип, пытаясь ввести их.
lsns
очень полезен, но он показывает только самый низкий PID в каждом пространстве имен - т.е. он не может сказать вам пространство имен для любого произвольного PID. +1 в любом случае, потому что это все еще полезный ответ, даже если он не дает прямого ответа на вопрос.где
$PID
идентификатор процесса, который вы можете получить различными способами.http://man7.org/linux/man-pages/man8/ip-netns.8.html
источник
ip netns
(или, по крайней мере, созданы чем-то, что привязывает-монтирует двери пространства имен в / run / netns, как этоip netns
делает). В основном он ищет в / run / netns файлы, которые совпадают с/proc/$PID/ns/net
./run/netns
даже не существует на моем компьютере./run/netns
или везде, гдеip
bind-монтирует специальные файлы пространства имен.findmnt -t nsfs
может сказать вам, где он находится в вашей системе. OTOH, если вы это сделаетеunshare -n sleep 1000 & ip netns identify "$!"
, вы ничего не получите.findmnt -t nsfs
- ничего такого.unshare -n sleep 1000 & ip netns identify "$!"
- unshare: unshare failed: Операция не разрешенаfindmnt -t nsfs
возврат ничего не говорит о том, что у вас нет банкоматов на вашем банкомате.ps
теперь имеют параметры вывода для различных типов пространств имен , связанных с процессами:ipcns
,mntns
,netns
,pidns
,userns
, иutsns
. Для этого вопроса релевантным является пространство имен PID, илиpidns
.поэтому, если вы хотите узнать идентификатор пространства имен PID для, например, pid 459:
и перечислить все процессы в этом пространстве имен:
или с помощью
pgrep
, вы можете перейти непосредственно от PID к списку всех процессов, совместно использующих то же пространство имен PID:В отличие от этого
ps
,pgrep
может ограничивать вывод определенным пространством имен (если вы знаете PID одного из процессов в нем), но имеет очень ограниченные возможности форматирования вывода (только PID или PID и их командные строки)Вы всегда можете трубы выход ,
pgrep --ns 459
чтобыxargs ps -f
хотя для получения необходимой информации о процессе.источник
Пространство имен-Листер :
Вы можете использовать listns.py
Использование:
./listns.py
илиpython2 listns.py
Чтобы точно ответить на этот вопрос, вы можете получить результат, подобный этомуpython2 listns.py | grep $PID
(замените переменную pid)Источник: github-mirror и статья предоставлены Ralf Trezeciak
Пространства имен сети :
Для сетевого пространства имен
ip netns identify $PID
можно использовать.Nsutils
Обеспечьте,
pidnslist
чтобы возвращалось пространство имен pid процессаисточник