Tôi sẽ thử và trả lời cả câu hỏi này và câu hỏi trước đó của bạn vì chúng có liên quan.
Các cửa vào không gian tên là các tập tin trong /proc/*/ns/*
và /proc/*/task/*/ns/*
.
Một không gian tên được tạo bởi một quá trình không chia sẻ không gian tên của nó. Một namespace sau đó có thể được thực hiện thường xuyên bởi ràng buộc tháo lắp các ns
tập tin vào một số nơi khác.
Đó là những gì ip netns
làm ví dụ cho không gian tên mạng . Nó net
không hiển thị không gian tên của nó và liên kết gắn kết /proc/self/ns/net
với ./run/netns/netns-name
Trong một /proc
không gian tên gốc được gắn kết, bạn có thể liệt kê tất cả các không gian tên có một quy trình trong đó bằng cách thực hiện:
# readlink /proc/*/task/*/ns/* | sort -u
ipc:[4026531839]
mnt:[4026531840]
mnt:[4026531856]
mnt:[4026532469]
net:[4026531956]
net:[4026532375]
pid:[4026531836]
pid:[4026532373]
uts:[4026531838]
Số trong ngoặc vuông là số inode.
Để có được điều đó cho một quy trình nhất định:
# ls -Li /proc/1/ns/pid
4026531836 /proc/1/ns/pid
Bây giờ, có thể có các không gian tên vĩnh viễn không có bất kỳ quy trình nào trong đó. Tìm ra chúng có thể khó khăn hơn rất nhiều AFAICT.
Đầu tiên, bạn phải nhớ rằng có thể có một vài không gian tên mount .
# 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
Những /mnt/1/a
, /run/netns/a
có thể file namespace.
Chúng ta có thể nhận được một số inode:
# nsenter --mount=/proc/19877/task/19877/ns/mnt -- ls -Li /mnt/1/a
4026532471 /mnt/1/a
Nhưng điều đó không cho chúng ta biết nhiều hơn là nó không có trong danh sách được tính toán ở trên.
Chúng tôi có thể thử và nhập nó dưới dạng bất kỳ loại nào khác nhau:
# 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, đó là một net
tập tin không gian tên.
Vì vậy, dường như chúng ta có một phương pháp để liệt kê các không gian tên: liệt kê các ns
thư mục của tất cả các tác vụ, sau đó tìm tất cả các proc
điểm gắn kết trong tất cả /proc/*/task/*/mountinfo
và tìm ra loại của chúng bằng cách cố gắng nhập chúng.