阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

KVM之实现批量创建KVM虚拟机

183次阅读
没有评论

共计 5505 个字符,预计需要花费 14 分钟才能阅读完成。

KVM 之通过 virsh 制作 image 实现批量创建 KVM 虚拟机

******* 通过 KVM 虚拟机 xml 模板文件创建虚拟机(制作一个 raw 格式的 image,并安装 Ubuntu 操作系统)******************
一、准备工作
1、准备一个 KVM 虚拟机配置文件模板
KVM 虚拟机配置文件模板文件已上传至附件:kvm_vm_raw_template.xml
复制一份虚拟机配置文件模板:kvm_vm_raw_template.xml
2、确定 image 的存储路径
3、创建 raw 格式的 image 文件
4、准备 ubuntu14.4 的 ISO 文件

二、定义 kvm_vm_raw_template.xml 虚拟机配置文件
注意:xml 文件中的所有“%%”均为变量,比如:%VM_NAME%
通过 sed 替换变量,这时候,虚拟机名称为:ubuntu14.04_temp

1、虚拟机整体信息配置
  <name>%VM_NAME%</name> 虚拟机名字
  <uuid>%UUID%</uuid>    UUID 值
  <memory>1048576</memory>    内存总大小,已 KB 为单位
  <currentMemory>1048576</currentMemory>    当前内存大小
  <vcpu>1</vcpu>    CPU 数量
配置如下:
sed -i “s,%VM_NAME%,ubuntu14.04_temp,g” ubuntu14.04.xml

通过 uuidgen 命令生成 UUID 值
uuid=`uuidgen`
sed -i “s,%UUID%,$uuid,g” ubuntu14.04.xml

2、系统信息配置
<os>
    <type arch=’x86_64′ machine=’pc-0.14′>hvm</type> 系统架构和机器类型,hvm 代表是基于硬件虚拟化,如要查看支持的机器类型:qemu-system-x86_64 -M ?
    <boot dev=’hd’/>    启动介质,首先使用 hard disk 作为首选启动介质,比如 cdrom,floppy
    <bootmenu enable=’yes’/>    是否开启启动选项菜单,虚拟机启动时可按 F12 进入启动菜单
  </os>

3、创建 image 文件和配置
3.1、创建一个 raw 格式 image
qemu-img create -f raw ubuntu14.04.raw 20G

sed -i “s,%IMAGE_PATH%,/datapool/vm/ubuntu14.04.raw,g” ubuntu14.04.xml

    <disk type=’file’ device=’disk’>
      <driver name=’qemu’ type=’raw’ cache=’none’/>
      <source file=’/datapool/vm/ubuntu14.04.raw’/>
      <target dev=’vda’ bus=’virtio’/>
      <address type=’pci’ domain=’0x0000′ bus=’0x00′ slot=’0x08′ function=’0x0’/>
    </disk>

4、挂载 ISO
    <disk type=’file’ device=’cdrom’>
      <driver name=’qemu’ type=’raw’ cache=’none’/>
      <source file=’/datapool/iso/ubuntu-14.04.3-server-amd64.iso’/> #指定 ISO 文件路径
      <target dev=’hda’ bus=’ide’/>
      <readonly/>
      <address type=’drive’ controller=’0′ bus=’1′ unit=’0’/>
    </disk>

5、虚拟网卡
随机生成 mac 地址命令:openssl rand -hex 6 | sed ‘s/(..)/1:/g; s/.$//’
40:d9:44:0c:55:ac

    <interface type=’bridge’>
      <mac address=’40:d9:44:0c:55:ac’/>
      <source bridge=’br100’/>
      <target dev=’vnet0’/>
      <alias name=’net0’/>
      <address type=’pci’ domain=’0x0000′ bus=’0x00′ slot=’0x03′ function=’0x0’/>
    </interface>

6、定义虚拟机
virsh define ubuntu14.04.xml    定义虚拟机,define 告诉 libvirt, 要被 libvirt 管理

# 查看虚拟机列表
root@kvmhost1:/datapool/vm# virsh list –all
 Id    名称                        状态
—————————————————-
 –    ubuntu14.04_temp              关闭

# 启动虚拟机
virsh start ubuntu14.04_temp

7、vnc 查看虚拟机,# 查看 VNC 端口
root@kvmhost1:/datapool/vm# virsh vncdisplay ubuntu14.04_temp   
:0

安装 vncviewer 工具
apt-get -y install vncviewer
vncviewer 192.168.89.3:0    连接,注意这里的 IP 地址为 br100 的 IP

8、接着开始安装操作系统,当操作系统和需要的软件安装好之后,将虚拟机关闭,并且将虚拟机 raw 格式 image 保存

至此,一个 raw 格式 image 文件就已经创建完成,而且操作系统也完成安装,等会利用 raw 格式的 image 作为 backing_file, 批量创建 qcow2 磁盘(作为虚拟机的磁盘)

*************************** 利用 raw 格式 image 作为 backing_file, 批量创建 qcow2 磁盘(作为虚拟机的磁盘)********************************
一、批量创建 ubuntu 虚拟机解决方案:
方案 1、手动安装,繁琐、蛋疼
方案 2、直接复制,复制已经安装好系统的 raw 格式 image 文件,需要创建多少台虚机就复制多少份,分别利用备份文件创建虚拟机,但主要的时间会花费在复制 image 上
方案 3、qcow2 快速创建,利用已经安装好系统的 raw 格式 image 文件作为 backing_file 文件,需要创建多少台虚机就复制多少份 qcow2 格式 image,再分别利用 qcow2 文件创建虚拟机,时间花费非常少

