Saya akan mencoba dan menjawab ini dan juga pertanyaan Anda sebelumnya karena mereka terkait.
Pintu ke ruang nama adalah file di /proc/*/ns/*
dan /proc/*/task/*/ns/*
.
Namespace dibuat oleh proses yang tidak membagikan namespace-nya. Namespace kemudian dapat dibuat permanen dengan bind-mount yang ns
berkas ke tempat lain.
Itulah yang ip netns
dilakukan misalnya untuk ruang nama bersih . Itu unshares net
namespace dan bind-mounts /proc/self/ns/net
ke ./run/netns/netns-name
Di /proc
mount di namespace pid root, Anda bisa daftar semua namespaces yang memiliki proses di dalamnya dengan melakukan:
# readlink /proc/*/task/*/ns/* | sort -u
ipc:[4026531839]
mnt:[4026531840]
mnt:[4026531856]
mnt:[4026532469]
net:[4026531956]
net:[4026532375]
pid:[4026531836]
pid:[4026532373]
uts:[4026531838]
Angka dalam tanda kurung adalah nomor inode.
Untuk mendapatkannya untuk proses tertentu:
# ls -Li /proc/1/ns/pid
4026531836 /proc/1/ns/pid
Sekarang mungkin ada ruang nama permanen yang tidak memiliki proses di dalamnya. Menemukan mereka bisa menjadi AFAICT yang jauh lebih rumit.
Pertama, Anda harus ingat bahwa mungkin ada beberapa mount namespaces.
# 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
Itu /mnt/1/a
,/run/netns/a
mungkin file namespace.
Kami bisa mendapatkan nomor inode:
# nsenter --mount=/proc/19877/task/19877/ns/mnt -- ls -Li /mnt/1/a
4026532471 /mnt/1/a
Tapi itu tidak memberi tahu kita banyak selain itu tidak ada dalam daftar yang dihitung di atas.
Kita dapat mencoba dan memasukkannya sebagai salah satu dari berbagai jenis:
# 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
#
OKE, itu a net
file namespace.
Jadi sepertinya kita memiliki metode untuk membuat daftar ruang nama: daftarkan ns
direktori semua tugas, lalu temukan semua proc
mountpoint di semua /proc/*/task/*/mountinfo
dan cari tahu tipenya dengan mencoba memasukkannya.
lsns
sangat berguna tetapi hanya menunjukkan PID terendah di setiap namespace - yaitu tidak bisa memberi tahu Anda namespace untuk setiap PID sewenang-wenang. +1 tetap karena ini masih merupakan jawaban yang berguna bahkan jika itu tidak langsung menjawab pertanyaan.di mana
$PID
ID proses dari proses, yang bisa Anda dapatkan dengan berbagai cara.http://man7.org/linux/man-pages/man8/ip-netns.8.html
sumber
ip netns
(atau setidaknya dibuat oleh sesuatu yang mengikat mount pintu namespace di / run / netns seperti yangip netns
dilakukan). Ini pada dasarnya terlihat di / run / netns untuk file yang sama dengan/proc/$PID/ns/net
./run/netns
bahkan tidak ada di komputer saya./run/netns
atau di mana punip
mengikat mount file khusus namespace.findmnt -t nsfs
dapat memberi tahu Anda di mana itu pada sistem Anda. OTOH, jika kamu melakukannyaunshare -n sleep 1000 & ip netns identify "$!"
, kamu tidak akan mendapatkan apa-apa.findmnt -t nsfs
- tidak ada.unshare -n sleep 1000 & ip netns identify "$!"
- unshare: unshare gagal: Operasi tidak diizinkanfindmnt -t nsfs
mengembalikan apa pun menunjukkan bahwa Anda tidak memiliki jaring di ATM mesin Anda.ps
kini memiliki pilihan output untuk berbagai jenis ruang nama yang terkait dengan proses:ipcns
,mntns
,netns
,pidns
,userns
, danutsns
. Untuk pertanyaan ini, yang relevan adalah namespace PID, ataupidns
.jadi jika Anda ingin mengetahui id namespace PID untuk, misalnya, pid 459:
dan untuk membuat daftar semua proses di namespace itu:
atau dengan
pgrep
, Anda bisa langsung dari PID ke daftar semua proses berbagi yang namespace PID yang sama:Tidak seperti
ps
,pgrep
dapat membatasi output ke namespace tertentu (jika Anda tahu PID dari salah satu proses di dalamnya), tetapi memiliki kemampuan format output yang sangat terbatas (hanya PID, atau PID dan baris perintah mereka)Anda selalu dapat menyalurkan output
pgrep --ns 459
kexargs ps -f
meskipun untuk mengambil informasi yang Anda butuhkan tentang proses.sumber
Namespace-Lister :
Anda dapat menggunakan listns.py
Penggunaan:
./listns.py
ataupython2 listns.py
Untuk menjawab pertanyaan ini dengan tepat, Anda dapat menangkap hasilnya seperti inipython2 listns.py | grep $PID
(ganti variabel pid)Sumber: github-mirror dan artikel semua kredit untuk Ralf Trezeciak
Ruang nama jaringan :
Untuk namespace jaringan,
ip netns identify $PID
bisa digunakan.Nsutils
Berikan
pidnslist
yang mengembalikan namespace pid dari suatu prosessumber