Pokusím se odpovědět na tuto i vaši předchozí otázku, protože spolu souvisí.
Dveře do jmenných prostorů jsou soubory v /proc/*/ns/*
a /proc/*/task/*/ns/*
.
Jmenný prostor je vytvořen procesem zrušení sdílení jeho jmenný prostor. Jmenný prostor lze poté učinit trvalým pomocí připojení vazby ns
soubor na nějaké jiné místo.
To je to, co ip netns
dělá například pro net jmenné prostory. Zruší sdílení jeho net
jmenný prostor a připojení připojení /proc/self/ns/net
na /run/netns/netns-name
.
V /proc
připojený v kořenovém jmenném prostoru pid, můžete vypsat všechny jmenné prostory, které mají v sobě proces:
# readlink /proc/*/task/*/ns/* | sort -u
ipc:[4026531839]
mnt:[4026531840]
mnt:[4026531856]
mnt:[4026532469]
net:[4026531956]
net:[4026532375]
pid:[4026531836]
pid:[4026532373]
uts:[4026531838]
Číslo v hranatých závorkách je číslo inodu.
Chcete-li to získat pro daný proces:
# ls -Li /proc/1/ns/pid
4026531836 /proc/1/ns/pid
Nyní může existovat trvalé jmenné prostory, které v sobě nemají žádný proces. Zjistit je může být mnohem složitější AFAICT.
Nejprve musíte mít na paměti, že připojení může být několik jmenné prostory.
# 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
Těch /mnt/1/a
, /run/netns/a
mohou být soubory jmenného prostoru.
Můžeme získat číslo inodu:
# nsenter --mount=/proc/19877/task/19877/ns/mnt -- ls -Li /mnt/1/a
4026532471 /mnt/1/a
Ale to nám neříká nic jiného, než že to není ve výše vypočítaném seznamu.
Můžeme to zkusit zadat jako kterýkoli z různých typů:
# 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
#
Dobře, to bylo net
soubor jmenného prostoru.
Zdá se tedy, že máme metodu, jak vypsat jmenné prostory:vypsat ns
adresáře všech úloh a poté najděte všechny proc
přípojné body ve všech /proc/*/task/*/mountinfo
a zjistit jejich typ pokusem o jejich zadání.
Pokud máte util-linux v2.28 nebo vyšší můžete použít lsns :
# lsns
NS TYPE NPROCS PID USER COMMAND
4026531836 pid 78 1 root /sbin/init
4026531837 user 79 1 root /sbin/init
4026531838 uts 78 1 root /sbin/init
4026531839 ipc 78 1 root /sbin/init
4026531840 mnt 75 1 root /sbin/init
4026531857 mnt 1 12 root kdevtmpfs
4026531957 net 79 1 root /sbin/init
4026532393 mnt 1 1214 root /lib/systemd/systemd-udevd
4026532415 mnt 1 2930 systemd-timesync /lib/systemd/systemd-timesyncd
4026532477 mnt 1 32596 root -bash
4026532478 uts 1 32596 root -bash
4026532479 ipc 1 32596 root -bash
4026532480 pid 1 32596 root -bash
Oprava:lsns není k dispozici v util-linux v2.27, jak říká tato odpověď. Viz https://www.kernel.org/pub/linux/utils/util-linux/v2.28/v2.28-ReleaseNotes
ps
nyní má výstupní možnosti pro různé typy jmenných prostorů spojených s procesy:ipcns
, mntns
, netns
, pidns
, userns
a utsns
. Pro tuto otázku je relevantní jmenný prostor PID neboli pidns
.
takže pokud byste chtěli zjistit ID jmenného prostoru PID pro, např. pid 459:
# ps -h -o pidns -p 459
4026532661
a vypsat všechny procesy v tomto jmenném prostoru:
ps -o pidns,pid,cmd | awk '$1==4026532661'
nebo pomocí pgrep
, můžete přejít přímo z PID na seznam všech procesů sdílejících stejný jmenný prostor PID:
pgrep -a --ns 459
Na rozdíl od ps
, pgrep
může omezit výstup na konkrétní jmenný prostor (pokud znáte PID jednoho z procesů v něm), ale má velmi omezené možnosti formátování výstupu (pouze PID nebo PID a jejich příkazové řádky)
Výstup pgrep --ns 459
můžete vždy pomocí kanálu pipetovat na xargs ps -f
i když k získání informací, které o procesu potřebujete.