一、创建虚拟机硬盘

$ sudo lvcreate -L 4096M -n lucid-srv domU

二 、安装全虚拟的操作系统

通过virt-manager安装一个full-virt的ubuntu 10.04。

gitco的xen 3.4.3跟原生的virt-manager不兼容,导致virt-manager不能利用iso来安装hvm。有三种解决办法:
  1. 使用centos自带的xen,版本是3.1.2,virt-manager可以正常使用;

  2. 使用gitco 的xen 3.4.3,但是自行编译virt-manager0.8.5和virt 0.500-4,可参考下文

  3. 直接使用qemu/qemu-x86_64安装

这三种方式中,第三种最简单,最方便。下面简单说说如何使用qemu安装domU:

  • 安装

$ sudo qemu-x86_64 -hda /dev/domU/lucid-amd64-srv -hdb /dev/domU/lucid-amd64-srv-swap -cdrom /path/to/your/ubuntu-10.04.3-amd64-srv.iso -boot d

这时将弹出一个窗口,接下来安装步骤跟在普通计算机上安装ubuntu是一样的。那安装完了之后如何启动呢?

  • 启动

$ sudo qemu-x86_64 -hda /dev/domU/lucid-amd64-srv -hdb /dev/domU/lucid-amd64-srv-swap -boot

三、更新源

ubuntu推荐日本的源jaist,实在是太快了。

$ sudo apt-get update

四、安装linux-image-ec2

ubuntu中有两个内核支持xen pv

  1. linux-image-ec2

  2. linux-virtual

任选一个安装即可。

$ sudo apt-get install linux-image-ec2
ubuntu 10.04默认内核就支持xen pv,因此不需要额外安装linux-virtual这个软件包(感谢JulyClyde@newsmth)

五、安装grub

$ sudo apt-get purge grub2 grub-pc
$ sudo update-grub
$ sudo apt-get install grub
$ sudo apt-get grub

六、添加/etc/init/hvc0.conf

创建/etc/init/hvc0.conf,内容如下:

# hvc0 - getty
#
# This service maintains a getty on hvc0 from the point the system is
# started until it is shut down again.
start on stopped rc RUNLEVEL=[2345]
stop on runlevel [!2345]
respawn
exec /sbin/getty -8 38400 hvc0

七、生成menu.lst

$ sudo update-grub

八、修改/etc/fstab

/etc/fstab
# <file system> <mount point>   <type>  <options>           <dump>  <pass>
proc            /proc           proc    nodev,noexec,nosuid 0       0
/dev/xvda1      /               ext3    errors=remount-ro   0       1
/dev/xvdb       none            swap    sw                  0       0

在这里很多人会搞混,这里为什么用/dev/xvda1而不是/dev/xvda呢,因为在安装ubuntu的时候,ubuntu会对硬盘进行分区才能使用,前面提到的qemu -hda /dev/domU/lucid-srv -hdb /dev/domU/lucid-srv-swap就有两块硬盘,其中第一块硬盘就有一个分区,也是“/”挂载点,而第二块硬盘单独作为swap分区使用(swap分区有些特别)。以下是在ubuntu中执行fdisk -l的结果。

admin@lucid-srv:/proc$ sudo fdisk -l
[sudo] password for admin:


Disk /dev/xvda: 4294 MB, 4294967296 bytes
10 heads, 63 sectors/track, 13315 cylinders
Units = cylinders of 630 * 512 = 322560 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x000a81f1


    Device Boot      Start         End      Blocks   Id  System

/dev/xvda1   *           4       13312     4192256   83  Linux



Disk /dev/xvdb: 536 MB, 536870912 bytes
255 heads, 63 sectors/track, 65 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000

Disk /dev/xvdb doesn't contain a valid partition table

当然,用户也可以在lucid-hvm安装完毕后,将分区1中的文件全部拷到一个不包含分区表的镜像或块设备中,这样就不需要理会到底是/dev/xvda1还是/dev/xvda了。

这又该怎么操作呢?

$ sudo lvcreate -L 4096M -n lucid-amd64 domU
$ sudo mkfs.ext3 /dev/domU/lucid-amd64
$ sudo mount /dev/domU/lucid-amd64 /tmp/lucid-amd64
$ sudo kpartx -p "" -av /dev/domU/lucid-srv
$ sudo mount /dev/mapper/lucid-srv1 /tmp/lucid-srv
$ sudo cp -rpf /tmp/lucid-srv/* /tmp/lucid-amd64
$ sudo umount /tmp/lucid-amd && umount /tmp/lucid-srv
$ sudo kpartx -d /dev/domU/lucid-srv

通过该操作,/etc/fstab中的/dev/xvda1就可以改成/dev/xvda了。

九、将kernel拷到dom0中

$ sudo kpartx -p "" -av /dev/domU/lucid-srv
$ sudo mount /dev/mapper/lucid-srv1 /tmp/lucid-srv
$ sudo cp /tmp/lucid-srv/boot/* /boot/domU/lucid/amd64/
$ sudo umount /tmp/lucid-srv
$ sudo kpartx -d /dev/domU/lucid-srv

十、创建配置文件lucid-srv-pv.cfg

/etc/xen/domU/U1004-64.cfg
name = "U1004-64"
uuid = "a54ebcb6-bb68-4b30-8253-5e1ec1acdd4a"
maxmem = 1024
memory = 1024
vcpus = 1
#bootloader = "/usr/bin/pygrub"
kernel = "/boot/domU/lucid/amd64/vmlinuz-2.6.32-21-server"
ramdisk = "/boot/domU/lucid/amd64/initrd.img-2.6.32-21-server"
on_poweroff = "destroy"
on_reboot = "restart"
on_crash = "restart"
disk = [ "phy:/dev/domU/lucid-srv,xvda,w",
            "phy:/dev/domU/lucid-srv-swap,xvdb,w"
]
root="/dev/xvda1 ro"
vif = [ "mac=00:16:3e:79:72:aa,bridge=eth0" ]

这时执行xm create U1004-64.cfg命令后,就可以通过dom0中的内核启动domU了,假如需要通过pygrub来启动domU,只需要简单的将配置文件中的kernel和ramdisk注释掉,同时启用bootloader一行就可以实现pygrub了。