此创建虚拟机的脚本为使用虚拟机xml文件为模板创建,非virt-install命令。当然,用virt-install命令也可以,但没有xml文件灵活,胜在方便简洁。
centos底层镜像(minimal安装)
此底层镜像minimal安装,配置了阿里云的yum源,以及关闭了firewalld和selinux,自启动iptables,也安装了一些常用的软件包,也删除了所有的Mac地址和UUID信息防止虚拟机冲突。 也可以自己制作底层镜像。 网盘链接:https://pan.baidu.com/s/1uOwHN6E1Yhp3fsIkO7b66w 提取码:29mp MD5校验码:f327b2c07b7fcd445ea4e5350c4c3c89 默认存放路径:/var/lib/libvirt/images/CentOS7.qcow2
XML文件内容
默认存放路径: /etc/libvirt/qemu/CentOS7.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75
| <domain type='kvm'> <name>NAME</name> <memory unit='GiB'>MEM</memory> <currentMemory unit='GiB'>MEM</currentMemory> <vcpu placement='static'>VCPU</vcpu> <os> <type arch='x86_64' machine='pc-i440fx-rhel7.0.0'>hvm</type> <boot dev='hd'/> </os> <features> <acpi/> <apic/> </features> <cpu mode='custom' match='exact' check='partial'> <model fallback='allow'>Broadwell-noTSX-IBRS</model> </cpu> <on_poweroff>destroy</on_poweroff> <on_reboot>restart</on_reboot> <on_crash>destroy</on_crash> <pm> <suspend-to-mem enabled='no'/> <suspend-to-disk enabled='no'/> </pm> <devices> <emulator>/usr/libexec/qemu-kvm</emulator> <disk type='file' device='disk'> <driver name='qemu' type='qcow2'/> <source file='/var/lib/libvirt/images/NAME.img'/> <target dev='vda' bus='virtio'/> </disk> <controller type='pci' index='0' model='pci-root'/> <controller type='ide' index='0'> </controller> <controller type='virtio-serial' index='0'> </controller> <interface type='network'> <source network='vbr1'/> <model type='virtio'/> </interface> <interface type='network'> <source network='vbr2'/> <model type='virtio'/> </interface> <serial type='pty'> <target type='isa-serial' port='0'> <model name='isa-serial'/> </target> </serial> <console type='pty'> <target type='serial' port='0'/> </console> <channel type='unix'> <target type='virtio' name='org.qemu.guest_agent.0'/> </channel> <channel type='spicevmc'> <target type='virtio' name='com.redhat.spice.0'/> </channel> <input type='tablet' bus='usb'> </input> <input type='mouse' bus='ps2'/> <input type='keyboard' bus='ps2'/> <graphics type='spice' autoport='yes'> <listen type='address'/> <image compression='off'/> </graphics> <video> <model type='qxl' ram='65536' vram='65536' vgamem='16384' heads='1' primary='yes'/> </video> <memballoon model='virtio'> </memballoon> </devices> </domain>
#如果修改了虚拟机磁盘的存放路径,注意修改28行虚拟机磁盘存放的位置 # 如果需要在root下,请给root目录加r权限
|
网桥文件内容
默认存放路径 /etc/libvirt/qemu/networks/vbr1.xml
1 2 3 4 5 6 7 8 9 10 11
| <network> <name>vbr1</name> <forward mode='nat'/> <bridge name='vbr1' stp='on' delay='0'/> <ip address='192.168.11.1' netmask='255.255.255.0'> <dhcp> <range start='192.168.11.50' end='192.168.11.100'/> </dhcp> </ip> </network> #去除了uuid和mac地址,定义时可自动生成
|
变量声明
1 2 3 4
| clone_img=用于cow的底层镜像(模板机) clone_xml=用于创建虚拟机的xml配置文件 host_img=创建的虚拟机的磁盘存放路径 host_xml=创建的虚拟机的xml文件存放路径
|
脚本文件内容
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73
| #!/bin/bash
#源镜像和源xml文件的路径 src_img="/var/lib/libvirt/images/virtualmachine/centos7.qcow2" src_xml="/etc/libvirt/qemu/centos7.xml"
#克隆机镜像和xml文件存放的路径 dest_img_dir="/var/lib/libvirt/images/img/" dest_xml_dir="/etc/libvirt/qemu/xml/"
#判断路径变量是否存在 if [ ! -f $src_img ];then echo "Erroy: No found $src_img" exit 3 fi if [ ! -f $src_xml ];then echo "Erroy: No found $src_xml" exit 3 fi
[ -d $dest_img_dir ] mkdir $dest_img_dir [ -d $dest_xml_dir ] mkdir $dest_xml_dir
#判断需要创建的虚拟机名字是否存在 read -p 'name : ' name [ -z "$name" ] && echo -e && echo "name is empty" >&2 && exit 1 for i in virsh list --all awk '{print $2}' sed '1,2d;$d' do [ $name == $i ] && echo "name is conflict" >&2 && exit 2 done
#判断内存变量是否合理并不超过8 read -p 'mem(G) :[2] ' mem mem=${mem:-2} [ -z "$mem" ] && echo -e && echo "mem is empty" >&2 && exit 1 if [[ $mem = *[!0-9]* ]]; then echo -e echo "mem only is integer" >&2 exit 2 fi [ $mem -gt 8 ] && echo -e && echo "mem is too large" >&2 && exit 3
#判断cpu变量是否合理 read -p 'cpu :[1] ' cpu cpu=${cpu:-1} [ -z "$cpu" ] && echo -e && echo "cpu is empty" >&2 && exit 1 if [[ $cpu = *[!0-9]* ]]; then echo -e echo "cpu only is integer" >&2 exit 2 fi [ $cpu -gt 4 ] && echo -e && echo "cpu is too large" &>2 && exit 3
#创建克隆机模板 qemu-img create -b $src_img -f qcow2 ${dest_img_dir}${name}.img &> /dev/null [ $? -eq 0 ] && echo -e "\033[1mqemu-img \033[32m[Done]\033[0m" [ $? -ne 0 ] && echo -e "\033[1mqemu-img \033[31m[Failed]\033[0m"
#拷贝模板机的xml文件并修改参数 cp $src_xml ${dest_xml_dir}${name}.xml &> /dev/null sed -i "s/NAME/${name}/" ${dest_xml_dir}${name}.xml &> /dev/null sed -i "s/MEM/${mem}/" ${dest_xml_dir}${name}.xml &> /dev/null sed -i "s/VCPU/${cpu}/" ${dest_xml_dir}${name}.xml &> /dev/null
#定义虚拟机 virsh define ${dest_xml_dir}${name}.xml &> /dev/null [ $? -eq 0 ] && echo -e "\033[1mvirsh-define \033[32m[Done]\033[0m" [ $? -ne 0 ] && echo -e "\033[1mvirsh-define \033[31m[Failed]\033[0m"
#开启虚拟机 virsh start $name &> /dev/null [ $? -eq 0 ] && echo -e "\033[1mstart_host \033[32m[Done]\033[0m" [ $? -ne 0 ] && echo -e "\033[1mstart_host \033[31m[Failed]\033[0m"
|
排错思路
脚本分三部分,那一部分出错,会报红,哪一部分报红,就重复运行报红部分的命令,把变量替换为实际路径
1 2
| qemu-img create -b $clone_img -f qcow2
|
此命令一般不会出错,出错原因可能是变量有问题,脚本路径不对
1
| virsh define ${host_xml}${name}.xml
|
错误原因较多,可能目录没有libvirt的读取权限,可能配置文件错误
此部分出错原因一般为虚拟机磁盘位置问题