#!/bin/bash
#PS:KVM自动安装工具-v1.0
#必要环境检查:
Image_Path="/Vhost/images"
Conf_Path="/etc/libvirt/qemu"
Vhost_name="KVM_host"
Ram_size="1024"
Vcpu="4"
Cdrom="/Vhost/CentOS-7-x86_64-Minimal-2003.iso"
Dsik_size="10G"
Dsik_type="qcow2"
function Check() {
[ -d ${Image_Path} ] ||{ mkdir -p ${Image_Path};chmod -R 755 ${Image_Path}; }
[ -d ${Conf_Path} ] || mkdir -p ${Conf_Path}
[ -f ${Cdrom} ] || { echo "无光盘文件";exit 1; }
grep -E -i '(vmx|svm)' /proc/cpuinfo || { echo "请开启CPU虚拟化";exit 1; }
rpm -q {'qemu-kvm','qemu-kvm-tools','libvirt-daemon-kvm','libvirt','libvirt-client','libguestfs','libguestfs-tools','virt-install','tigervnc','tigervnc-server'} || echo "缺少安装包"
ping -W1 -c1 114.114.114.114 > /dev/null || echo "无法连通外部网络,请配置网络"
yum makecache > /dev/null || "yum仓库配置错误"
grep -E -i 'epel' /etc/yum.repos.d/*.repo || echo "未配置epel源"
}
#软件安装
function Context(){
#软件包安装
read -p "环境安装请确认(y/n)" Option
case $Option in
Y|y|yes)
[ ! -f /etc/yum.repos.d/Base1.repo ] && tee /etc/yum.repos.d/Base1.repo << EOF
[base]
name=base
baseurl=file:///mnt/cdrom
gpgcheck=0
enabled=1
[extras]
name=extras
baseurl=https://mirrors.aliyun.com/centos/\$releasever/os/\$basearch
gpgcheck=0
enabled=1
[epel-1]
name=epel-1
baseurl=https://mirrors.tuna.tsinghua.edu.cn/epel/\$releasever/x86_64
baseurl=https://mirrors.cloud.tencent.com/epel/\$releasever/x86_64
gpgcheck=0
enabled=1
EOF
mkdir /dev/cdrom -p;mount /dev/cdrom /mnt/cdrom
sed -ri 's/^[[:space:]]+(.*)/\1/' /etc/yum.repos.d/Base1.repo
yum -y install qemu-kvm qemu-kvm-tools libvirt-daemon-kvm libvirt libvirt-client libguestfs libguestfs-tools virt-install tigervnc tigervnc-server ||{ echo "安装失败,请检查环境";exit 1; }
systemctl enable --now libvirtd.service
systemctl enable --now vncserver@\:1.service
sleep 30
#cp /lib/systemd/system/vncserver@.service /etc/systemd/system/vncserver@:1.service
#sed -ri '/^ExecStart.*%i$/s/<USER>/root/' /etc/systemd/system/vncserver@\:1.service
systemctl daemon-reload
systemctl start vncserver@\:1.service
;;
N|n|no)
exit 1
;;
*)
echo "输入错误"
;;
esac
}
function Template() {
Check
[ -d ${Image_Path} ] || { mkdir -p ${Image_Path};chmod -R 755 ${Image_Path}; }
[ -d ${Conf_Path} ] || mkdir -p ${Conf_Path}
[ -f ${Cdrom} ] || { echo "无光盘文件";exit 1; }
#create_image
if [ ! -f ${Image_Path}/Template_host.img ] && [ ! -f ${Conf_Path}/Template_host.xml ];then
qemu-img create -f ${Dsik_type} ${Image_Path}/Template_host.img 10G
#create_vhost_cdrom
virt-install --virt-type kvm --name Template_host --ram 1024 --vcpus 4 --cdrom ${Cdrom} --disk ${Image_Path}/Template_host.img --network network=default --graphics vnc,listen=0.0.0.0 --noautoconsole
sleep 3
echo "请打开图形化界面,安装模板虚拟机的系统"
sleep 30
virsh start Template_host || { echo "请安装模板虚拟机的系统";sleep 3;vncviewer 127.0.0.1:0; }
sleep 10
vncviewer 127.0.0.1:0
sleep 10
a=0;j=1;while [ $a -lt 1 ];do
virsh shutdown Template_host
echo "请后续将NOBOOT=NO改为NOBOOT=yes"
sleep 25
virt-edit -d Template_host /etc/sysconfig/network-scripts/ifcfg-eth0
virsh start Template_host
echo "正在加载IP,请稍等";sleep 25
Tem_ip=`virsh domifaddr Template_host | awk -F "[[:space:]]|/" '{if(NR ==3 )print $(NF-1)}'`
echo "Template_host the IP is ${Tem_ip}"
ping -W1 -c1 ${Tem_ip} && { a=2;j=10;}|| let j++
[ $j -gt 10 ] && { echo "网络未启动,无法获取网"; exit 1; }
done
echo "开始安装数据包,准备中,请等待";sleep 10
read -p "default installation net-tools,bash-completion[y/n]" Option_1
if [[ $Option_1 =~ Y|y|yes ]] ;then
virsh destroy --domain Template_host &> /dev/null
sleep 25
virt-sysprep --network --install=net-tools -d Template_host
virt-sysprep --network --install=bash-completion -d Template_host
read -e -p "请输入需要安装的包名(完整),多个包请用空格隔开:" Package
declare -a Package_list
a=1;for i in $Package;do
Package_list[$a]="$i"
let a++
done
for ((i=1;i<=${#Package_list[@]};i++));do
virt-sysprep --network --install=${Package_list[$i]} -d Template_host || Package_fail[$i]=${Package_list[$i]}
done
[ -z ${Package_fail[@]} ] && echo "共安装${#Package_list[@]}个包,无安装失败" || echo "共安装${#Package_list[@]}个包,${Package_fail[@]}安装失败"
fi
else
read -p "Only install and outsource[y/n]" Option_2
if [[ $Option_2 =~ Y|y|yes ]] ;then
virsh destroy --domain Template_host &> /dev/null
sleep 25
read -e -p "请输入需要安装的包名(完整),多个包请用空格隔开:" Package
declare -a Package_list
a=1;for i in $Package;do
Package_list[$a]="$i"
let a++
done
for ((i=1;i<=${#Package_list[@]};i++));do
virt-sysprep --network --install=${Package_list[$i]} -d Template_host || Package_fail[$i]=${Package_list[$i]}
done
[ -z ${Package_fail[@]} ] && echo "共安装${#Package_list[@]}个包,无安装失败" || echo "共安装${#Package_list[@]}个包,${Package_fail[@]}安装失败"
fi
fi
}
function kimchi(){
wget https://github.com/kimchi-project/kimchi/releases/download/2.5.0/kimchi-2.5.0-0.el7.centos.noarch.rpm
wget https://github.com/kimchi-project/kimchi/releases/download/2.5.0/wok-2.5.0-0.el7.centos.noarch.rpm
yum -y -q install wok-2.5.0-0.el7.centos.noarch.rpm kimchi-2.5.0-0.el7.centos.noarch.rpm 2> /dev/null
setenforce 0
systemctl start wokd || systemctl daemon-reload
systemctl restart wokd || echo "start failed Check the url availability and package availability"
iptables -A INPUT -p tcp --dport 8001 -j ACCEPT
}
function VMs() {
read -p "How many VMS to create" Number
virsh destroy --domain Template_host
[ ! -z ${Number} ] || { echo "Please enter the content";exit 1; }
[ -f ${Image_Path}/Template_host.img ] || read -p "Please enter the content images store path" new_images_path
[ -f /etc/libvirt/qemu/Template_host.xml ] || read -p "Enter the path for saving the XML configuration file" new_file_path
for ((i=1;i<=${Number};i++));do
#Check whether the path exists
[ ! -z ${new_file_path} ] && cd ${new_file_path} || cd ${Conf_Path}
#check conf.xml
[ -f /etc/libvirt/qemu/${Vhost_name}_0${i}.xml ] && [ -f $Image_Path/${Vhost_name}_0${i}.img ] && continue
#Create new vms conf.xml file
virsh dumpxml --domain Template_host > ${Vhost_name}_0${i}.xml
#Modifying a conf.xml file
sed -ri '/^.*<name>/'"s/Template_host/${Vhost_name}_0${i}/" ${Vhost_name}_0${i}.xml
sed -ri '/.*<uuid>.*<\/uuid>$/d' ${Vhost_name}_0${i}.xml
sed -ri '/.*<source file='.*'>/'"s@(.*=)'.*'(\/>)@\1'/var/lib/libvirt/images/${Vhost_name}_0${i}.img' \2@" ${Vhost_name}_0${i}.xml
[ ! -z ${Bridge_Name} ] && sed -ri '/.*source network='.*'/'"s/(.*=)'.*'/\1'$Bridge_Name'/" ${Vhost_name}_0${i}.xml || sed -ri '/.*source network='.*'/'"s/(.*=)'.*'/\1'default'/" ${Vhost_name}_0${i}.xml
[ $i -le 10 ] && sed -ri "s@(mac address=)'.*'(/>)@\1'52:54:00:4f:00:0$i' \2@" ${Vhost_name}_0${i}.xml || sed -ri "s@(mac address=)'.*'(/>)@\1'52:54:00:4f:00:$i' \2@" ${Vhost_name}_0${i}.xml
#sed -i '/<\/name>$/a\ <title>'$Vhost_IP'</title>' ${Vhost_name}_0${i}.xml
#Create new vms disk images
if [ ! -z $new_images_path ];then
cp -p $new_images_path $Image_Path/${Vhost_name}_0${i}.img
else
cp -p $Image_Path/Template_host.img $Image_Path/${Vhost_name}_0${i}.img && ln -sf $Image_Path/${Vhost_name}_0${i}.img /var/lib/libvirt/images/
fi
virsh create --file ${Vhost_name}_0${i}.xml
done
}
function Bridge() {
read -p "请输入创建的网桥名称" Bridge_Name
read -p "请输入DHCP地址段(如:192.168.100.0)" dhcp_field
if [ ! -z $Bridge_Name ] && [ ! -z $dhcp_field ];then
cd /etc/libvirt/qemu/networks
virsh net-dumpxml --network default > ${Bridge_Name}.xml
sed -ri '/^.*<name>/'"s/default/${Bridge_Name}/" ${Bridge_Name}.xml
sed -ri '/<uuid>.*<\/uuid>$/d' ${Bridge_Name}.xml
sed -ri '/<bridge .*>/s/virbr0/br0/p' ${Bridge_Name}.xml
IP=`echo ${dhcp_field} |awk -F"." '{$NF="";print $0}' |tr -s " " "."`
sed -ri "s/(<ip address=)'.*' (.*>)/\1'${IP}1' \2/" ${Bridge_Name}.xml
sed -ri "s/(<range start=)'.*' (end=)'.*'(\/>)/\1'${IP}100' \2'${IP}254' \3/" ${Bridge_Name}.xml
virsh net-create ${Bridge_Name}.xml
sleep 5
virsh net-destroy ${Bridge_Name}
sleep 5
virsh net-define --file ${Bridge_Name}.xml
sleep 5
virsh net-autostart --network ${Bridge_Name}
sleep 5
virsh net-start ${Bridge_Name}
fi
}
function Modify_net(){
read "auto modify Net(y/n):" Option_2
case $Option_2 in
Y|y|yes)
read -p "Enter the IP address and host name(Use Spaces to separate them):" Modify_net Modify_host
#Modify VMs the static Net
if [ ! -z ${Modify_net} ] && [ ! -z ${Modify_host} ];then
IP=`echo ${Modify_net} |awk -F"." '{$NF="";print $0}' |tr -s " " "."`
virsh shutdown ${Modify_host}
virt-edit -d ${Modify_host} /etc/sysconfig/network-scripts/ifcfg-eth0 -e "s/IPV6_DEFROUTE=yes/GATEWAY='${IP}1'/"
virt-edit -d ${Modify_host} /etc/sysconfig/network-scripts/ifcfg-eth0 -e 's/IPV6INIT=yes/PREFIX=24/'
virt-edit -d ${Modify_host} /etc/sysconfig/network-scripts/ifcfg-eth0 -e "s/IPV4_FAILURE_FATAL=no/IPADDR='${Modify_net}'/"
virt-edit -d ${Modify_host} /etc/sysconfig/network-scripts/ifcfg-eth0 -e "s/BOOTPROTO=".*"/="BOOTPROTO=none"/"
virt-edit -d ${Modify_host} /etc/sysconfig/network-scripts/ifcfg-eth0 -e "s/ONBOOT=".*"/="NOBOOT=yes"/"
else
echo "Enter the IP address and host name(Use Spaces to separate them)"
fi
;;
N|n|no)
#Manually modify Net
read -p "Enter the IP address the host name:" Modify_host
virsh shutdown ${Modify_host}
virt-edit -d ${Modify_host} /etc/sysconfig/network-scripts/ifcfg-eth0
;;
*)
echo "input Yes|y or No|no"
exit 3
;;
esac
}
PS3="请选择:(1-9):"
select MENU in 环境检查 软件包安装 网络创建 模板虚拟机创建 批量创建虚拟机 管理平台创建 修改网络 一键安装 退出 ;do
case $REPLY in
1)
Check
;;
2)
Context
;;
3)
Bridge
;;
4)
Template
;;
5)
VMs
;;
6)
kimchi
;;
7)
Modify_net
;;
8)
Check
Context
Template
kimchi
Bridge
VMs
Modify_net
;;
9)
exit
;;
esac
done
KVM安装脚本
于 2022-03-30 22:30:18 首次发布