我的声明:本文内容比略长的标题略长,部分内容参考网络,转载不究。
个人态度:Linux作为桌面系统有意思吗?
目的:用现成或过时的服务器搭建非常多小应用和测试环境。
目标:在Debian上运行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自行解决依赖问题,然后耐心等待。
#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已经安装成功,现在创建我们需要的虚拟机。
#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指定镜像安装位置,然后开始创建镜像,在不出错误情况下,过会就会要求输入密码,然后等待安装完成。
#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一样使用虚拟机了。
#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。
... #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方式登录虚拟机,完毕!