首先,我了解虚拟化和容器。我确信您脑海中浮现的就是“他想要容器”。 (别否认!)
然而,容器就像 chroot:如果你想在其中执行 bash,你需要在容器 FS 中的某个位置复制/镜像 bash 可执行文件以及所有必需的库。 (如果我误解了什么,请纠正我)。
我想知道的是我是否可以从当前命名空间启动像busybox这样的程序(使用原始FS,因此不需要复制)并且然后隔离它(例如使用 Linux FS 命名空间)以使其访问一个唯一的目录。
不知何故,ssh(实际上是 sftp)似乎能够执行类似的操作,而不需要 sshd 可执行文件位于 chrooted FS 中。但我仍然缺乏了解自己发生的事情的能力。
答案1
我想您可能正在寻找容器。
或者也许不是。毕竟,Linux 命名空间可以非常透明。我不相信有一种方法可以unshare
为已经被调用的进程提供命名空间,但是您绝对可以unshare
在调用时使用命名空间,几乎没有效果。
cd /tmp
echo you >hey
sudo unshare -m busybox
echo hey >you; cat hey
you
...以及从另一个终端...
cd /tmp
cat you
hey
...坐骑树是共享默认情况下,来自父命名空间,并且,尽管busybox
的挂载传播标志全部设置为私人的默认情况下,直到挂载树的更改以某种方式在命名空间中生效之前,这没有什么区别。这不需要做通过busybox 也可以。
...在busybox
的终端...
echo "#$$"
#8854
...现在从另一个...
sudo nsenter -t8854 -m mount -t tmpfs none /tmp
cd .; cat hey
you
...但是从busybox
的终端,因此从命名空间我们刚刚实现了mount
...
cd .; cat hey
cat: hey: no such file or directory
/tmp
...因为新的私有 tmpfs 已安装在命令中的共享上nsenter
...
cd ..
umount tmp
cat tmp/hey
you