从Xen Host Kernel复制出一个半虚拟化的Guest
在《创建并启动一个xen半虚拟化PV客户机
》一文中讲解了如何从Ubuntu的http源安装半虚拟化的xen guest OS,核心思想是先下载客户机的vmlinuz和initrd,启动xen虚拟机后将会选择ubuntu网络源,进行在线安装。后来准备做几个guest副本时,发现这种在逻辑卷中安装的guest好像难以复制(暂时不知道,主要是不知道如何mount这个逻辑卷,因为它又被分成了Linux和Swap格式),看如下图,该虚拟机使用的一个lv_domU2:
为了能够方便复制出多个半虚拟化guest,又重新研究和实验了在img中安装guest,这种方式下安装完一个Guest后,我们只需要复制这个guest的img和xen配置文件即可。
这种方法主要参考了:http://www.virtuatopia.com/index.php/Building_a_Xen_Virtual_Guest_Filesystem_on_a_Disk_Image_(Cloning_Host_System)。从Xen
Host复制出一个Guest。
前提:安装完kernel-xen和xen4.5,并且xl info查看没问题。
1)为guest创建root img和swap
创建一个20G的用于根文件系统的 img
# dd if=/dev/zero of=centos1.img bs=1M seek=20480 count=0
然后格式化成Linux 83文件系统格式
# mkfs -t ext3 centos1.img
创建一个2G的用于swap交换的img
# dd if=/dev/zero of=centos1.swap bs=1M seek=2048 count=0
格式化为swap
# mkswap centos1.swap
2)复制Host的根文件系统到guest的根文件系统img中
# mkdir /tmp/loop
# mount -o loop centos1.img /tmp/loop
# cp -ax /{bin,dev,etc,lib,lib64,root,sbin,usr,var} /tmp/loop
这里要非常注意!!!在x86_64中一定要记得复制/lib64,因为lib64中有一些系统必须的链接库。
创建剩余的文件夹
# mkdir /tmp/loop/{home,proc,opt,sys.tmp}
# chmod 777 /tmp/loop/tmp
3)修改guest root filesystem中的一些文件
/tmp/loop/etc/fstab:
/dev/xvda1 / ext3 defaults 1 1
/dev/xvda2 none swap sw 0 0
none /dev/pts devptsgid=5,mode=620 0 0
none /dev/shm tmpfs defaults 0 0
none /proc proc defaults 0 0
none /sys sysfs defaults 0 0
注意这些文件中保存的用户信息和主机信息
/tmp/loop/etc/passwd /tmp/loop/etc/group
/tmp/loop/etc/hosts
修改网络配置
/tmp/loop/etc/sysconfig/network 修改HOSTNAME=centos6-1,GATEWAY=192.168.122.1(xenbr0的IP)
/tmp/loop/etc/sysconfig/network-scripts/ifcfg-eth0 设置一个和Host xenbr0在同一个网段的IP,还要删掉UUID和HWADDR,要不然和host端的硬件地址一样了。或者是在通过控制台连接到虚拟机后再修改也可以。
exported for NFS access to remote systems文件
/tmp/loop/etc/exports
卸载guest的根目录
# umount /tmp/loop/
4)创建一个xen虚拟机配置文件centos1.cfg
为了避免SCSI模块又报错,我们重新生成一个initrd,参考http://www.virtuatopia.com/index.php/A_Xen_Guest_OS_fails_to_boot_with_a_%22switchroot:_mount_failed:_No_such_file_or_directory_error_message%22_error_message.:
mkinitrd --omit-scsi-modules --with=xennet --with=xenblk --preload=xenblk initrd-$(uname -r)-no-scsi.img $(uname -r)
指定启动内核为Host的内核文件
kernel = "/boot/vmlinuz-3.14.42-1.el6xen.x86_84"
ramdisk = "/boot/initrd-3.14.42-1.el6xen.x86_64.img"
memory = 1024
name = "centos1"
vif = [ 'bridge=xenbr0' ]
disk = ['tap:aio:/path/to/centos1.img,xvda1,w', 'tap:aio:/path/to/centos1.swap,xvda2,w']
root = "/dev/xvda1 ro"
需要注意的是,在启动虚拟机的时候可能会报出dracut: chroot: failed to run command `/sbin/load_policy': No such file or directory,这就是因为clone根文件系统时没有把/lib64复制到guest中造成的,参考http://marc.info/?l=xen-users&m=135907220030809。
5)启动并控制台连接到虚拟机
xl create /path/to/centos1.cfg -c
最后出现登录提示,使用Host OS的帐号密码登录即可
CentOS release 6.6 (Final)
Kernel 3.14.42-1.el6xen.x86_64 on an x86_64
centos6-1 login:
6)这样我们就可以通过复制已经创建好的guest的根文件系统img和swap,并且复制修改一个xen客户机配置文件,修改好根文件系统中的一些文件如fstab和network,就可以很方便地clone多个虚拟机了。
版权声明:本文为博主原创文章,未经博主允许不得转载。
页:
[1]