LXC:Linux 容器工具(2)

可用的 LXC 环境

除了一个支持容器的内核外,还需要一些工具才能够简单地启动和管理容器。本文的容器管理工具来自 liblxc(从 参考资料 获取链接。另外,还可以使用 libvirt)。这个小节讨论:

liblxc 工具

iproute2 工具

如何配置网络

如何填充一个容器文件系统(构建定制的 Debian 容器,还是运行 ssh 容器)

如何连接到容器文件系统(SSH、VNC、VT: tty、VT: GUI)

工具:liblxc

下载并解压缩 liblxc (见 参考资料),然后从 liblxc 目录中:

./configure --prefix=/

make

make install

如果您习惯于构建源 RPM,可以从网上下载一个(见 参考资料)。

工具:iproute2

为了在容器中管理网络接口,需要 2.6.26 或更高版本的 iproute2 包(见 参考资料)。如果您的 Linux 发行版没有这个包,请下载并按照说明配置和安装它。

配置网络

很多实用的容器的另一个关键部分是网络访问。目前,桥接(连接多个以太网区段,使它们成为一个单独的以太网区段)是将一个容器连接到网络的最佳方法。为了准备使用 LXC,我们将创建一个桥(见 参考资料),并使用它将我们真正的网络接口与容器的网络接口连接起来。

创建一个名为 br0 的桥:

brctl addbr br0

brctl setfd br0 0

用一个已有网络接口中的 IP(在本例中是 10.0.2.15)连接桥接口:ifconfig br0 10.0.2.15 promisc up。将已有的网络接口(在本例中是 eth0)添加到桥,并取消它与它的 IP 地址的直接关联:

brctl addif br0 eth0

ifconfig eth0 0.0.0.0 up

任何添加到桥 br0 的接口都将对那个 IP 地址作出响应。最后,确保默认的路由用 route add -net default gw 10.0.2.2 br0 将数据包发送到网关。以后,在配置容器时,指定 br0 作为通往外界的链接。

填充容器文件系统

除了网络外,容器常常需要它们自己的文件系统。取决于您的需要,有几种填充容器文件系统的方法。我将讨论其中两种:

构建一个定制的 Debian 容器

运行一个 ssh 容器

使用 debootstrap 命令构建一个定制的 Debian 容器 非常简单:

debootstrap sid rootfs

如果要构建大量的容器,首先将包下载到一个 tarball 中可以节省时间,例如 debootstrap --make-tarball sid.packages.tgz sid 。这将产生一个 .tar 文件,这个文件约 71MB(压缩了 52MB),而一个根目录约 200MB。然后开始在 rootfs 中构建根目录:debootstrap --unpack-tarball sid.packages.tgz sid rootfs。(debootstrap 主页上有更多关于构建更小的或更适合的容器的信息)。

这将生成一个宿主容器高度冗余的环境(见 参考资料)。

运行 ssh 容器 可以大大减少容器文件系统占用的磁盘空间。例如,这种方法仅仅使用数 KB 就能在不同容器的 22 端口上运行多个 ssh 守护进程(参考资料 中提供了一个例子)。容器通过使用关键根目录来实现这一点,例如 /bin、/sbin 和 /lib 等的只读绑定挂载共享来自已有 Linux 系统的 sshd 包内容。这里使用一个网络名称空间,并创建基本的读写内容。

用于生成那些轻量级容器的方法与用于生成 chroot 环境的方法基本一样。不同之处在于只读绑定挂载和使用名称空间增强 chroot 环境的隔离性,使之成为有效的容器。

接下来,需要选择一种连接到容器的方法。

连接到容器

接下来的步骤是连接到容器。根据配置容器的不同方式,有几种方法可供选择:

SSH

VNC(GUI)

VT: tty(文本)

VT: X(GUI)

如果不需要用于容器的 GUI 接口,那么 通过 SSH 连接 就可以了。在此情况下,一个简单的 ssh 连接就足够了(参见上面的 “运行一个 ssh 容器”)。这种方法的优点是依靠 IP 寻址来支持创建任意数量的容器。

如果 ssh 连接花很长的时间才到达密码提示,那么在 DNS 查找期间 Avahi multicast DNS/Service Discovery 守护进程就可能超时。

通过 Virtual Network Computing(VNC)连接,这种方法可以为容器增加一个 GUI 接口。

使用 vnc4server 启动一个 X 服务器,该服务器只为 VNC 客户机服务。需要安装 vnc4server,以便从容器的 /etc/rc.local 文件运行它,如下所示:echo '/usr/bin/vnc4server :0 -geometry 1024x768 -depth 24' >> rootfs/etc/rc.local。当容器启动时,将创建一个分辨率为 1024×768 的 24 位色的 X 屏幕。接下来的连接很简单,如下所示:

vncviewer <ip>:<display>

如果容器与它的宿主共享 tty,那么 通过 VT: tty(文本)连接 就很有用。在这情况下,可以使用 Linux Virtual Terminals(VT)连接到容器。使用 VT 的简单用法是登录 tty 设备之一,然后这个 tty 设备将与 Linux VT 通信。登录进程被称作 getty。使用 VT 8:

echo '8:2345:respawn:/sbin/getty 38400 tty8'

>> rootfs/etc/inittab

一旦容器被启动,它将在 tty8 上运行 getty,以允许用户登录到容器中。可以通过类似的技巧,使用 LXC 工具重新启动容器。

这种方法不支持容器的图形化界面。而且,由于每次只有一个进程可以连接到 tty8,若要启用多个容器,则需要进一步配置。

通过 VT: X 连接 让您可以运行一个 GUI。在 VT 9 上运行 GNOME Display Manager(gdm),然后编辑 rootfs/usr/share/gdm/defaults.conf,将 FirstVT=7 替换为 FirstVT=9,以及将 VTAllocation=true 替换为 VTAllocation=false。

虽然这样便可以使用一个图形化界面,但是仍然只能使用有限的几种 Linux 虚拟终端之一。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/3c1e60b8ebcdc7aa5f7fb345fde30252.html