![覆盖根上的 Jail/Sandbox 进程并跟踪更改](https://linux22.com/image/212359/%E8%A6%86%E7%9B%96%E6%A0%B9%E4%B8%8A%E7%9A%84%20Jail%2FSandbox%20%E8%BF%9B%E7%A8%8B%E5%B9%B6%E8%B7%9F%E8%B8%AA%E6%9B%B4%E6%94%B9.png)
我想要实现的目标
我想以非特权用户身份运行一个进程,但该进程更改的所有文件都应该只在影子文件夹中更改。此外,如果需要,我想禁用网络功能。
我已经尝试过的
- 使用lowerdir
/
和 upperdir安装覆盖层/temp/fakeroot
,,unshare -rn
chroot /temp/overlay
- 问题:需要 root 才能挂载,覆盖层忽略嵌套挂载(我的主目录)
unshare -rmn
, 使用 lowerdir/
和 upperdir安装覆盖层/temp/fakeroot
- 问题:尝试安装时出错,因为
/tmp
它是以下文件夹的子文件夹/
- 问题:尝试安装时出错,因为
fuse-overlayfs
,unshare -rn
,chroot
- 问题:仅适用于 > 5.16 的内核,可以读取嵌套安装,但无法写入
- 注意:我可以接受内核限制,但嵌套安装使其无法使用
我知道存在替代方案,但似乎前景不佳
- Overlayroot:需要在启动时挂载,不存储更改增量
overlayroot-chroot
: 根据以上。- mergefs 用于将所有文件系统合并为一个:看不出这是如何完成的
- 使用 Docker:需要 root,不存储更改增量
有谁知道如何做到这一点?
答案1
我找到了结合多个上述命令的解决方案。
mkdir -p /tmp/overlay-test/{upper,workdir,mount}
unshare -- map-root-user --net --mount
或短unshare -rnm
mount.mergerfs / /tmp/overlay-test/view -o use_ino,posix_acl=true
(选项为可选)mount -t overlay overlay -o lowerdir=/tmp/overlay-test/view,upperdir=/tmp/overlay-test/upper,workdir=/tmp/overlay-test/workdir /tmp/overlay-test/mount
mount --rbind /dev /tmp/overlay-test/mount/dev
和mount --rbind /proc /tmp/overlay-test/mount/proc
chroot /tmp/overlay-test/mount /bin/bash
总体思路是unshare
创建一个用户(而不是root)可以挂载文件系统的环境。之后,使用 mergefs 将所有子安装(如许多发行版中的 home)合并到一个文件夹中。该单个文件夹可以用作覆盖层的较低目录。为了执行命令,dev
需要proc
映射到overlay文件夹中。这没关系,因为用户无论如何都无法写入这些文件夹。最后但并非最不重要的一点是,chroot
可以执行切换到overlayed-merged-rootfs。在那里所做的所有更改仅在一个目录中完成upper
。完成后,不要忘记卸载所有安装以进行清理。