没有 chroot 的 LXC
Posted
技术标签:
【中文标题】没有 chroot 的 LXC【英文标题】:LXC without chroot 【发布时间】:2012-11-09 05:06:27 【问题描述】:有没有办法使用 LXC 进行资源管理,使用进程组而不创建容器?我正在开发一个在沙箱中运行任意代码的服务,对此我只对硬件资源管理感兴趣。我不想要任何 chrooting;我只希望这些进程组能够访问主文件系统。
有人告诉我 lxc 是轻量级的,但是我看到的所有示例都为每个 lxc 进程创建了一个新容器(即具有完整操作系统的目录)。我真的不明白这比任何其他 VM 解决方案要轻得多。
那么有没有什么方法可以使用 LXC 来控制和管理多个进程组,而无需为每个进程组创建单独的容器?
【问题讨论】:
【参考方案1】:LXC 不是一个单一的系统。它是一个内核特性的集合,可用于以各种不同的方式隔离进程,并且是一个用户空间工具,可将所有这些特性一起使用来创建成熟的容器。但没有 LXC,个别功能仍然可以单独使用。此外,LXC 不需要 chroot,即使您给它一个 chroot,您也可以将主机系统中的目录绑定挂载到容器中,在主机和容器之间共享这些特定的目录树。
例如,LXC 使用 cgroups 来设置容器的资源限制。但它们可用于在不使用 LXC 工具的情况下设置进程组的资源限制。您可以直接操作/sys/fd/cgroup/memory
或/sys/fs/cgroup/cpuacct
,以将进程放入cgroup 中,从而限制它们被允许使用的内存或CPU 数量。或者,如果您在使用systemd
的系统上,您可以使用MemoryLimit=200M
或在给定服务的.service
文件中的类似内容来控制一组进程的内存限制。
如果您想使用 LXC 进行轻量级资源管理,您可以使用或不使用 chroot。启动 LXC 容器时,可以选择要隔离哪些资源;所以你可以创建一个只有虚拟化网络的容器,别无其他;或者只有内存限制但与主机共享其他所有内容的容器。唯一需要隔离的是在容器配置文件中指定的内容。例如,lxc
附带了几个仅隔离网络的示例容器定义;他们与主机共享一个根分区以及几乎所有其他内容。以下是如何运行与主机系统相同的容器,但它没有网络接口:
sudo lxc-execute -n foo -f /usr/share/doc/lxc/examples/lxc-no-netns.conf /bin/bash
如果您希望某些文件与主机共享,而不是其他文件,您有两种选择;您可以使用共享根目录,并挂载您希望在容器中有所不同的文件;或者您可以使用 chroot,但将您想要共享的文件挂载到容器中。
例如,这是一个容器的配置,它与主机共享除/home
之外的所有内容;而是在容器内绑定挂载/home/me/fake-home
到/home
:
lxc.mount.entry = /home/me/fake-home /home none rw,bind 0 0
或者如果你想拥有一个完全不同的根目录,但仍然共享一些目录,例如/usr
,你可以将几个目录绑定到一个目录中,并将其用作文件系统的根目录。
因此您有很多选择,可以选择仅隔离一个组件、多个组件或 LXC 支持的多个组件,具体取决于您的需要。
【讨论】:
以上是关于没有 chroot 的 LXC的主要内容,如果未能解决你的问题,请参考以下文章
Bash:传递 2 个字符串参数或更好地运行一系列命令的 Chroot 命令
Docker----LXC,chroot,namespace&cgroups