当前位置: 首页 > news >正文

PRoot / chroot / pivot_root

工具作用权限原理定位
chroot简易切换根目录需要 root内核简易隔离老旧、轻量、不安全
pivot_root彻底切换根目录需要 root内核原生、安全容器标准(Docker 用这个)
PRoot用户态模拟 chroot/pivot/overlay无需 root用户态劫持系统调用无 root 环境的「迷你容器」

chroot

  • 最古老的根切换工具
  • 只是把进程的 / 换成指定目录
  • 不隔离挂载表 / 不隔离进程 / 不隔离用户
  • 容易逃逸、不安全
  • 适合:简单测试、急救系统
chroot /new/root /bin/bash

pivot_root

  • 内核级、安全、彻底的根切换
  • 必须配合 mount namespace使用
  • 切换后完全看不见宿主机文件
  • 容器(Docker /containerd)的标准实现
  • 能和 OverlayFS 完美配合
pivot_root new_root old_root

PRoot

  • 用户态实现,不需要任何权限
  • 模拟:chroot + pivot_root + OverlayFS + 绑定目录
  • 无内核隔离,但足够安全用于普通用户隔离
  • 无 root 服务器、安卓 Linux 环境、临时测试神器
proot -r /new/root /bin/bash

核心区别

1. 权限

  • chroot /pivot_root:必须 root
  • PRoot:普通用户就能用

2. 隔离级别

  • pivot_root:内核级强隔离(容器级)
  • chroot:弱隔离(容易逃逸)
  • PRoot:进程级隔离(用户态模拟)

3. 是否能搭配 OverlayFS

  • pivot_root + Overlay = 完美容器
  • chroot + Overlay = 可以用,但不安全
  • PRoot = 自带模拟 Overlay,不需要真挂载

4. 谁在生产环境用?

  • pivot_root:Docker / Kubernetes / 容器
  • chroot:几乎不用
  • PRoot:开发、无 root 环境、嵌入式、测试

最经典组合

1. 真正容器 = Mount Namespace + OverlayFS + pivot_root

unshare -m -- sh -c ' mount -t overlay ... /merged cd /merged pivot_root . . umount -l / exec /bin/bash '

2. 无 root 容器 = PRoot(自带模拟 overlay + chroot)

proot -b upper:/ -b lower:/ /bin/bash

内核层的区别

  • chroot:只改进程的fs_struct->root,内核层面几乎不做隔离,很弱。
  • pivot_root:配合mount namespace,彻底切换整个挂载树 + 根,是容器级内核隔离
  • PRoot完全不在内核里,用户态通过ptrace劫持系统调用模拟,内核视角还是原来的进程。

chroot

内核做的事

  • 只修改当前进程的task_struct->fs_struct->root指向新的 dentry
  • 挂载命名空间不变(共享宿主机 mount namespace)
  • 不改变父进程、子进程限制(可逃逸)
  • 不隔离/proc/sys、无名套接字等

本质

只是改了一个路径解析的起点,内核其他结构完全共享。

pivot_root

前提

必须在独立的 mount namespace中(CLONE_NEWNS)。

内核做的事

  1. 切换整个mount namespace 的根挂载点
  2. 新旧根都必须是挂载点
  3. 原子替换进程看到的完整文件系统树
  4. 之后可以卸载旧根,彻底隔离宿主机文件系统

本质

整个挂载树的切换,内核层面实现了独立的文件系统视图。

PRoot

内核做的事

内核什么隔离都没做

  • 进程还是在原来的 mount namespace
  • 内核看到的路径仍然是宿主机真实路径
  • 只是进程被ptrace跟踪,系统调用陷入用户态处理

PRoot 做的事

  • 劫持open / stat / chdir / execve等系统调用
  • 在用户态把路径重写(映射到你的 overlay/rootfs)
  • 再把修改后的参数传给真实内核
项目chrootpivot_rootPRoot
实现层内核内核用户态(ptrace)
依赖命名空间不依赖必须 mount namespace不依赖
修改对象进程root成员整个挂载树系统调用参数
隔离范围仅路径前缀完整文件系统视图仅当前进程的调用
能否看到宿主机根能(可逃逸)不能(卸载后完全隔离)内核能看到,用户态看不到
对内核来说真实根变更真实根变更还是原来的根
容器是否使用是(Docker/runc)
http://www.jsqmd.com/news/504526/

相关文章:

  • MTKClient终极指南:联发科设备刷机解锁的完整解决方案
  • 突破QQ音乐加密限制:QMCDump全指南——3大行业场景解密与高效转换技巧
  • 什么是Prompt模板?为什么标准化的格式能提高稳定性?
  • Leather Dress Collection 模型成本优化实战:GPU算力监控与弹性伸缩策略
  • PasteMD部署指南:本地运行Llama3模型格式化文本
  • MATLAB三维曲面绘制实战:从函数定义到精美可视化(附完整代码)
  • 新手必看:Unsloth框架快速上手指南,从安装到微调一气呵成
  • 如何获取Windows最高权限:RunAsTI完整使用指南
  • 心肌肌钙蛋白T为何是心血管疾病评估的关键生物标志物?
  • 重构开发者字体体验:JetBrains Mono的技术突破与实践革新
  • SEER‘S EYE预言家之眼部署避坑指南:解决常见错误如依赖冲突与显存不足
  • ROS命名空间实战指南:节点、话题与参数的重命名技巧(附代码解析)
  • CLOCs:Camera-LiDAR后融合新范式——从稀疏张量到性能跃升
  • 如何释放x86处理器隐藏性能:Universal x86 Tuning Utility终极指南
  • NEC红外协处理器模块:UART接口红外编解码方案
  • Xycom XVME-601 处理器模块
  • wkhtmltopdf跨平台部署与实战应用指南
  • Qt中的QCommandLinkButton:从基础到实战应用
  • Open3D表面重建实战:从点云到3D模型的完整流程(附代码示例)
  • 从此告别拖延 10个AI论文工具测评:开源免费+毕业论文写作全攻略
  • 嵌入式系统集成GTE+SeqGPT:卓晴教授案例研究
  • AutoGen Studio企业级应用:Java集成多智能体客服系统开发指南
  • 拯救者工具箱深度配置指南:如何通过5个关键场景优化你的游戏本性能
  • GME-Qwen2-VL-2B-Instruct基础部署教程:Python环境快速配置指南
  • iwrqk:终极Flutter跨平台Iwara社区客户端完全指南
  • 星穹铁道自动化终极指南:三月七小助手让游戏时间更高效
  • ABAP Unit Test 实战:如何高效编写与执行单元测试
  • 别再乱选qnnpack和fbgemm了!PyTorch模型量化后端实战对比(附性能测试)
  • Deepin Boot Maker:让启动盘制作效率提升10倍的图形化解决方案
  • 终极突破:macOS Unlocker如何让非苹果硬件完美运行macOS虚拟机