Debian5 dom0上跑Xen Debian5 lenny domU&Xen ubuntu10.04 Lucid domU--我爱你,飞一般的感觉
我的声明:本文内容比略长的标题略长,部分内容参考网络,转载不究。
个人态度:Linux作为桌面系统有意思吗?
目的:用现成或过时的服务器搭建非常多小应用和测试环境。
目标:在Debian上运行Xen,在其上运行两个(当然可以多个)常用Linux发行版。
1. 背景
用的是Xen Hypervisor,一个Amazon EC2都在用的开源虚拟化工具,它不是Linux内核的一部分,但是它也需要一个内核来分配资源(KVM是内核里面的东西),它是种para-virtualization(泛虚拟化),我个人感觉会比全虚拟化的产品性能要好点,非常适合烂机器使用,更多精彩的介绍请上香港的谷歌。
Linux发行版用的是Debian和Ubuntu,Ubuntu宣传的很到位,网上资料查起来比它爹Debian要丰富,软件更新非常快,两年还会有一个长期支持版,比较遗憾的是新的东西bug就相对多些,不如稳定的Debian同志(企业占有率比脚高),更遗憾的是B者是个时髦的系统管理员,因此在Ubuntu lucid LTS正式出来的前一天就下载来装,直接用apt来装xen发现官方源里面没有xen-tools,又不想折腾源码安装,直接重装成Debian做dom0了,反正也不用它干什么。
2. Debian上跑Xen
安装完大便Linux后就可以进行下面的步骤了,给一个速度快点的源给apt source,安装Xen hypervisor,安装修改过的适合xen的Linux内核,安装相关工具。
#vi /etc/apt/source.list直接删了里面的内容加入下面的台湾源(和Ubuntu在同一台服务器):
deb http://tw.archive.ubuntu.com/debian/ lenny main non-free contrib deb-src http://tw.archive.ubuntu.com/debian/ lenny main non-free contrib
更新一下源:
#apt-get update这儿需要根据自己机器的CPU架构选择内核,开始安装Xen相关:
#apt-get install xen-linux-system-2.6.26-2-xen-686 xen-utils-3.2-1 xenstore-utils xenwatch xen-shell xen-tools让apt自行解决依赖问题,然后耐心等待。
安装后的微调
让虚拟机有个桥接网络,使用独立的内网IP,需要修改一下xen的配置文件:
#vi /etc/xen/xend-config.sxp搜索network-dummy,在下面加一行:
(network-script network-bridge)查看新内核是否安装成功。如果成功,限制dom0的内存使用量,不然会抢占domU的内存:
#vi /boot/grub/menu.lst ... title Xen 3.2-1-i386 / Debian GNU/Linux, kernel 2.6.26-2-xen-686 root (hd0,0) kernel /xen-3.2-1-amd64.gz dom0_mem=256M module /vmlinuz-2.6.26-2-xen-686 root=/dev/mapper/vpsee-root ro console=tty0 module /initrd.img-2.6.26-2-xen-686 ...如果第一个Title是Xen相关的内核,说明新内核安装成功,然后在kernel一行后加入dom0_mem=256M,然后重启服务器检查Xen安装是否成功:
#shutdown -h now ...等待重启... #uname -a ...Xen...说明已从新内核启动 #xm list Name ID Mem VCPUs State Time(s) Domain-0 0 256 2 r----- 0.9Xen Pypervisor已经安装成功,现在创建我们需要的虚拟机。
3. Xen上跑Debian5 lenny
Xen虚拟机可以运行在lvm上或者文件系统上,本文用xen-tools提供的xen-create-image命令使用文件系统安装。
#man xen-create-image #xen-create-image --hostname=monitorvm --ip=172.20.10.199 --netmask=255.255.255.0 --gateway=172.20.10.1 --dist=lenny --mirror=http://172.20.10.197/debian --size=10gb --memory=768mb --swap=768mb --arch=i386 --passwd --dir=/vms --force首先查看xen-create-image的文档,然后创建一个虚拟机镜像,--ip指定ip地址,--dist指定Linux发行版本,--mirror指定安装源地址,这里可以使用网上的镜像地址,我这里把Debian光盘拷到本地做了一个web服务器,--passwd指定安装后需要设置密码,--dir指定镜像安装位置,然后开始创建镜像,在不出错误情况下,过会就会要求输入密码,然后等待安装完成。
安装完成后,通过xm console命令查看我们创建的monitorvm时,会出现一直卡在自检后的界面情况,这时先关掉虚拟机,修改虚拟机配置文件如下:
#vi /etc/xen/monitror.conf ... # # Extra # extra = 'console=hvc0 xencons=tty'在最后加入这么一行,然后再进xen console成功,输入密码进入系统:
#xm list #xm create monitor.conf #xm list #xm console monitor.conf进入系统最好修改Debian的apt源(跟上面一样),然后用puttyssh登录虚拟机,但是居然显示:ssh stdin: is not a tty,解决办法是重新安装udev:
#apt-get install udev重新登录,成功!如果希望dom0重启后虚拟机自动启动,可以这样:
#ln -s /etc/xen/monitorvm /etc/xen/auto创建一个到auto的链接,从此您就可以像操作普通服务器Linux一样使用虚拟机了。
4. Xen上跑Ubuntu 10.04 Lucid LTS
Debian上默认安装的xen-tools还没有对Ubuntu Lucid支持的很好,这里需要很tricky的修改一些配置文件和模板文件,最新版的xen-tools已经对Lucid进行支持。
将xen-tools的edgy.d模板目录复制一份为lucid.d以方便使用和修改:
#cp -r /usr/lib/xen-tools/edgy.d /usr/lib/xen-tools/lucid.d然后创建一个lucid到gutsy profile的链接:
#ln -s /usr/share/debootstrap/scripts/gutsy /usr/share/debootstrap/scripts/lucid创建两个针对Xen和pygrub的链接:
#ln -s /usr/lib/xen-3.2-1 /usr/lib/xen #ln -s /usr/lib/xen/bin/pygrub /usr/bin/pygrub修改/etc/xen-tools/xm.tmpl使其先列出root设备,pygrub才能正常。用下列代码替换"# Disk device(s)."部分:
{ for ( my $i = 0; $i <= $#PARTITIONS; $i++ ) { if ( $PARTITIONS[$i]{'mountpoint'} eq '/' ) { $OUT .= "root = '/dev/$device" . ($i + 1) . " ro'\n"; } } $OUT .= "disk = [\n"; for ( my $i = 0; $i <= $#PARTITIONS; $i++ ) { if ( $PARTITIONS[$i]{'mountpoint'} eq '/' ) { $OUT .= " '$PARTITIONS[$i]{'imagetype'}$PARTITIONS[$i]{'image'},$device" . ( $i + 1 ) .",w',\n"; } } for ( my $i = 0; $i <= $#PARTITIONS; $i++ ) { if ( $PARTITIONS[$i]{'mountpoint'} ne '/' ) { $OUT .= " '$PARTITIONS[$i]{'imagetype'}$PARTITIONS[$i]{'image'},$device" . ( $i + 1 ) .",w',\n"; } } $OUT .= " ]\n"; }将/usr/lib/xen-tools/lucid.d/30-disable-gettys内容由以下代替:
#!/bin/sh # # This script comments out all virtual terminals which aren't on the # first console - that must remain so that 'xm console ...' works # correctly. # # Steve # -- # http://www.steve.org.uk/ # # Updated for Lucid; DDS/ABC # prefix=$1 # # Source our common functions # if [ -e /usr/lib/xen-tools/common.sh ]; then . /usr/lib/xen-tools/common.sh else . ./hooks/common.sh fi # # Log our start # logMessage Script $0 starting # # Remove the links for upstart # rm ${prefix}/etc/init/tty[!1].conf # # Are we using an alternative serial device? # if [ ! -z "${serial_device}" ]; then serial_device=`basename ${serial_device}` # Let the user know. logMessage "Replacing default serial device (tty1) with ${serial_device}; having destroyed the rest" # replace existing device. mv ${prefix}/etc/init/tty1.conf ${prefix}/etc/init/${serial_device}.conf sed -i -e s/tty1/${serial_device}/ ${prefix}/etc/init/${serial_device}.conf # make sure that it is allowed to login. echo $serial_device >> ${prefix}/etc/securetty fi # # Log our finish # logMessage Script $0 finished创建/etc/xen-tools/role.d/pygrub文件(可选),并赋予可执行权限,使虚拟机能从自己的内核启动,而不是从Xen提供的内核,如果进行这一步,在创建虚拟机镜像时需要使用pygrub和udev两个role。
#!/bin/sh # # Configure the new image to be suitable for booting via pygrub # # Wejn # -- # http://wejn.org/ # # Updated for Lucid; DDS/ABC # prefix=$1 # # Source our common functions - this will let us install a Debian package. # if [ -e /usr/lib/xen-tools/common.sh ]; then . /usr/lib/xen-tools/common.sh else echo "Installation problem" fi # # Update APT lists. # chroot ${prefix} /usr/bin/apt-get update # # Install the packages # set -e installDebianPackage ${prefix} perl installDebianPackage ${prefix} libklibc installDebianPackage ${prefix} klibc-utils installDebianPackage ${prefix} initramfs-tools #installDebianPackage ${prefix} linux-image-2.6-xen-amd64 installDebianPackage ${prefix} linux-virtual # Force initrd if none exists echo ${prefix}/boot/initrd* | grep -q 2\\.6 if [ $? -ne 0 ]; then chroot ${prefix} update-initramfs -c -k `ls -1 ${prefix}/lib/modules/ | head -n 1` fi # Generate grub menu.lst LNZ=`basename \`ls -1 ${prefix}/boot/vmlinuz*|tail -n 1\`` RD=`basename \`ls -1 ${prefix}/boot/initrd*|tail -n 1\`` mkdir -p ${prefix}/boot/grub cat - <<-EOF > ${prefix}/boot/grub/menu.lst default 0 timeout 5 title Debian/Ubuntu root (hd0,0) kernel /boot/$LNZ root=/dev/xvda2 ro initrd /boot/$RD EOF创建虚拟机镜像,需要注意其中的一些参数选项:
#xen-create-image --hostname=lucid --ip=172.20.10.196 --netmask=255.255.255.0 --gateway=172.20.10.1 --dist=lucid --mirror=http://172.20.10.197/lucid/ --size=10gb --memory=512mb --swap=512mb --arch=i386 --passwd --dir=/vms --force --role=udev,pygrub--dist指定为lucid,镜像同样是自己从光盘拷贝的内容,--role指定了udev和我们创建的pygrub。
下面修改虚拟机配置文件,将其自动生成的内核部分注释掉,以使虚拟机从自己内核启动,同样,最后也加上console相关的选项,不然xen console进不去:
... #kernel = '/boot/vmlinuz-2.6.26-2-xen-686' #ramdisk = '/boot/initrd.img-2.6.26-2-xen-686' ... # # Extra # extra = 'console=hvc0 xencons=tty'启动虚拟机:
#xm list #xm create lucid.conf直接启动putty用ssh方式登录虚拟机,完毕!
小结
本文,实现了Debian5 dom0跑Xen Debian5 lenny domU&Xen ubuntu10.04 Lucid domU两种虚拟机,由于lucid刚刚发布,xen-tools对其支持不太完善,需要手动修改一些地方,比较麻烦。
最后需要注意的是虚拟机是以镜像文件形式存在,包括一个配置文件位于/etc/xen/VM_NAME.conf,一个镜像文件和一个swap文件位于创建虚拟机时指定的--dir下,在迁移虚拟机时也非常方便,将镜像和swap文件复制到新xen服务器上,再把配置文件复制到/etc/xen/下(可以使用vsftp,参考Ubuntu网络配置),并修改配置文件中的# Disk device(s)部分的disk到新xen服务器的镜像存放目录,而对于使用pygrub的虚拟机还需要执行上文提到的“创建两个针对Xen和pygrub的链接”,即可完成虚拟机的迁移,最后留下一个问题:怎样扩展虚拟机镜像文件?