我用架构Linux作为我的主要操作系统,我开发了一个网络应用程序森托斯。最初我LXC Container
在我的 Arch 中使用来运行森托斯,但是由于通过 Wifi 配置网络等问题,我决定寻找替代方案,有人建议chroot
直接 ing 可能会起作用。
目前我只是使用LXC
命令来创建一个森托斯并chroot
投入其中并工作。我还将/bind
,/proc
和安装/sys
到我的chroot
ed 环境中。我的网络应用程序运行良好,没有任何问题。
这种方法有什么问题/警告吗?我还没有尝试过类似的高级事情Java JVM
。我知道它使用主机系统的内核,并且我猜想System Calls
在 Linux 中向后兼容(这就是这个想法起作用的原因),所以一切都应该像您期望的那样无缝工作。
我仍然想知道是否在某些情况下您可能会遇到使用问题chroot
?是否有任何场景chroot
可能无法像正常系统一样工作?从逻辑上讲,只要内核向后兼容,我就看不到任何东西。我能想到的一个地方是,主机系统的内核与原始内核相比具有不同的实现,并且其中是否存在通常不太可能的错误。
当我使用拱,我想得到一个总体的看法。我的主要想法是将这个推荐给不使用的同事森托斯由于各种原因作为他们的主要操作系统。在某些用例中,您需要在 64 位计算机上使用 32 位计算机。他们中的很多人花费了大量时间来设置虚拟机等,但这对于 Linux“虚拟化”上的 Linux 来说真的需要吗?我个人觉得chroot
很棒,不仅仅是一个调试工具,但是我想得到一些专家的意见。
答案1
Chroot 不是一个容器,它只是改变文件系统的视图。网络仍然相同,设备仍然相同,pid 仍然相同,uid 仍然相同,root 仍然是 root。
这意味着 chroot 中采取的操作可能会影响更广泛的系统。如果您在 chroot 中启动一个守护程序并且它绑定到一个端口,那么它将占用整个系统上的该端口,而不仅仅是在 chroot 中。如果您(或脚本)在 chroot 中使用killlall,它也会杀死 chroot 之外的进程。
特别是在 chroot 中安装/升级软件包可能会导致守护进程无意中启动和/或安装过程由于无法启动守护进程而失败。写得不好的脚本甚至可能会在启动 chroot 中的版本之前杀死主机系统上的守护进程,从而导致很多混乱(我确信多年前我至少遇到过一个案例,发送到 127.0.0.1:25 的电子邮件似乎无处可去,我最终发现它们是由配置为“仅本地邮件”的 chroot 中的 MTA 处理的)。
一些发行版确实具有在 chroot 启动守护进程中停止软件包安装的机制,但细节显然是特定于发行版的。
答案2
chroot
不是容器,并且不会将进程与系统的其余部分完全隔离。如果挂载/proc
在 chroot 目录中,则在该 chroot 中启动的进程可以看到在 chroot 外部运行的进程。
也就是说,如果您不介意的话,它chroot
的设计目的正是为了处理您所描述的情况。事实上,在 Debian 提供多架构支持之前,在 64 位系统上运行 32 位应用程序的推荐方法是创建 32 位 chroot 并安装最小的 32 位 Debian 基础。