arch-chroot 中的 PID 不正確
我正在嘗試在 a 中執行 python 腳本
chroot
(具體來說,chroot
是用arch-chroot
)創建的。python 腳本依賴於os.getpid()
,但這似乎在chroot
. 如果在python中我做import os os.getpid()
/proc/
我得到一個 PID,它沒有在 chroot 或真正的根目錄中列出。此外,我認為正確的 PID 列在/proc/
chroot 或真實根中。這個問題不是特定於 Python 的。如果我在
chroot
echo $$ ps -a ls /proc
PID 未列在
ps
或 中/proc
。我究竟做錯了什麼?有沒有辦法獲得正確的PID?
arch-chroot
不僅僅是創建一個 chroot:它還創建了一個 PID 命名空間。取消共享 –fork –pid chroot " $ chrootdir" " $ @"
顧名思義,PID 命名空間有自己的一組程序 ID,與系統的其他部分不同。這意味著命名空間內的程序無法看到命名空間外的程序(尤其是無法殺死或跟踪它們),而命名空間外的程序¹可以看到它們具有不同的 PID。
有關命名空間的更多資訊,請閱讀我的摘要和Michael Kerrisk 的 LWN 系列,尤其是第 3 部分:PID 命名空間和第 4 部分:更多關於 PID 命名空間,以及Pavel Emelyanov 和 Kir Kolyshkin 的早期文章。如何找出特定程序的名稱空間?使用
nsenter:
來監禁子程序的可靠方法可能也很有趣。如果您想從外部對在命名空間中執行的程序執行操作,可以使用該
nsenter
實用程序;請參閱是否有命令可以切換到現有命名空間?. 您也可以使用nsenter
Python 包。或者您可以安排從命名空間內部執行這些操作(這可能是也可能不是一個好的解決方案,具體取決於您的架構和安全要求);從外部訪問 chroot 中的內容(只需為正確的目錄路徑添加前綴)比在 PID 命名空間中訪問更容易。請注意,PID 命名空間和 chroot 是獨立的。如果您獨立地 chroot 到同一目錄,則不會讓您到達相同的 PID 命名空間。如果你
arch-chroot
在同一個目錄上執行兩次,你最終會在同一個目錄中工作,但是在兩個不同的 PID 命名空間中。¹更準確地說,在祖先命名空間中。(命名空間具有樹形結構,其中子級被限制在父級中。)