0

0

Linux unshare / nsenter 的用户态 namespace 创建与进入技巧

舞夢輝影

舞夢輝影

发布时间:2026-03-01 16:09:48

|

737人浏览过

|

来源于php中文网

原创

unshare 创建新 namespace 后 ps 看不到进程隔离,因其默认不切换当前进程视图;需加 --fork 并配合 bash 等命令使新进程在新 pid namespace 中启动,且 user ns 需正确映射 uid 并禁用 setgroups。

linux unshare / nsenter 的用户态 namespace 创建与进入技巧

unshare 创建新 namespace 后为什么 ps 看不到进程隔离?

因为 unshare 默认只创建 namespace,不切换当前进程的视图——它仍运行在原 PID namespace 中,只是获得了新 namespace 的“所有权”。要真正看到隔离效果,必须配合 --fork 和后续命令(如 bash),让新进程在新 namespace 中启动。

常见错误现象:unshare --user --pid --mount /bin/bash 进入后执行 ps aux 仍能看到宿主机所有进程。这是因为没加 --forkbash 还在原 PID namespace 里运行。

  • unshare --user --pid --fork --mount /bin/bash 才能让 bash 成为新 PID namespace 的 1 号进程
  • --user 必须搭配 --map-root-user 或手动写 /proc/self/uid_map,否则非 root 用户无法映射 UID,导致 setuid 失败、多数命令拒绝执行
  • --mount 单独用没意义:新 mount namespace 默认继承父视图,得立刻 mount --make-privatemount 新文件系统,否则挂载操作会泄漏到外部

nsenter 进入已有进程的 namespace 时权限不足怎么办?

nsenter 本质是打开目标进程的 /proc/PID/ns/XXX 文件并 setns(),所以核心限制就两条:能否读取 /proc/PID/ns/ 下的文件,以及是否有对应 namespace 的操作权限(比如进入 user ns 需 CAP_SYS_ADMIN 或已映射 UID)。

典型报错:nsenter: failed to open /proc/1234/ns/pid: Permission denied

Linux+PHP+MySQL案例教程
Linux+PHP+MySQL案例教程

本书以培养高级网站建设与管理人才为目标,内容循序渐进,由浅入深,通过大量的实例系统全面地介绍了Linux+PHP+MySQL环境下的网络后台开发技术。本书详尽分析了近30个典型案例。包括计数器、网站流量统计、留言板、论坛系统、聊天室、投票与调查、用户管理、新闻发布系统、广告轮播、购物系统等等,力求让读者通过对案例的学习,轻松掌握PHP和MySQL的编程精要,迅速掌握网络后台开发技巧。   本书适

下载
  • 普通用户默认无法读取其他用户的 /proc/PID/ns/,哪怕 PID 是自己的子进程——除非该进程设置了 PR_SET_DUMPABLE(很多容器 runtime 会设)
  • 进 user namespace 前,必须先进 pid+mnt+uts 等“非特权” namespace,否则内核拒绝切换(顺序敏感!)
  • 推荐组合:nsenter -t 1234 -m -u -i -n -p /bin/bash,其中 -i 是 user ns,-p 是 pid ns;漏掉 -p 就会卡在 “can’t change process namespace”

user namespace 映射不生效,id 还显示 root?

user namespace 不等于自动获得 root 权限,它只是提供 UID/GID 映射能力。映射是否生效,取决于三件事:是否写了 uid_map、是否关闭了 setgroups、当前进程是否在该 user ns 内。

现象:进了 unshare 的 user ns,id -u 还是 0,但 touch /tmp/testOperation not permitted

  • 必须向 /proc/self/uid_map 写入映射,例如:echo "0 1000 1" > /proc/self/uid_map(把 host UID 1000 映射为 ns 内 UID 0)
  • uid_map 前必须先写 /proc/self/setgroupsdeny,否则内核拒绝写 uid_map(安全强制)
  • 映射只对当前进程及其 fork 出的子进程有效;如果用 exec bash 替换 shell,需确保 bash 是 fork 后 exec 的,而不是另起一个未映射的进程

