Linux

如何找出特定程序的名稱空間?

  • December 30, 2020

我已經問過一個關於如何在 Linux 中列出所有命名空間的問題,但是沒有任何正確和準確的答案,所以我想找到一種方法可以幫助我找出某個程序或組的 PID 的命名空間過程。如何在 Linux 中完成?

我將嘗試回答這個問題和您之前的問題,因為它們是相關的。

命名空間的大門是/proc/*/ns/*和中的文件/proc/*/task/*/ns/*

命名空間由取消共享其命名空間的程序創建。然後可以通過將文件綁定安裝到其他位置來使命名空間永久ns

這就是ip netns例如網路名稱空間的作用。它取消共享其net命名空間並綁定/proc/self/ns/net到./run/netns/*netns-name*

/proc根 pid 命名空間中的掛載中,您可以通過執行以下操作列出所有包含程序的命名空間:

# readlink /proc/*/task/*/ns/* | sort -u
ipc:[4026531839]
mnt:[4026531840]
mnt:[4026531856]
mnt:[4026532469]
net:[4026531956]
net:[4026532375]
pid:[4026531836]
pid:[4026532373]
uts:[4026531838]

方括號中的數字是 inode 編號。

要獲得給定過程的資訊:

# ls -Li /proc/1/ns/pid
4026531836 /proc/1/ns/pid

現在,可能存在其中沒有任何程序的*永久命名空間。*找出它們可能要復雜得多 AFAICT。

首先,您必須記住,可以有多個掛載命名空間。

# 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/run/netns/a可能是命名空間文件。

我們可以得到一個inode號:

# nsenter --mount=/proc/19877/task/19877/ns/mnt -- ls -Li /mnt/1/a
4026532471 /mnt/1/a

但這並沒有告訴我們太多,只是它不在上面計算的列表中。

我們可以嘗試將其輸入為任何不同的類型:

# 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
#

好的,那是一個net命名空間文件。

所以看起來我們有一個列出命名空間的方法:列出ns所有任務的目錄,然後找到所有的proc掛載點/proc/*/task/*/mountinfo並通過嘗試輸入它們來確定它們的類型。

引用自:https://unix.stackexchange.com/questions/113530