* 在这里选择方案 3
之前制作好的 raw 格式 image(操作系统已安装好),需要注意的地方:
1、尽量不要修改 image
2、不要直接利用这个 image 创建虚拟机
3、避免人为读写进程对这个 image 进行操作,比如挂载

二、开始编写批量创建脚本
1、脚本已经写完
脚本文件可参考:create_qcow2_vm.bash 脚本文件已上传至附件

2、利用这种方法建立起来的虚拟机,有如下问题:
2.1、主机名完全相同
2.2、虚拟机内存保存的 MAC 地址仍然是 backing_file 中 MAC 地址(经测试发现,较新版本的 KVM 不会出现 MAC 地址相同的情况)

解决方案:将 qcow2 image 挂载之后,再对主机名和 MAC 地址进行修改
1、挂载 qcow2 文件,首先需要安装依赖包 kpartx, 使用 kpartx 工具来挂载虚拟机磁盘镜像文件
2、使用 nbd 模块挂载 qcow2 文件(modprobe 命令用于智能地向内核中加载模块或者从内核中移除模块。modprobe 可载入指定的个别模块,或是载入一组相依的模块。modprobe 会根据 depmod 所产生的相依关系,决定要载入哪些模块。若在载入过程中发生错误,在 modprobe 会卸载整组的模块。)

#******************** 命令如下:***********************
apt-get -y install kpartx

# 激活 nbd 模块
modprobe nbd max_part=63

# 将 qcow2 文件挂载到 /dev/nbd0 设备(注意:如果 /dev/nbd0 被占用,可以使用 /dev/nbd1 设备)
qemu-nbd -c /dev/nbd0 ubuntu14.04_vm5.qcow2

# 处理 /dev/nbd0 下的分区
kpartx -a /dev/nbd0   

# 这里需要暂停一下
sleep 1

# 查看 qcow2 文件中的各种分区(这里看到带 nbd 字样的才是可挂载的分区,哪个分区是根分区需要尝试之后才能确定)
ls /dev/mapper

# 确定根分区
root@kvmhost1:/datapool/vm/ubuntu14.04_vm5# temp_file=`mktemp`
root@kvmhost1:/datapool/vm/ubuntu14.04_vm5# rm -rf $temp_file; mkdir -p $temp_file
root@kvmhost1:/datapool/vm/ubuntu14.04_vm5# mount /dev/mapper/nbd0p1 $temp_file
root@kvmhost1:/datapool/vm/ubuntu14.04_vm5# ls $temp_file/usr    #没有挂载的这个分区 /usr 这个目录,说明不是根分区
ls: 无法访问 /tmp/tmp.nmt6d15vlK/usr: 没有那个文件或目录
root@kvmhost1:/datapool/vm/ubuntu14.04_vm5# ls $temp_file    #查看了一下,这个估计是 /boot 分区
abi-3.19.0-25-generic  config-3.19.0-25-generic  grub  initrd.img-3.19.0-25-generic  lost+found  memtest86+.bin  memtest86+.elf  memtest86+_multiboot.bin  System.map-3.19.0-25-generic  vmlinuz-3.19.0-25-generic
root@kvmhost1:/datapool/vm/ubuntu14.04_vm5# umount $temp_file #取消这个分区的挂载 
root@kvmhost1:/datapool/vm/ubuntu14.04_vm5# mount /dev/mapper/nbd0p2 $temp_file #挂载 nbd0p2 分区
root@kvmhost1:/datapool/vm/ubuntu14.04_vm5# ls $temp_file #挂载成功后,查看分区的内容,原来这个就是根分区了
bin  boot  dev  etc  home  initrd.img  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var  vmlinuz
root@kvmhost1:/datapool/vm/ubuntu14.04_vm5# ls $temp_file/usr    #这个分区有 /usr 目录
bin  games  include  lib  local  sbin  share  src

# 确保无误后,下面开始修改主机名
HOST_NAME=”vm5″
sed -i “s,127.0.0.1.*,127.0.0.1 $HOST_NAME,g” $temp_file/etc/hosts
echo $HOST_NAME > $temp_file/etc/hostname

# 修改 MAC 地址
经测试发现,较新版本的 KVM 不会出现 MAC 地址相同的情况,我的环境是 ubuntu14.04
下面是我批量创建的 4 台 VM,可以看出 MAC 地址真的没有重复,或许真的和版本有关系
vm4 fa:92:28:bd:1a:79
vm2 fa:92:15:28:d7:d5
vm3 fa:92:ad:51:87:54 
vm1 fa:92:38:68:52:e0

# 卸载挂载的分区(一定要注意卸载顺序)
root@kvmhost1:/datapool/vm/ubuntu14.04_vm5# umount $temp_file
root@kvmhost1:/datapool/vm/ubuntu14.04_vm5# qemu-nbd -d /dev/nbd

自此全部完成,就可以启动 qcow2 磁盘的虚拟机了

配置文件和脚本到

Linux 公社资源站下载:

—————————————— 分割线 ——————————————

免费下载地址在 http://linux.linuxidc.com/

用户名与密码都是www.linuxidc.com

具体下载目录在 /2016 年资料 /12 月 / 9 日 /KVM 之实现批量创建 KVM 虚拟机 /

下载方法见 http://www.linuxidc.com/Linux/2013-07/87684.htm

—————————————— 分割线 ——————————————

本文永久更新链接地址:http://www.linuxidc.com/Linux/2016-12/138112.htm

正文完
星哥说事-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-21发表,共计5505字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中