问题背景
使用shell或者python脚本完成KVM虚拟机的批量创建,要求如下:
(1)脚本需要人机交互,当输入虚拟机数量,虚拟机规格参数后,即可批量创建相应机器;
(2)使用EXP技术从网络安装虚拟机,创建多个时使用复制原理;
(3)脚本实现虚拟机生命周期管理,即可实现关机,启动,快照,从快照启动等等。
README.txt
本程序实现了虚拟机安装、虚拟机管理、快照管理、存储池管理、批量创建虚拟机功能
# cat README.txt
一、使用说明
1.解压本程序到任意目录
2.配置符合实际的变量信息
2.1 虚拟机安装 lib/install_vars #虚拟机安装依赖于PXE-kickstart
*install_source="ftp://192.168.213.163/centos7u7" #安装源
*extra_args="ks=ftp://192.168.213.163/centos-7-ks.cfg" #kickstart配置文件
其他变量可按需要配置
2.2 批量创建虚拟机 lib/batch_install_vars #批量创建虚拟机需要后备镜像
*dir=/data/vmdisk #批量创建的虚拟机镜像存储目录
*backup_img=${dir}/centos7u4.qcow2 #后备镜像
3.执行主程序main.sh启动程序
二、程序开发目录
zhao_manage_kvm/
|-- etc #程序执行目录
| |-- batch_install_vm.sh #批量创建虚拟机程序
| |-- install_vm.sh #虚拟机安装程序
| |-- manage_pool.sh #虚拟机管理程序
| |-- manage_snapshot.sh #虚拟机快照管理程序
| `-- manage_vm.sh #存储池管理程序
|-- lib #程序配置目录
| |-- batch_install_vars #批量创建虚拟机所需变量(请根据实际修改)
| |-- install_vars #虚拟机安装所需变量(请根据实际修改)
`-- template.xml #虚拟机配置文件模板
|-- main.sh #主程序入口
`-- README.txt #使用说明
2 directories, 10 files
三、程序功能
1.虚拟机安装
2.虚拟机管理
|-- 2.1 启动虚拟机
|-- 2.2 查看虚拟机信息
|-- 2.3 VNC连接虚拟机
|-- 2.4 设置开机启动
|-- 2.5 取消开机启动
|-- 2.6 关闭虚拟机
|-- 2.7 强制关闭虚拟机
|-- 2.8 删除虚拟机
`-- 2.9 返回上一级菜单
3.虚拟机快照管理
|-- 3.1 创建虚拟机快照
|-- 3.2 查看虚拟机快照信息
|-- 3.3 查看快照详细信息
|-- 3.4 还原虚拟机快照
|-- 3.5 删除虚拟机快照
`-- 3.6 返回上一级菜单
4.存储池管理
|-- 4.1 创建本地存储池
|-- 4.2 启动存储池
|-- 4.3 设置存储池自启动
|-- 4.4 查看存储池信息
|-- 4.5 删除存储池
`-- 4.6 返回上一级菜单
5.批量创建虚拟机
6.退出
问题解决
1.随机MAC地址
错误:从/etc/libvirt/qemu/ybc.xml定义域失败
错误:XML错误:意外单播mac地址,找到多播’cb:20:63:79:9d:78’
随机生成的MAC地址是多播,无法正常定义虚拟机
#vm_mac=`openssl rand -hex 6 | sed -E "s/(..)/\1:/g; s/:$//"`
vm_mac="52:54:$(dd if=/dev/urandom count=1 2>/dev/null |md5sum|sed 's/^\(..\)\(..\)\(..\)\(..\).*$/\1:\2:\3:\4/')"
2.sed里使用变量
sed -ri "/vm_port/ s/vm_port/${vm_port}/" ${conf_file}
sed后面的表达式一般用单引号,需要使用变量时可以使用双引号
3.sed里使用转义符
sed:-e 表达式 #1,字符 20:“s”的未知选项
变量vm_img=/data/vmdisk/test.img
是一个路径,sed无法识别,要进行转义处理
[root@7u4-test ~]# vm_img=/data/vmdisk/test.img
[root@7u4-test ~]# cat test
vm_img
[root@7u4-test ~]# sed -ri "/vm_img/ s/vm_img/${vm_img}/" test
sed:-e 表达式 #1,字符 20:“s”的未知选项
[root@7u4-test ~]# vm_img0=`echo ${vm_img}|sed 's#\/#\\\/#g'` #必须是单引号
[root@7u4-test ~]# echo $vm_img0
\/data\/vmdisk\/test.img
[root@7u4-test ~]# sed -ri "/vm_img/ s/vm_img/${vm_img0}/" test
[root@7u4-test ~]# cat test
/data/vmdisk/test.img
https://blog.csdn.net/qq_34629671/article/details/54233064
4.PXE装机报错Can’t mount root filesystem
PXE装机报错,OSError:No space left on device;Warning:Can’t mount root filesystem;Warning:/dev/root dose not exist
在PXE自动装机时,警告写入空间不足,是内存太小(1G),做PXE装机,客户机要给足够的内存,至少2个G,安装完成后可以动态降低内存
5.CentOS7.6图形化界面中文显示乱码
#安装中文包
yum install kde-l10n-Chinese
#安装glibc-common
yum reinstall glibc-common
#查看系统是否支持中文包
locale -a |grep zh
#修改/etc/locale.conf(localectl set-locale LANG=zh_CN.UTF-8)
LANG="zh_CN.utf8"
#重启
reboot
使用示例
1.虚拟机安装(虚拟机安装依赖于PXE-kickstart)
通过 vncviewer 192.168.213.171:5940 查看安装过程,安装完成后VNC会自动断开连接(测试使用时间6min),控制台会显示Install Vm Sucessed
2.虚拟机管理
输入虚拟机名称会自动获取VNC端口
3.虚拟机快照管理
4.存储池管理
5.批量创建虚拟机(批量创建虚拟机需要后备镜像)