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.