为什么 nsenter 进去后 ls /proc 看不到其他进程?

因为 /proc 是伪文件系统,它的内容由内核按当前进程所处的 PID namespace 动态生成。你用 nsenter -t 1234 -p 进入某个进程的 PID namespace 后,/proc 就只显示该 namespace 内的进程——这是正确行为,不是 bug。

但要注意:如果只进 PID namespace,没进 mount namespace,/proc 路径本身可能还是挂载在宿主机的 procfs 上(即看到的是宿主机 PID 视图)。必须同时指定 -m 才能确保看到该 PID namespace 对应的 /proc 实例。

  • 安全做法:nsenter -t 1234 -m -p -u -n -i /bin/bash,五连进保证上下文完整
  • 进完立刻检查:cat /proc/self/status | grep NSpid,确认 NSpid 字段存在且值合理(比如第一个是 1)
  • 别依赖 ps:它可能从宿主机 /proc 读取,优先用 ls /proc/[0-9]*cat /proc/sys/kernel/ns_last_pid 验证 PID namespace 是否真生效
事情说清了就结束。namespace 的嵌套、跨 namespace 信号传递、cgroup 关联这些,都得在 map 和 mount 都稳住之后才谈得上。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
golang map内存释放
golang map内存释放

本专题整合了golang map内存相关教程,阅读专题下面的文章了解更多相关内容。

77

2025.09.05

golang map相关教程
golang map相关教程

本专题整合了golang map相关教程,阅读专题下面的文章了解更多详细内容。

39

2025.11.16

golang map原理
golang map原理

本专题整合了golang map相关内容,阅读专题下面的文章了解更多详细内容。

67

2025.11.17

java判断map相关教程
java判断map相关教程

本专题整合了java判断map相关教程,阅读专题下面的文章了解更多详细内容。

47

2025.11.27

磁盘配额是什么
磁盘配额是什么

磁盘配额是计算机中指定磁盘的储存限制,就是管理员可以为用户所能使用的磁盘空间进行配额限制,每一用户只能使用最大配额范围内的磁盘空间。php中文网为大家提供各种磁盘配额相关的内容,教程,供大家免费下载安装。

1542

2023.06.21

如何安装LINUX
如何安装LINUX

本站专题提供如何安装LINUX的相关教程文章,还有相关的下载、课程,大家可以免费体验。

715

2023.06.29

linux find
linux find

find是linux命令,它将档案系统内符合 expression 的档案列出来。可以指要档案的名称、类别、时间、大小、权限等不同资讯的组合,只有完全相符的才会被列出来。find根据下列规则判断 path 和 expression,在命令列上第一个 - ( ) , ! 之前的部分为 path,之后的是 expression。还有指DOS 命令 find,Excel 函数 find等。本站专题提供linux find相关教程文章,还有相关

300

2023.06.30

linux修改文件名
linux修改文件名

本专题为大家提供linux修改文件名相关的文章,这些文章可以帮助用户快速轻松地完成文件名的修改工作,大家可以免费体验。

793

2023.07.05

Golang 测试体系与代码质量保障:工程级可靠性建设
Golang 测试体系与代码质量保障:工程级可靠性建设

Go语言测试体系与代码质量保障聚焦于构建工程级可靠性系统。本专题深入解析Go的测试工具链(如go test)、单元测试、集成测试及端到端测试实践,结合代码覆盖率分析、静态代码扫描(如go vet)和动态分析工具,建立全链路质量监控机制。通过自动化测试框架、持续集成(CI)流水线配置及代码审查规范,实现测试用例管理、缺陷追踪与质量门禁控制,确保代码健壮性与可维护性,为高可靠性工程系统提供质量保障。

24

2026.02.28

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 9.9万人学习

Git 教程
Git 教程

共21课时 | 3.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号