Spróbuję odpowiedzieć zarówno na to, jak i na twoje wcześniejsze pytanie, ponieważ są one powiązane.
Drzwi do przestrzeni nazw to pliki w /proc/*/ns/*
i /proc/*/task/*/ns/*
.
Przestrzeń nazw jest tworzona przez proces, który nie udostępnia swojej przestrzeni nazw. Przestrzeń nazw może być na stałe przez Dowiązywanie ten ns
plik w jakimś innym miejscu.
Tak ip netns
działa na przykład przestrzeń nazw netto . Dzieli net
przestrzeń nazw i łączy się /proc/self/ns/net
z nimi ./run/netns/netns-name
W /proc
zamontowanym w głównej przestrzeni nazw pid możesz wyświetlić listę wszystkich przestrzeni nazw, które mają w nich proces, wykonując:
# readlink /proc/*/task/*/ns/* | sort -u
ipc:[4026531839]
mnt:[4026531840]
mnt:[4026531856]
mnt:[4026532469]
net:[4026531956]
net:[4026532375]
pid:[4026531836]
pid:[4026532373]
uts:[4026531838]
Liczba w nawiasach kwadratowych to liczba i-węzłów.
Aby uzyskać to dla danego procesu:
# ls -Li /proc/1/ns/pid
4026531836 /proc/1/ns/pid
Teraz mogą istnieć trwałe przestrzenie nazw, które nie zawierają żadnego procesu. Znalezienie ich może być o wiele trudniejsze AFAICT.
Po pierwsze, trzeba pamiętać, że może być kilka zamontować nazw.
# 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
Ci /mnt/1/a
, /run/netns/a
może być pliki nazw.
Możemy uzyskać numer i-węzła:
# nsenter --mount=/proc/19877/task/19877/ns/mnt -- ls -Li /mnt/1/a
4026532471 /mnt/1/a
Ale to nie mówi nam wiele innych niż to, że nie ma go na powyższej liście.
Możemy spróbować wpisać go jako dowolny z różnych typów:
# 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
#
OK, to był net
plik przestrzeni nazw.
Wydaje się więc, że mamy metodę wylistowania przestrzeni nazw: wylistuj ns
katalogi wszystkich zadań, a następnie znajdź wszystkie proc
punkty montowania we wszystkich /proc/*/task/*/mountinfo
i wymyśl ich typ, próbując je wprowadzić.
lsns
jest bardzo przydatny, ale pokazuje tylko najniższy PID w każdej przestrzeni nazw - tzn. nie może powiedzieć przestrzeni nazw dla dowolnego dowolnego PID. W każdym razie +1, ponieważ nadal jest to przydatna odpowiedź, nawet jeśli nie odpowiada bezpośrednio na pytanie.gdzie
$PID
jest identyfikator procesu, który można uzyskać na różne sposoby.http://man7.org/linux/man-pages/man8/ip-netns.8.html
źródło
ip netns
(lub przynajmniej utworzonych przez coś, co bind-mount zamyka drzwi przestrzeni nazw w / run / netns jakip netns
robi). Zasadniczo szuka w / run / netns plików, które są takie same jak/proc/$PID/ns/net
./run/netns
nawet nie istnieje na moim komputerze./run/netns
lub wszędzie tam, gdzieip
bind montuje pliki specjalne przestrzeni nazw.findmnt -t nsfs
może powiedzieć ci, gdzie to jest w twoim systemie. OTOH, jeśli to zrobiszunshare -n sleep 1000 & ip netns identify "$!"
, nic nie dostaniesz.findmnt -t nsfs
- nic.unshare -n sleep 1000 & ip netns identify "$!"
- unshare: unshare failed: Operacja niedozwolonafindmnt -t nsfs
zwracanie niczego nie sugeruje, że nie masz żadnych sieci w bankomacie swojego komputera.ps
teraz ma opcji wydruku dla różnych rodzajów nazw związanych z procesami:ipcns
,mntns
,netns
,pidns
,userns
, iutsns
. W przypadku tego pytania istotnym jest przestrzeń nazw PID lubpidns
.więc jeśli chcesz znaleźć identyfikator przestrzeni nazw PID dla np. pid 459:
i aby wyświetlić listę wszystkich procesów w tej przestrzeni nazw:
lub za pomocą
pgrep
, możesz przejść bezpośrednio z PID do listy wszystkich procesów współużytkujących tę samą przestrzeń nazw PID:W przeciwieństwie do
ps
,pgrep
może ograniczyć dane wyjściowe do określonej przestrzeni nazw (jeśli znasz PID jednego z procesów w nim zawartych), ale ma bardzo ograniczone możliwości formatowania danych wyjściowych (tylko PID lub PID i ich wiersze poleceń)Zawsze możesz przesłać dane wyjściowe
pgrep --ns 459
do,xargs ps -f
aby uzyskać potrzebne informacje o procesie.źródło
Lister przestrzeni nazw :
Możesz użyć listns.py
Zastosowanie:
./listns.py
lubpython2 listns.py
Aby dokładnie odpowiedzieć na to pytanie, możesz grepować wynik w ten sposóbpython2 listns.py | grep $PID
(zastąp zmienną pid)Źródło: github-mirror i artykuł w całości dzięki Ralfowi Trezeciakowi
Sieciowe przestrzenie nazw :
W przypadku sieciowej przestrzeni nazw
ip netns identify $PID
można użyć.Nsutils
Podaj,
pidnslist
że zwraca przestrzeń nazw pid procesuźródło