我知道 Linux 命名空间,除此之外,还可以用来安全地处理限制和监禁子进程,而不会让它们被僵尸化和转储到init
. 但我对实现细节很模糊。我如何使用util-linux
诸如mount
and提供的工具nsenter
来监视、监视和确保启动的所有进程都是另一个进程的直接命名空间后代?
在阅读了 Linux 命名空间之后,我的印象是,在许多其他功能中,它们是 chroot 的替代品。例如,在这篇文章中:
[名称空间] 的其他用途包括 [...] chroot() 式将进程隔离到单个目录层次结构的一部分。
但是,当我克隆 mount 命名空间时,例如使用以下命令,我仍然看到整个原始根树。
unshare --mount -- /bin/bash
Run Code Online (Sandbox Code Playgroud)
我知道我现在能够在不与原始命名空间共享的新命名空间中执行额外的挂载,因此这提供了隔离,但它仍然是同一个根,例如/etc
两个命名空间仍然相同。我还需要chroot
更改根目录还是有其他选择?
我期待这个问题会提供答案,但答案chroot
再次仅使用, 。
有一条现已删除的评论提到pivot_root
。由于这实际上是 的一部分linux/fs/namespace.c
,因此它实际上是名称空间实现的一部分。这表明仅使用unshare
和更改根目录mount
是不可能的,但命名空间提供了一个自己的——更聪明的—— chroot
. chroot
即使在阅读源代码之后(例如在安全性或更好的隔离的意义上),我仍然不明白这种方法的主要思想,这使得它与 根本不同。
这不是这个问题的重复。执行完答案中的所有命令后,我有单独的 /tmp/tmp.vyM9IwnKuY(或类似的),但根目录仍然相同!
我想知道 Linux 内核中的“命名空间支持”功能到底是什么意思。我正在使用内核 3.11.1(目前最新的稳定内核)。
如果我决定禁用它,我会注意到我的系统有任何变化吗?
如果有人决定使用命名空间,仅NAMESPACES=Y
在内核中编译就足够了,还是他还需要用户空间工具?
/proc/pid/mountinfo
文件的目的是什么(pid是数字进程 ID)?
据我所知,它反映了/proc/mounts
文件的内容,但附加了信息。
此外,该文件似乎对所有进程都保持不变:两个随机选择的进程的 diff 不返回任何输出 ( diff /proc/3833/mountinfo /proc/2349/mountinfo
)
请注意,我不是在问它包含什么。从互联网上的定义中,我看到“此文件包含有关挂载点的信息。”。我在问为什么它存在于每个进程目录中?它在那里的目的是什么?
我不确定我应该用谷歌搜索什么,或者 FUSE 是否这样做(我怀疑不是)。我想创建一个虚拟块设备,所有形式的访问(例如读取和写入)都直接进入我的应用程序。
我知道我可以通过执行创建一个文件作为块设备
dd if=/dev/zero of=~/test count=100k
Run Code Online (Sandbox Code Playgroud)
然后使用创建一个环回
losetup /dev/loop0 ~/test`
Run Code Online (Sandbox Code Playgroud)
但我希望直接访问我的应用程序而不是文件。我希望这个问题很清楚。