KVM之通过virsh制作p_w_picpath 实现批量创建KVM虚拟机
*******通过KVM虚拟机xml模板文件创建虚拟机(制作一个raw格式的p_w_picpath,并安装ubuntu操作系统)******************一、准备工作1、准备一个KVM虚拟机配置文件模板KVM虚拟机配置文件模板文件已上传至附件:kvm_vm_raw_template.xml复制一份虚拟机配置文件模板:kvm_vm_raw_template.xml2、确定p_w_picpath的存储路径3、创建raw格式的p_w_picpath文件4、准备ubuntu14.4的ISO文件二、定义kvm_vm_raw_template.xml虚拟机配置文件注意:xml文件中的所有“%%”均为变量,比如:%VM_NAME%通过sed 替换变量,这时候,虚拟机名称为:ubuntu14.04_temp1、虚拟机整体信息配置 <name>%VM_NAME%</name> 虚拟机名字 <uuid>%UUID%</uuid> UUID值 <memory>1048576</memory> 内存总大小,已KB为单位 <currentMemory>1048576</currentMemory> 当前内存大小 <vcpu>1</vcpu> CPU数量配置如下:sed -i "s,%VM_NAME%,ubuntu14.04_temp,g" ubuntu14.04.xml 通过uuidgen命令生成UUID值uuid=`uuidgen`sed -i "s,%UUID%,$uuid,g" ubuntu14.04.xml 2、系统信息配置<os> <type arch='x86_64' machine='pc-0.14'>hvm</type> 系统架构和机器类型,hvm代表是基于硬件虚拟化,如要查看支持的机器类型:qemu-system-x86_64 -M ? <boot dev='hd'/> 启动介质,首先使用hard disk作为首选启动介质,比如cdrom,floppy <bootmenu enable='yes'/> 是否开启启动选项菜单,虚拟机启动时可按F12进入启动菜单 </os>3、创建p_w_picpath文件和配置3.1、创建一个raw格式p_w_picpathqemu-img create -f raw ubuntu14.04.raw 20Gsed -i "s,%IMAGE_PATH%,/datapool/vm/ubuntu14.04.raw,g" ubuntu14.04.xml <disk type='file' device='disk'> <driver name='qemu' type='raw' cache='none'/> <source file='/datapool/vm/ubuntu14.04.raw'/> <target dev='vda' bus='virtio'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x08' function='0x0'/> </disk>4、挂载ISO <disk type='file' device='cdrom'> <driver name='qemu' type='raw' cache='none'/> <source file='/datapool/iso/ubuntu-14.04.3-server-amd64.iso'/> #指定ISO文件路径 <target dev='hda' bus='ide'/> <readonly/> <address type='drive' controller='0' bus='1' unit='0'/> </disk>5、虚拟网卡随机生成mac地址命令:openssl rand -hex 6 | sed 's/(..)/1:/g; s/.$//'40:d9:44:0c:55:ac <interface type='bridge'> <mac address='40:d9:44:0c:55:ac'/> <source bridge='br100'/> <target dev='vnet0'/> <alias name='net0'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/> </interface>6、定义虚拟机virsh define ubuntu14.04.xml 定义虚拟机,define告诉libvirt,要被libvirt管理#查看虚拟机列表root@kvmhost1:/datapool/vm# virsh list --all Id 名称 状态---------------------------------------------------- - ubuntu14.04_temp 关闭#启动虚拟机virsh start ubuntu14.04_temp 7、vnc查看虚拟机,#查看VNC端口root@kvmhost1:/datapool/vm# virsh vncdisplay ubuntu14.04_temp :0安装vncviewer工具apt-get -y install vncviewervncviewer 192.168.89.3:0 连接,注意这里的IP地址为br100的IP8、接着开始安装操作系统,当操作系统和需要的软件安装好之后,将虚拟机关闭,并且将虚拟机raw格式p_w_picpath保存至此,一个raw格式p_w_picpath文件就已经创建完成,而且操作系统也完成安装,等会利用raw格式的p_w_picpath作为backing_file,批量创建qcow2磁盘(作为虚拟机的磁盘)***************************利用raw格式p_w_picpath作为backing_file,批量创建qcow2磁盘(作为虚拟机的磁盘)********************************一、批量创建ubuntu虚拟机解决方案:方案1、手动安装,繁琐、蛋疼方案2、直接复制,复制已经安装好系统的raw格式p_w_picpath文件,需要创建多少台虚机就复制多少份,分别利用备份文件创建虚拟机,但主要的时间会花费在复制p_w_picpath上方案3、qcow2快速创建,利用已经安装好系统的raw格式p_w_picpath文件作为backing_file文件,需要创建多少台虚机就复制多少份qcow2格式p_w_picpath,再分别利用qcow2文件创建虚拟机,时间花费非常少*在这里选择方案3之前制作好的raw格式p_w_picpath(操作系统已安装好),需要注意的地方:1、尽量不要修改p_w_picpath2、不要直接利用这个p_w_picpath创建虚拟机3、避免人为读写进程对这个p_w_picpath进行操作,比如挂载二、开始编写批量创建脚本1、脚本已经写完脚本文件可参考:create_qcow2_vm.bash 脚本文件已上传至附件2、利用这种方法建立起来的虚拟机,有如下问题:2.1、主机名完全相同2.2、虚拟机内存保存的MAC地址仍然是backing_file中MAC地址(经测试发现,较新版本的KVM不会出现MAC地址相同的情况)解决方案:将qcow2 p_w_picpath挂载之后,再对主机名和MAC地址进行修改1、挂载qcow2文件,首先需要安装依赖包kpartx,使用kpartx工具来挂载虚拟机磁盘镜像文件2、使用nbd模块挂载qcow2文件(modprobe命令用于智能地向内核中加载模块或者从内核中移除模块。 modprobe可载入指定的个别模块,或是载入一组相依的模块。modprobe会根据depmod所产生的相依关系,决定要载入哪些模块。若在载入过程中发生错误,在modprobe会卸载整组的模块。)#********************命令如下:***********************apt-get -y install kpartx#激活nbd模块modprobe nbd max_part=63#将qcow2文件挂载到/dev/nbd0设备(注意:如果/dev/nbd0被占用,可以使用/dev/nbd1设备)qemu-nbd -c /dev/nbd0 ubuntu14.04_vm5.qcow2#处理/dev/nbd0下的分区kpartx -a /dev/nbd0 #这里需要暂停一下sleep 1#查看qcow2文件中的各种分区(这里看到带nbd字样的才是可挂载的分区,哪个分区是根分区需要尝试之后才能确定)ls /dev/mapper#确定根分区root@kvmhost1:/datapool/vm/ubuntu14.04_vm5# temp_file=`mktemp`root@kvmhost1:/datapool/vm/ubuntu14.04_vm5# rm -rf $temp_file; mkdir -p $temp_file root@kvmhost1:/datapool/vm/ubuntu14.04_vm5# mount /dev/mapper/nbd0p1 $temp_file root@kvmhost1:/datapool/vm/ubuntu14.04_vm5# ls $temp_file/usr #没有挂载的这个分区/usr这个目录,说明不是根分区ls: 无法访问/tmp/tmp.nmt6d15vlK/usr: 没有那个文件或目录root@kvmhost1:/datapool/vm/ubuntu14.04_vm5# ls $temp_file #查看了一下,这个估计是/boot分区abi-3.19.0-25-generic config-3.19.0-25-generic grub initrd.img-3.19.0-25-generic lost+found memtest86+.bin memtest86+.elf memtest86+_multiboot.bin System.map-3.19.0-25-generic vmlinuz-3.19.0-25-genericroot@kvmhost1:/datapool/vm/ubuntu14.04_vm5# umount $temp_file #取消这个分区的挂载 root@kvmhost1:/datapool/vm/ubuntu14.04_vm5# mount /dev/mapper/nbd0p2 $temp_file #挂载nbd0p2分区root@kvmhost1:/datapool/vm/ubuntu14.04_vm5# ls $temp_file #挂载成功后,查看分区的内容,原来这个就是根分区了bin boot dev etc home initrd.img lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var vmlinuzroot@kvmhost1:/datapool/vm/ubuntu14.04_vm5# ls $temp_file/usr #这个分区有/usr目录bin games include lib local sbin share src#确保无误后,下面开始修改主机名HOST_NAME="vm5"sed -i "s,127.0.0.1.*,127.0.0.1 $HOST_NAME,g" $temp_file/etc/hostsecho $HOST_NAME > $temp_file/etc/hostname#修改MAC地址经测试发现,较新版本的KVM不会出现MAC地址相同的情况,我的环境是ubuntu14.04下面是我批量创建的4台VM,可以看出MAC地址真的没有重复,或许真的和版本有关系vm4 fa:92:28:bd:1a:79vm2 fa:92:15:28:d7:d5vm3 fa:92:ad:51:87:54 vm1 fa:92:38:68:52:e0#卸载挂载的分区(一定要注意卸载顺序)root@kvmhost1:/datapool/vm/ubuntu14.04_vm5# umount $temp_file root@kvmhost1:/datapool/vm/ubuntu14.04_vm5# qemu-nbd -d /dev/nbd自此全部完成,就可以启动qcow2磁盘的虚拟机了