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

2012年9月9日星期日

打印自身的 CGI 脚本

有的时候在网络上面分享一个文本,是 UTF-8 编码,可惜浏览器默认用 ISO-8859-1 或者 GBK 来解码,这个时候可以把以下两行放在文本最前面,赋予文本可执行权限,并允许服务器执行 CGI:
#!/bin/bash
if [ "$HTTP_IF_MODIFIED_SINCE" ];then if [ "$(date -u -d "$HTTP_IF_MODIFIED_SINCE" +%s)" -ge "$(stat -c %Y "$0")" ];then echo 'Status: 304 Not Modified';echo;exit 0;fi;fi;echo 'Status: 200 OK';echo 'Content-Type: text/plain; charset=utf-8';echo "Last-Modified: $(date -R -u -d @$(stat -c %Y "$0"))";echo "Content-Length: $(tail -n +3 "$0"|wc -c)";echo;exec tail -n +3 "$0"