Linux Containers 是一种系统级的虚拟化方案。其实也就是个增强型的 chroot,和 BSD 的 jail 差不多吧。
准备工作
安装 lxc 以及 bridge-utils 软件包。后者是用来建立网络的。关于对内核的要求什么的请查阅此文。虽然其内容有些过时了,但是参考价值还是很高的。当然,一般新一点的通用内核都支持的啦。
然后想好在建立的 Container 里放什么系统。比如我用的 Funtoo,安装教程在这里。但其实大部分内容没什么用的。按照这里的指示下载一个合适的 stage3 包,并解压到一个目录中。portage 的安装等后续工作就不说了。
创建一个网桥并分配 IP 地址:
$ sudo brctl addbr br0 $ sudo ifconfig br0 192.168.10.1
由于我使用的是无线网络,因此不能使用一般教程中的方法将 eth0 加到网桥中去。建立个 NAT 好了:
echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward sudo iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -j MASQUERADE
配置
按下边这样新建一个文本文件:
# Container 的名字 lxc.utsname = funtoo # 网络类型。我使用的是 veth lxc.network.type = veth lxc.network.flags = up # 刚刚建立的网桥名 lxc.network.link = br0 #lxc.network.hwaddr 不要乱写,会出错的!让 lxc 自己决定吧。 # IP 地址。和网桥同一网段即可 lxc.network.ipv4 = 192.168.10.2 lxc.network.name = eth0 # fstab 文件 lxc.mount = /home/lilydjwg/workspace/funtoo/funtoo_root/etc/fstab # 新系统的根文件系统 lxc.rootfs = /home/lilydjwg/workspace/funtoo/funtoo_root # tty 数量。如果不给出的话 lxc-console 是连不上去的 lxc.tty = 7
然后,修改 funtoo 里的配置文件啦。首先是/etc/fstab
:
none /home/lilydjwg/workspace/funtoo/funtoo_root/dev/pts devpts defaults 0 0 none /home/lilydjwg/workspace/funtoo/funtoo_root/proc proc defaults 0 0 none /home/lilydjwg/workspace/funtoo/funtoo_root/sys sysfs defaults 0 0 none /home/lilydjwg/workspace/funtoo/funtoo_root/dev/shm tmpfs defaults 0 0 /home/lilydjwg/tmpfs /mnt bind 0 0
最后一行就是和主系统共享的目录啦。不过我这里没有生效 :-(
然后删掉/etc/mtab
。
修改/etc/inittab
启动配置文件。lxc-start
命令启动的那个终端会是 container 的/dev/console
文件:
# TERMINALS c1:12345:respawn:/sbin/agetty --noclear 38400 console linux c2:2345:respawn:/sbin/agetty 38400 tty1 linux
ttyN 上的 agetty 可以留着,因为我已经分配了足够的 tty 给它们。使用lxc-console -t 3 -n funtoo
就可以连上 tty3。
修改/etc/resolv.conf
,配置一个 DNS 服务器。
删除/etc/runlevels/default
下关于 udev 的项;udev 是不会工作的。
给新系统中的 root 设置个密码:
$ sudo chroot /path/to/funtoo/root/ /bin/bash funtoo ~ # passwd
创建新的 container。注意创建之后那个配置文件就没有用了。lxc 会复制一份到/var/lib/lxc/funtoo/config
,需要的时候可以改它。
$ sudo lxc-create -f /path/to/config/file -n funtoo
启动啦
如果我没记错的话,现在就可以启动 funtoo 啦:
$ sudo lxc-start -n funtoo
不想它占用一个终端的话就加-d
选项让它在后台跑吧。
不过这时候网络还没配置好。虽然 eth0 已经有 IP 地址了,也可以和主系统相互通讯,但是路由表仍需要手动加上,不然访问不了外网的。
funtoo ~ # route add -net 0.0.0.0 gw 192.168.10.1
然后就尽情地玩儿吧 :-)