linux进程命名空间是内核提供的视图隔离机制,不复制资源而为各进程组提供独立系统资源映射;需组合pid、network、mount、uts、user等命名空间协同实现完整环境隔离。

Linux进程命名空间不是“虚拟机”,而是内核提供的一套视图隔离机制——它不复制资源,而是让不同进程组各自看到一套独立的系统资源映射。真正实现环境隔离,靠的是组合多个命名空间协同工作。
PID命名空间:让每个环境都有自己的“init”
在PID命名空间中,新创建的第一个进程ID为1,成为该空间的初始进程(类似传统系统的init)。它看不到宿主机或其他命名空间里的进程,其他命名空间也看不到它。但要注意:子命名空间中的进程在父命名空间里仍存在对应PID,只是视角受限。
- 启用方式:用unshare --pid --fork bash启动后,ps aux只显示当前命名空间内的进程
- 关键细节:必须配合--fork,否则PID 1无法正常接管子进程;孤儿进程由该命名空间的PID 1回收
- 常见误区:单独使用PID命名空间无法隐藏进程树全貌,需搭配其他命名空间才有效
Network命名空间:网络栈完全私有化
每个Network命名空间拥有独立的回环接口、IP地址、路由表、iptables规则和网络设备。它就像一个独占的网络世界,不与宿主机默认互通。
- 启用方式:unshare --net --fork bash后,ip link只显示lo,无eth0等宿主机网卡
- 连通要点:如需访问外部网络,须手动创建veth pair、配置网桥或NAT,否则该环境处于“断网”状态
- 实用技巧:可用nsenter -t [PID] -n ip addr进入已有进程的网络空间调试
Mount与UTS命名空间:文件系统和身份标识隔离
Mount命名空间控制进程能看到哪些挂载点,修改挂载不影响其他空间;UTS命名空间则允许独立设置hostname和domainname,互不干扰。
- 典型组合:unshare --mount --uts --fork bash后,执行hostname testbox仅在当前shell生效
- 文件系统注意:新建Mount命名空间默认继承父空间挂载,需手动mount --make-rprivate /防止传播影响
- 补充建议:常配合chroot或bind mount构建干净根目录,避免暴露宿主机文件结构
User命名空间:非特权用户也能安全模拟root
User命名空间将用户/组ID映射隔离,允许普通用户在自己的命名空间内以UID 0运行,而宿主机上仍是低权限账户,极大提升安全性。
- 启用方式:unshare --user --map-root-user --fork bash后,id显示uid=0,但无法操作宿主机敏感路径
- 映射原理:通过/proc/[pid]/uid_map定义内外UID映射关系,如“0 1000 1”表示容器内UID 0对应宿主机UID 1000
- 前提条件:需开启kernel.unprivileged_userns_clone=1或以CAP_SYS_ADMIN权限运行











