Like的世界

个人总结与随想

LXC简介

| Comments

LXC (Linux Containters) 是一种基于内核容器属性的用户空间接口。 它被认为介于chroot和完全虚拟化之间,其目标为创建一个不需要独立内核,但近可能接近标准Linux安装的环境。

其特性如下:

  • 内核空间(ipc, uts, mount, pid, network和user)
  • 支持Apparmor和SELinux
  • seccomp策略
  • chroots (使用pivot_root)
  • Kernel capabilities
  • 支持cgroups (Control groups)

由于没有完全虚拟化CPU,也没有虚拟化硬盘,其性能是与物理机接近的。实际经验,我发现在LXC中编译C/C++源码(如构建基于C/C++源码的RPM或DEB)的性能是VirtualBox的3倍。强烈建议使用LXC代替KVM和VirtualBox作为RPM或DEB的构建环境。

以下操作基于Ubuntu 12.04,那么需要安装LXC包:

1
sudo apt-get install -y lxc

创建LXC

以创建一个名为precise的Ubuntu 12.04容器为例。

需要创建一个基础的配置文件。由于创建LXC完成后,不再需要该配置文件(可以删除),故该文件的名字和路径没有特殊要求。这里命名为precise.conf,放在当前路径下:

1
2
3
4
lxc.network.type = veth
lxc.network.flags = up
lxc.network.name = eth0
lxc.network.link = lxcbr0

lxcbr0为由LXC包创建的虚拟网桥,通过ifconfig可以知道其IP地址10.0.3.1,网段10.0.3.1/24,容器将通过lxcbr0与外界通信。

如此,可以开始创建容器了:

1
sudo lxc-create -n precise -f precise.conf -t ubuntu -- -r precise
  • -n指定容器名,这里为precise。
  • -f指定基础配置文件,即上一步骤创建的precise.conf。
  • -t指定模板名,这里必须为ubuntu(创建Ubuntu 12.04)。每个模板名,对应一个脚本,它们存放在/usr/lib/lxc/templates目录(文件名形如lxc-<模板名>)中。
  • –以后的参数被传递给模板脚本;
  • -r为ubuntu模板脚本的参数,表示Ubuntu发行版代号,这里必须为precise(它是12.04的发行代号)。

创建过程可能会比较漫长。通过阅读/usr/lib/lxc/templates/lxc-ubuntu,不难发现创建ubuntu容器主要依靠deboostrap来完成。另一方面,变量MIRROR和SECURITY_MIRROR决定了镜像的设置,它们默认为:

1
2
MIRROR=http://archive.ubuntu.com/ubuntu
SECURITY_MIRROR=http://security.ubuntu.com/ubuntu

在大陆地区,使用默认镜像的网速较慢。为了加快创建过程,可以将它们都换成大陆或香港的镜像,如http://ftp.cuhk.edu.hk/pub/Linux/ubuntu

具体问题是lxc-ubuntu并没有提供命令行参数来设置MIRROR和SECURITY_MIRROR。在不修改lxc-ubuntu代码的情况下,唯一的办法就是通过设置相关环境变量来达到这个目的,如:

1
2
3
sudo MIRROR="http://ftp.cuhk.edu.hk/pub/Linux/ubuntu" \
     SECURITY_MIRROR="http://ftp.cuhk.edu.hk/pub/Linux/ubuntu" \
     lxc-create -n precise -f precise.conf -t ubuntu -- -r precise

我司为了加快内部开发和测试人员安装Ubuntu,部署了apt-cacher-ng——一种deb包HTTP缓存代理。由于lxc-ubuntu基于deboostrap,可以通过设置环境变量http_proxy来设置deboostrap的缓存代理(请见Global cache config of debootstrap):

1
2
3
4
sudo http_proxy="http://192.168.88.10:3142/" \
   MIRROR="http://ftp.cuhk.edu.hk/pub/Linux/ubuntu" \
     SECURITY_MIRROR="http://ftp.cuhk.edu.hk/pub/Linux/ubuntu" \
     lxc-create -n precise -f precise.conf -t ubuntu -- -r precise

如此,在尽可能节约外部带宽的同时,最大限度的加快了创建过程。

上述创建方法,容器的架构将与host os的相同(如amd64)。若需要在amd64的host os上创建i386或i686架构的容器,则需要通过模板脚本的-a参数指定i686,如:

1
sudo lxc-create -n precise -f precise.conf -t ubuntu -- -r precise -a i686

启动LXC

若需立即启动LXC,则:

1
sudo lxc-start -n precise

若需以daemon方式运行,则:

1
sudo lxc-start -n precise -d

若需随host os启动而自动启动,则:

1
sudo ln -s /var/lib/lxc/precise/config /etc/lxc/auto/precise.conf

打开LXC控制台

在没有给容器设置IP时,打开其控制台

1
sudo lxc-console -n precise

将看到文本登录界面。 通过按热键ctrl-a和q,可以退出容器控制台。

更多的时候,通过ssh登录将更方便,特别是key认证方式登录。

停止LXC

多数情况下,可以通过在guest os(容器)内执行poweroff或shutdown -h now来关闭容器。但有些时候却需要在host os上强行关闭容器,如:

1
sudo lxc-stop -n precise

删除LXC

容器创建后,配置和数据存放在/var/lib/lxc/precise目录中。执行

1
sudo lxc-destroy -n precise

与手动删除该目录效果一样。

其他模板

  • ubuntu-cloud:从Ubuntu云上下载根文件系统镜像。
  • fedora: 它依赖于yum包,通过模板脚本参数-R指定版本号,如19和20都无法创建成功。默认版本号为14,可以继续安装。
  • opensuse:它依赖于zypper,Ubuntu 12.04默认没有zypper包。虽然ppa:thopiekar/zypper提供了zypper,但是创建失败。
  • busybox:仅有busybox的容器,默认不能远程登录,可以用于练习简单的命令行操作。
  • sshd:将host os中各个系统目录(/bin, /sbin/和/lib等)以只读方式绑定到容器中,仅运行ssh服务器,支持ssh登录,可用于练习复杂的命令行操作。

Comments