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
然后就尽情地玩儿吧 :-)
参考资料
其它链接