2012年9月16日星期日

User Mode Linux 高效半虚拟化

今天看到一个软件 coLinux,可以在 Windows 上面半虚拟化跑 Linux,效率据说比真机 Linux 还快。
急忙寻求 Linux 下面的类似解决方案,找到了 User Mode Linux,简称 UML。
官方网站在此: http://uml.devloop.org.uk/
下载一个内核,然后解压,当作普通程序一样执行它:
wget -c http://uml.devloop.org.uk/kernels/kernel********.bz2
bunzip2 kernel********.bz2
chmod +x kernel********
./kernel******** ubda=root_fs
别急,先弄一个 root_fs 再说,可以在网站上面下载然后解压,也可以自己弄。既然没有 ArchLinux,我就决定自己弄。
touch arch.img
truncate -s 8G arch.img
mkfs -t ext4 -F arch.img
mkdir arch
sudo mount -o loop arch.img arch
sudo mkdir -p arch/var/lib/pacman
sudo pacman -Sy -r arch base net-tools # 其实 linuxmkinitcpio 之类的软件包可以不选。
sudo vim arch/etc/fstab # 编辑 fstab
sudo vim arch/etc/rc.conf # 编辑 rc.conf
rc.conf 的网络配置里面写:
interface=eth0
address=10.1.0.2
netmask=255.255.0.0
gateway=10.1.0.1
然后卸载卷。
sudo umount arch
rmdir arch
配置网络(这一节需要 root 权限,如果你没有办法获得 root 权限,可以考虑用 slirp 方式而不是现在的 tuntap 方式配置网络,前面的 rc.conf 也要配合修改,这里就不介绍了):
tunctl -u "$(id -un)" -g "$(id -gn)" -t tap1 # tunctluml_utilities 包里面。
ifconfig tap1 10.1.0.1
echo 1 >/proc/sys/net/ipv4/ip_forward # 1> 之间的空格不要忘记咯
iptables -t nat -A POSTROUTING -j MASQUERADE
最后,启动!秀一下我自己的配置:
./kernel64-3.5.4 ubda=arch.img mem=1G con=pty con1=fd:0,fd:1 root=/dev/ubda eth0=tuntap,tap0

P.S.: 貌似 UML 的 /dev/random 有点问题,读取的时候会卡住,导致 pacman-key 不能跑,临时用这个方法代替吧。
ls -l /dev/urandom 确认看到的是这样的:
crw-r--r-- 1 root root 1, 9 /dev/urandom
确认 root 右边那两个数字是 1, 9
然后用 /dev/urandom 来覆盖掉 /dev/random
mknod /dev/random c 1 9

最后我要说的事是:它的速度真的很快,我 2.4G 主频的 CPU,开机只需要 8 秒左右,确实比真机都快了。(但是据说有的 OpenVZ 能够 2 秒开机……)