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 秒开机……)

5 条评论:

  1. 看起来不错的说,能部署到生产环境吗?比OpenVZ怎么样?Xen/KVM呢?

    回复删除
    回复
    1. 我折腾 Xen 折腾了一个星期……
      这个,我只折腾了一个小时。
      你应该知道哪个容易哪个难吧。

      但是缺点是,目前不能很好地利用多核 CPU(当然你说你要开两个 UML 把 CPU 全部用上那是另外一回事,安慰一下,KVM 对多核利用也不够好)
      如果要部署,网络应该是用桥接而不是 masquerade 了吧。

      这个是不需要修改主机内核的,只是客户机内核是定制的而已,甚至不需要 root 权限(如果用 slirp 配置网络就不需要 root)。而 Xen、OpenVZ 要动大手术,主机内核都需要特殊的补丁。

      删除
    2. 另外我觉得效率应该不如 OpenVZ,但是比 KVM 快。
      因为 OpenVZ 是内核态的,而 UML 是用户态的,光从这个就不一样了……
      但是从配置方面来说,UML 很省心,更灵活。

      删除
    3. 部署还是有一些要考虑的事情。比如 UML 里面执行 mount -t hostfs none /host 就可以浏览主机里面的文件,这个方便了文件共享,但是带来了部署的麻烦,解决方法我已经找到了,如下:
      http://sourceforge.net/mailarchive/message.php?msg_id=27302239

      删除
    4. (续前面3条回复)我个人觉得 UML 的最大用武之地是桌面。很多人用 UML 来调试内核,这个还真是好主意。
      不是说服务器上面不能部署,确实可以,但是论效率比 KVM 高,但比不上内核态的 OpenVZ,论自由比 OpenVZ 自由,却比不上 KVM……

      删除