PID Namespace
基本信息
PID(进程标识符)命名空间是Linux内核中的一个功能,通过为一组进程提供自己独特的PID集合,使这些进程能够与其他命名空间中的PID分离,从而实现进程隔离。这在容器化中特别有用,因为进程隔离对于安全和资源管理至关重要。
创建新的PID命名空间时,该命名空间中的第一个进程被分配为PID 1。该进程成为新命名空间的“init”进程,并负责管理命名空间内的其他进程。在该命名空间内创建的每个后续进程将在该命名空间内具有唯一的PID,这些PID将独立于其他命名空间中的PID。
从PID命名空间内的进程的角度来看,它只能看到同一命名空间中的其他进程。它不知道其他命名空间中的进程,也无法使用传统的进程管理工具(例如kill
、wait
等)与其进行交互。这提供了一定程度的隔离,有助于防止进程相互干扰。
工作原理:
当创建新进程(例如通过使用
clone()
系统调用)时,可以将该进程分配给新的或现有的PID命名空间。如果创建了新的命名空间,该进程将成为该命名空间的“init”进程。内核维护着新命名空间中PID与父命名空间(即创建新命名空间的命名空间)中相应PID之间的映射。这种映射允许内核在必要时转换PID,例如在不同命名空间中的进程之间发送信号时。
PID命名空间内的进程只能看到并与同一命名空间中的其他进程交互。它们不知道其他命名空间中的进程,它们的PID在其命名空间内是唯一的。
当销毁PID命名空间(例如当命名空间的“init”进程退出时),该命名空间内的所有进程都将被终止。这确保了与命名空间相关的所有资源都得到适当清理。
实验:
创建不同的命名空间
CLI
通过使用参数--mount-proc
挂载/proc
文件系统的新实例,确保新的挂载命名空间具有准确且独立的进程信息视图,特定于该命名空间。
Docker
检查您的进程位于哪个命名空间
查找所有PID命名空间
请注意,来自初始(默认)PID命名空间的root用户可以查看所有进程,甚至是在新PID命名空间中的进程,这就是为什么我们可以看到所有PID命名空间。
进入PID命名空间内部
当您从默认命名空间进入PID命名空间时,您仍然可以看到所有进程。来自该PID命名空间的进程将能够看到PID命名空间上的新bash。
此外,只有root用户才能进入另一个进程的PID命名空间。您无法在没有指向其的描述符的情况下进入其他命名空间(例如/proc/self/ns/pid
)
参考资料
最后更新于