Arch-Linux

arch-chroot 中的 PID 不正確

  • October 15, 2015

我正在嘗試在 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實用程序;請參閱是否有命令可以切換到現有命名空間?. 您也可以使用nsenterPython 包。或者您可以安排從命名空間內部執行這些操作(這可能是也可能不是一個好的解決方案,具體取決於您的架構和安全要求);從外部訪問 chroot 中的內容(只需為正確的目錄路徑添加前綴)比在 PID 命名空間中訪問更容易。

請注意,PID 命名空間和 chroot 是獨立的。如果您獨立地 chroot 到同一目錄,則不會讓您到達相同的 PID 命名空間。如果你arch-chroot在同一個目錄上執行兩次,你最終會在同一個目錄中工作,但是在兩個不同的 PID 命名空間中。

¹更準確地說,在祖先命名空間中。(命名空間具有樹形結構,其中子級被限制在父級中。)

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