master
commit
cd054f3e4f
@ -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…
Reference in new issue