解决问题:
使用dhcp,即使选择无限期,也出现虚拟机ip改变的情况
有网上资料通过修改dhcp配置文件完成,也是不错的思路
目的:不适用dhcp
第一步:制作模板镜像
https://editor.csdn.net/md/?articleId=106480768
1.1 这是以前的模板镜像
1.2 在模板镜像中配置ip文件
在模板虚拟机中配置
vim /etc/sysconfig/network-scripts/ifcfg-eth0
BOOTPROTO=static
ONBOOT=yes
IPADDR=192.168.1.2 #ip地址此处任意
NETMASK=255.255.255.0
GATEWAY=192.168.1.1
DNS1=192.168.1.1
#注释UUID
1.3 对基础镜像的xml文件修改,domain标签中增加一行
<title>192.168.1.3</title>
<domain type='kvm'>
<name>base-image</name>
<uuid>12348899-e829-4217-a0ff-f30eee4d2b31</uuid>
<title>192.168.1.14</title> #ip都是任意的 ,创建虚拟机时会根据指定的ip进行替换,方便读取
<memory unit='KiB'>16777216</memory>
<currentMemory unit='KiB'>8388608</currentMemory>
<vcpu placement='static' current='2'>4</vcpu>
<os>
第二步:创建虚拟机脚本,可以在代码项目中实现和替换
```css
#!/bin/bash
function check(){
if [ ! -f "${xmls_dir}${base_xml}" ]&&[ ! -f "${images_dir}${base_img}" ] # 判断基础xml和基础镜像是否存在
then
echo "基础镜像或者基础镜像xml不存在"
exit 1
else
vir_uuid=`uuidgen`
vir_mac="52:54:$(dd if=/dev/urandom count=1 2>/dev/null | md5sum |sed -r 's/^(..)(..)(..)(..).*$/\1:\2:\3:\4/')"
vir_name=$machine_name
fi
}
#创建磁盘
function create_disk(){
chattr -i ${images_dir}$base_img
qemu-img create -f qcow2 -b ${images_dir}$base_img ${images_dir}${vir_name}.qcow2 ${vir_disk}G &>/dev/null
}
#添加磁盘
function attach_disk(){
qemu-img create -f qcow2 ${images_dir}${vir_name}-2.qcow2 ${vir_attach_disk}G >/dev/null
virsh attach-disk ${vir_name} ${images_dir}${vir_name}-2.qcow2 vdb --cache writeback --subdriver qcow2 --persistent >/dev/null
}
#配置xml ,替换内存cpu 等信息并导入
function conf_xml(){
cp ${xmls_dir}${base_xml} /tmp/${vir_name}.xml
sed -i "s#<memory unit='KiB'>.*</memory>#<memory unit='KiB'>${vir_mem}</memory>#" /tmp/${vir_name}.xml
sed -i "s#<currentMemory unit='KiB'>.*</currentMemory>#<currentMemory unit='KiB'>${vir_mem}</currentMemory>#" /tmp/${vir_name}.xml
sed -i "s#<vcpu placement='static'>.*</vcpu>#<vcpu placement='static'>${vir_cpu}</vcpu>#" /tmp/${vir_name}.xml
sed -i "s/<name>.*<\/name>/<name>${vir_name}<\/name>/" /tmp/${vir_name}.xml
sed -i "s/<uuid>.*<\/uuid>/<uuid>${vir_uuid}<\/uuid>/" /tmp/${vir_name}.xml
sed -i "s/<title>.*<\/title>/<title>${vir_ip}<\/title>/" /tmp/${vir_name}.xml
sed -i "s#<source file=.*/>#<source file='${images_dir}${vir_name}.qcow2'/>#" /tmp/${vir_name}.xml
sed -i "s/<mac address=.*\/>/<mac address='$vir_mac' \/>/" /tmp/${vir_name}.xml
virsh define /tmp/${vir_name}.xml >/dev/null
virt-edit -d ${vir_name} /etc/sysconfig/network-scripts/ifcfg-eth0 -e "s#IPADDR=".*"#IPADDR="${vir_ip}"#" # 替换ip
}
#启动并设置开机自启
function start_vir(){
virsh start ${vir_name} >/dev/null
virsh autostart ${vir_name} >/dev/null
chattr +i ${images_dir}$base_img
}
main(){
images_dir="/var/lib/libvirt/images" # 镜像存储的位置
base_img="centos6_template.qcow2" # 基础镜像的名称
xmls_dir="/etc/libvirt/qemu/" # xml 的位置
base_xml="centos6_template.xml" # 基础xml的名称
vir_disk=50 # 磁盘默认为50G
vir_cpu=2 # cpu默认为2核
vir_mem=8388608 # 内存默认为8G
echo -e "服务器配置选项:\n 1: 2核8G 50G(测试) \n 2: 1核8G 50G(开发) \n 3: 2核8G 100G(数据库) \n 4: 4核20G 200G"
read -t 30 -p "输入你选择的配置的编号:" number
read -t 90 -p "输入想要创建的IP:" vir_ip
read -t 120 -p "输入想要创建的机器名称:" machine_name
if [ -z "$vir_ip" ] || [ -z "$machine_name" ] # 判断是否输入ip和机器名称
then
echo "请输入ip和机器名称"
exit -1
fi
case "$number" in
[1] )
check
create_disk
conf_xml
start_vir
create_vir_log
;;
[2] )
vir_cpu=1 # 设置为1核
check
create_disk
conf_xml
start_vir
create_vir_log
;;
[3] )
vir_disk=100 #设置为磁盘100G盘
check
create_disk
conf_xml
start_vir
create_vir_log
;;
[4] )
base_img="dc-base-image.qcow2"
vir_cpu=4 # 设置为4核
vir_mem=20971520 #设置内存为20G
vir_disk=20 #设置为磁盘200G盘
vir_attach_disk=200 # 设置附加盘的大小
check
create_disk
conf_xml
start_vir
attach_disk
create_vir_log
;;
*) echo "输入编号(1-4)";;
esac
}
main
其中最为重要的命令是virt-edit,通过这个命令去到虚拟机内实现IP修改的。
virt-edit 是直接编辑虚拟机磁盘里文件的命令,使用前宿主机需要安装libguestfs-tools
官方文档:virt-edit
所以,可以通过从数据库中指定未使用的ip方式,使虚拟机创建速度加快。