master
root 2 years ago
commit cd054f3e4f
  1. 122
      control/VMHost.sh
  2. 26
      control/VMTemplate.sh
  3. 13
      template/template.conf
  4. 106
      template/template.xml
  5. BIN
      vdisks/.qcow2

@ -0,0 +1,122 @@
#!/usr/bin/bash
<<!
editor : NewRain
date : 2022-08-14
for kvm virtual machine
!
# 脚本控制区域
MAIN_PATH=$(cd $(dirname $0); cd ..; pwd)
CONTROL_PATH=$MAIN_PATH/control
MOUNT_PATH=$MAIN_PATH/mount
VDISKS_PATH=$MAIN_PATH/vdisks
TEMPLATE_IMAGE_NAME="template.qcow2"
TEMPLATE_CONFIG_NAME="template.xml"
TEMPLATE_NETWORK_NAME="template.conf"
TEMPLATE_PATH=$MAIN_PATH/template
CONFIG_PATH=/etc/libvirt/qemu
ERROR_INFO='
"Usage: $0 [OPTION]..."\n
\t -h, --help \t查看帮助"\n
\t -a, --address \t虚拟机的IP地址"\n
\t -p, --port \t虚拟机的VNC端口"\n
\t -n, --name \t虚拟机的名称"\n
\t -c, --cpus \t选填,虚拟机的CPU数量,默认为1"\n
\t -m, --memory \t选填,虚拟机的内存大小,单位M,默认为512M"\n
'
options=$(getopt -l "help,address:,port:,name:,cpus::,memory::" -o "a:p:n:c:m:" -a -- "$@")
if [ $# -lt 1 ];then
echo -e $ERROR_INFO
exit 0
fi
eval set -- "$options"
while true
do
case "$1" in
-h|--help)
echo -e $ERROR_INFO
exit
;;
-a|--address)
shift
ping -c 2 -w 1 $1 &>/dev/null
if [ $? -eq 0 ]; then
echo "IP地址已被使用,请更换"
exit 1
fi
KVM_ADDRESS=$1
shift
;;
-p|--port)
shift
ss -tnlp | grep :$1 &>/dev/null
if [ $? -eq 0 ]; then
echo "端口已被使用,请更换"
exit 1
fi
KVM_PORT=$1
shift
;;
-n|--name)
shift
virsh list --all | awk '{print $2}' | grep -E "^$1$" &>/dev/null
if [ $? -eq 0 ]; then
echo "名称已被使用,请更换"
exit 1
fi
VM_HOSTNAME=$1
shift
;;
-c|--cpus)
shift
cpus=`lscpu | awk '/^CPU\(s\):/{print $2}'`
vmcpus=${1:-"1"}
if [ $vmcpus -ge $cpus ]; then
echo "CPU数量不能大于系统的CPU数量,宿主机cpu数量为:$cpus"
exit 1
fi
KVM_CPUS=$vmcpus
shift
;;
-m|--memory)
shift
vmmemory=${1:-"512"}
memory=`free -m | awk '/^Mem:/{print $2}'`
if [ $vmmemory -ge $memory ]; then
echo "内存不能大于系统的内存,宿主机内存为:$memory"
exit 1
fi
KVM_MEMORY=`echo $vmmemory | grep -o -P '\d+'`
shift
;;
--)
shift
break
;;
*)
echo "参数错误!"
exit 1
;;
esac
done
qemu-img create -f qcow2 -b ${TEMPLATE_PATH}/${TEMPLATE_IMAGE_NAME} ${VDISKS_PATH}/${VM_HOSTNAME}.qcow2
guestmount -a ${VDISKS_PATH}/${VM_HOSTNAME}.qcow2 -m /dev/centos/root ${MOUNT_PATH}
/usr/bin/cp -f ${TEMPLATE_PATH}/${TEMPLATE_NETWORK_NAME} ${MOUNT_PATH}/etc/sysconfig/network-scripts/ifcfg-eth0
sed -ri "s/^IPADDR.*/IPADDR=${KVM_ADDRESS}/" ${MOUNT_PATH}/etc/sysconfig/network-scripts/ifcfg-eth0
sed -ri "s/^GATEWAY.*/GATEWAY=${KVM_ADDRESS%.*}.1/" ${MOUNT_PATH}/etc/sysconfig/network-scripts/ifcfg-eth0
sed -ri "s/.*/${VM_HOSTNAME}/" ${MOUNT_PATH}/etc/hostname
guestunmount ${MOUNT_PATH}
cp ${TEMPLATE_PATH}/${TEMPLATE_CONFIG_NAME} ${CONFIG_PATH}/${VM_HOSTNAME}.xml
sed -ri "s/VM_NAME/${VM_HOSTNAME}/" ${CONFIG_PATH}/${VM_HOSTNAME}.xml
sed -ri "s/VM_VNC_PORT/${KVM_PORT}/" ${CONFIG_PATH}/${VM_HOSTNAME}.xml
sed -ri "s#IMAGE_PATH#${VDISKS_PATH}/${VM_HOSTNAME}.qcow2#" ${CONFIG_PATH}/${VM_HOSTNAME}.xml
sed -ri "s/VM_UUID/`uuidgen`/" ${CONFIG_PATH}/${VM_HOSTNAME}.xml
sed -ri "s/VM_MEMORY/$[${KVM_MEMORY} * 1024 ]/" ${CONFIG_PATH}/${VM_HOSTNAME}.xml
sed -ri "s/VM_CPUS/${KVM_CPUS}/" ${CONFIG_PATH}/${VM_HOSTNAME}.xml
virsh define ${CONFIG_PATH}/${VM_HOSTNAME}.xml
virsh start ${VM_HOSTNAME}

