Saya akan mencoba menjawab ini dan pertanyaan Anda sebelumnya karena keduanya terkait.
Pintu ke ruang nama adalah file di /proc/*/ns/*
dan /proc/*/task/*/ns/*
.
Namespace dibuat dengan proses unsharing ruang namanya. Namespace kemudian dapat dibuat permanen dengan bind-mounting ns
file ke tempat lain.
Itulah ip netns
lakukan misalnya untuk net ruang nama. Itu membatalkan pembagian net
-nya namespace dan bind-mount /proc/self/ns/net
ke /run/netns/netns-name
.
Dalam /proc
dipasang di root pid namespace, Anda dapat mencantumkan semua namespace 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 siku adalah nomor inode.
Untuk mendapatkannya untuk proses tertentu:
# ls -Li /proc/1/ns/pid
4026531836 /proc/1/ns/pid
Sekarang, mungkin ada permanen ruang nama yang tidak memiliki proses apa pun di dalamnya. Menemukan mereka bisa menjadi AFAICT yang jauh lebih rumit.
Pertama, Anda harus ingat bahwa ada beberapa pemasangan ruang nama.
# 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
itu , /run/netns/a
mungkin file namespace.
Kita bisa mendapatkan nomor inode:
# nsenter --mount=/proc/19877/task/19877/ns/mnt -- ls -Li /mnt/1/a
4026532471 /mnt/1/a
Tapi itu tidak banyak memberi tahu kita selain tidak ada dalam daftar yang dihitung di atas.
Kami dapat mencoba dan memasukkannya sebagai salah satu dari jenis yang berbeda:
# 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, tadi adalah net
file namespace.
Jadi sepertinya kita memiliki metode untuk mencantumkan ruang nama:daftarkan ns
direktori semua tugas, lalu temukan semua proc
mountpoints di semua /proc/*/task/*/mountinfo
dan cari tahu tipenya dengan mencoba memasukkannya.
Jika Anda memiliki util-linux v2.28 atau lebih tinggi Anda dapat menggunakan 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
Koreksi:lsns tidak tersedia di util-linux v2.27 seperti yang biasa dikatakan oleh jawaban ini. Lihat https://www.kernel.org/pub/linux/utils/util-linux/v2.28/v2.28-ReleaseNotes
ps
sekarang memiliki opsi keluaran untuk berbagai jenis ruang nama yang terkait dengan proses:ipcns
, mntns
, netns
, pidns
, userns
, dan utsns
. Untuk pertanyaan ini, yang relevan adalah namespace PID, atau pidns
.
jadi jika Anda ingin mengetahui id namespace PID untuk, mis., pid 459:
# ps -h -o pidns -p 459
4026532661
dan untuk membuat daftar semua proses dalam ruang nama itu:
ps -o pidns,pid,cmd | awk '$1==4026532661'
atau dengan pgrep
, Anda dapat langsung dari PID ke daftar semua proses yang berbagi namespace PID yang sama:
pgrep -a --ns 459
Tidak seperti ps
, pgrep
dapat membatasi output ke namespace tertentu (jika Anda mengetahui PID dari salah satu proses di dalamnya), tetapi memiliki kemampuan pemformatan output yang sangat terbatas (hanya PID, atau PID dan baris perintahnya)
Anda selalu dapat mem-pipe output dari pgrep --ns 459
ke xargs ps -f
meskipun untuk mengambil informasi yang Anda butuhkan tentang proses tersebut.