@ -0,0 +1,26 @@
#!/usr/bin/bash
# editor : NewRain
# date : 2020-08-14
# for kvm virtual machine template
MAIN_PATH=$(cd $(dirname $0); cd ..; pwd)
IMAGE_PATH=/tmp/CentOS-7-x86_64-Minimal-2009.iso
VM_CPUS=1
VM_TEMPLATE_NAME=template
VM_MEMORY=2050 # 不能低于2G,单位为M
VM_DISK_SIZE=5 # 单位为G
VM_DISK_PATH=${MAIN_PATH}/template/${VM_TEMPLATE_NAME}.qcow2
cpus=`lscpu | awk '/^CPU\(s\):/{print $2}'`
if [ $VM_CPUS -ge $cpus ]; then
echo "CPU数量不能大于系统的CPU数量,宿主机cpu数量为:$cpus"
exit 1
fi
memory=`free -m | awk '/^Mem:/{print $2}'`
if [ $VM_MEMORY -ge $memory ]; then
echo "内存不能大于系统的内存,宿主机内存为:$memory"
exit 1
fi
virt-install --connect qemu:///system -n ${VM_TEMPLATE_NAME} -r ${VM_MEMORY} --disk path=${VM_DISK_PATH},size=${VM_DISK_SIZE} --os-type=linux --os-variant=centos7.0 --vcpus=${VM_CPUS} --location=${IMAGE_PATH} -x console=ttyS0 --nographics

@ -0,0 +1,13 @@
TYPE="Ethernet"
PROXY_METHOD="none"
BROWSER_ONLY="no"
BOOTPROTO="static"
DEFROUTE="yes"
IPV4_FAILURE_FATAL="no"
DEVICE="eth0"
ONBOOT="yes"
IPADDR=
PREFIX=24
GATEWAY=
DNS1=114.114.114.114
DNS2=8.8.8.8

@ -0,0 +1,106 @@
<!--
WARNING: THIS IS AN AUTO-GENERATED FILE. CHANGES TO IT ARE LIKELY TO BE
OVERWRITTEN AND LOST. Changes to this xml configuration should be made using:
virsh edit template
or other application using the libvirt API.
-->
<domain type='kvm'>
<name>VM_NAME</name>
<uuid>VM_UUID</uuid>
<memory unit='KiB'>VM_MEMORY</memory>
<currentMemory unit='KiB'>VM_MEMORY</currentMemory>
<vcpu placement='static'>VM_CPUS</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>
<feature policy='require' name='md-clear'/>
<feature policy='require' name='spec-ctrl'/>
<feature policy='require' name='ssbd'/>
</cpu>
<clock offset='utc'>
<timer name='rtc' tickpolicy='catchup'/>
<timer name='pit' tickpolicy='delay'/>
<timer name='hpet' present='no'/>
</clock>
<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='IMAGE_PATH'/>
<target dev='vda' bus='virtio'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/>
</disk>
<disk type='file' device='cdrom'>
<driver name='qemu' type='raw'/>
<target dev='hda' bus='ide'/>
<readonly/>
<address type='drive' controller='0' bus='0' target='0' unit='0'/>
</disk>
<controller type='usb' index='0' model='ich9-ehci1'>
<address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x7'/>
</controller>
<controller type='usb' index='0' model='ich9-uhci1'>
<master startport='0'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0' multifunction='on'/>
</controller>
<controller type='usb' index='0' model='ich9-uhci2'>
<master startport='2'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x1'/>
</controller>
<controller type='usb' index='0' model='ich9-uhci3'>
<master startport='4'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x2'/>
</controller>
<controller type='pci' index='0' model='pci-root'/>
<controller type='ide' index='0'>
<address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x1'/>
</controller>
<controller type='virtio-serial' index='0'>
<address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/>
</controller>
<interface type='network'>
<source network='default'/>
<model type='virtio'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
</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'/>
<address type='virtio-serial' controller='0' bus='0' port='1'/>
</channel>
<input type='mouse' bus='ps2'/>
<input type='keyboard' bus='ps2'/>
<graphics type='vnc' port='VM_VNC_PORT' autoport='no' listen='0.0.0.0'>
<listen type='address' address='0.0.0.0'/>
</graphics>
<memballoon model='virtio'>
<address type='pci' domain='0x0000' bus='0x00' slot='0x07' function='0x0'/>
</memballoon>
<rng model='virtio'>
<backend model='random'>/dev/urandom</backend>
<address type='pci' domain='0x0000' bus='0x00' slot='0x08' function='0x0'/>
</rng>
</devices>
</domain>

Binary file not shown.
Loading…
Cancel
Save