使用kvm制作OpenStack平台Windows镜像

2023-02-24 17:25:49 浏览数 (1)

运行环境

  • 系统环境:ubuntu-18.04
  • kvm版本:2.11.1

镜像软件准备

  • 系统版本:Windows server 2016 x64
  • virtio驱动:virtio-win-0.1.208.iso
  • CloudBase-init:CloudbaseInitSetup_0_9_9_x64.msi

关于virtio: kvm因为使用了硬件虚拟化,所以其cpu方面的运行效率是很高的。不过,kvm在I/O虚拟化方面,传统的方式是利用QEMU纯软件的方式来模拟I/O设备, 这样每次虚机发起I/O请求的时候,KVM内核模块会捕获这次请求,然后处理后将其放入I/O共享页,并通知用户空间中运行的QEMU程序。 QEMU获得I/O操作,交由硬件模拟代码(Emulation)来模拟出本次I/O操作之后,将结果放回I/O共享页,同时通知KVM内核模块读取I/O共享页的操作结果,把结果返回给虚机。 由于这种方式每次I/O操作经过的路径很复杂,其效率很低。所以就提出了virtio这种方案,virtio其实就是一个运行于Hypervisor之上的api接口, 让客户机知道自己运行于虚拟化环境中,进行I/O操作的时候通过virtio与Hypervisor通信,从而是虚机有更好的性能。

CloudBase-init简介

cloudbase-init 是 Windows 和其他系统的云初始化程序,可以设置主机名、创建用户、设置静态ip、设置密码等。对应的linux初始化程序是cloudinit,都是开源的Python项目。官方文档:http://cloudbase-init.readthedocs.io/en/latest/index.html

实现功能:

  • 初始化ip
  • 初始化主机名
  • 初始化用户
  • 自动扩展磁盘

配置文件路径: C:Program Files or C:Program Files (x86) as Cloudbase SolutionsCloudbase-Init目录中. 其中目录结构如下所示:

  • bin - 可执行文件和其他二进制文件.
  • conf - 配置文件
  • log - cloudbase-init相关日志.
  • LocalScripts - 用户提供的脚本

安装完成之后, cloudbase-init 作为一个使用服务和通过插件去执行的两个步骤的服务, 通过这种方式去支持所有的配置. 根据平台不同的插件可能需要重启.

安装kvm环境

安装准备

kvm虚拟化技术需要硬件的支持,首先检查服务器(或其它)是否支持虚拟化。执行下面命令只要有输出代表都支持虚拟化

代码语言:javascript复制
# egrep -o '(vmx|svm)' /proc/cpuinfo
vmx
vmx
安装kvm
代码语言:javascript复制
#sudo apt-get install qemu-kvm libvirt-bin qemu virt-manager bridge-utils
测试kvm是否安装成功
代码语言:javascript复制
# kvm --version
QEMU emulator version 2.11.1(Debian 1:2.11 dfsg-1ubuntu7.38)   #输出版本信息则为成功
Copyright (c) 2003-2017 Fabrice Bellard and the QEMU Project developers
验证KVM内核是否加载成功
代码语言:javascript复制
# lsmod | grep kvm
kvm_intel             237568  0
kvm                   626688  1 kvm_intel
irqbypass              16384  1 kvm				#输出为此内容则为成功。

若KVM内核没加载执行下面命令加载:

解决方法 直接执行下面两条命令: # sudo modprobe kvm # sudo modprobe kvm-intel ( or kvm-amd )

证实KVM正常运行
代码语言:javascript复制
# virsh -c qemu:///system list
 Id    Name                           State
----------------------------------------------------      #输出为此内容则为正常。

如果提示你没权限操作,则需要将当前操作账户添加进libvirtd组

添加命令 # sudo usermod -G libvirtd -a fdc

确认libvirtld后台服务是否启动
代码语言:javascript复制
# systemctl status libvirt-bin
● libvirtd.service - Virtualization daemon
   Loaded: loaded (/lib/systemd/system/libvirtd.service; enabled; vendor preset: enabled)
   Active: active (running) since Thu 2021-12-16 18:34:19 CST; 18h ago
     Docs: man:libvirtd(8)
           https://libvirt.org
 Main PID: 13143 (libvirtd)
    Tasks: 20 (limit: 32768)
   CGroup: /system.slice/libvirtd.service
           ├─13143 /usr/sbin/libvirtd											#输出为此内容则为正常运行。		
调出kvm图形化界面

通过vnc远程Ubuntu在终端输入下面命令调出kvm图形化界面

代码语言:javascript复制
# sudo virt-manager

使用kvm制作镜像

创建虚拟机
  • 创建存储系统镜像文件的目录
  • 用上面提供的连接下载好系统镜像和virtio镜像,然后传入到ubuntu系统里面
代码语言:javascript复制
# mkdir -p /data/iso/	
# cd /data/iso
# wget http://hudisk.tpddns.cn:8090/Ubuntu/ubuntu-18.04.3-desktop-amd64.iso
# wget http://hudisk.tpddns.cn:8097/openstack_image/virtio-win-0.1.208.iso
# ll
总用量 7814704
drwxr-xr-x 2 root         root       4096 12月 16 18:48 ./
drwxr-xr-x 4 root         root       4096 12月 16 18:46 ../
-rwx------ 1 libvirt-qemu kvm  7445807104 12月 16 18:47 cn_windows_server_2016_vl_x64_dvd_11636695.iso*
-rw-r--r-- 1 root         root  556431360 12月 16 20:53 virtio-win-0.1.208.iso
  • 创建虚拟机磁盘文件存放目录
  • 使用qemu-img命令创建一个qcow2格式的虚拟机磁盘文件
代码语言:javascript复制
# mkdir /data/kvm
# qemu-img create -f qcow2 /data/kvm/windows2016.qcow2 15G
  • 使用virt-install命令创建虚拟机
代码语言:javascript复制
# virt-install --name winserver2022 --memory 8192 --vcpus 4 --network network=default,model=virtio --disk path=/data/kvm/windows2022.qcow2,format=qcow2,device=disk,bus=virtio --cdrom /data/iso/SERVER_EVAL_x64FRE_zh-cn.iso --disk path=/data/iso/virtio-win-0.1.221.iso,device=cdrom --graphics vnc,listen=0.0.0.0 --virt-type kvm --os-type windows --os-variant win2k16 --boot cdrom

上面的–os-type windows --os-variant win2k16 可以使用osinfo-query os命令查看对应版本的–os-variant值

创建的虚拟机启动不了,磁盘启动顺序出现问题,加载顺序错误,导致加载不了,原因是是虚拟机的.xml文件中系统镜像iso标记成了hdb,而驱动文件的iso标记成了hda。

解决办法 # 在虚拟机的.xml文件中调整设备启动顺序即可 <os> <type arch=x86_64 machine=pc-i440fx-bionic>hvm</type> <boot dev=hdb/> #系统iso <boot dev=hda/> #驱动iso </os>

加载VirtIO Driver,安装磁盘驱动

默认情况下Windows检测不到可用的安装磁盘,我们需要先安装磁盘驱动。 安装Win2k12R2时,选择【手动加载磁盘驱动】 浏览D:viostor2k8R2amd64viostor.inf 添加选中文件,点击【下一步】进行安装

注意:我们也可以在此步骤安装其他驱动,但是不推荐, 因为有些驱动系统检测不到,会被隐藏,需要去掉【隐藏与系统硬件不匹配的驱动】的对勾, 才能看到相应的.inf文件进行安装

装其他virtio驱动、启动balloon服务
代码语言:javascript复制
PCI简易通信控制器-安装vioserial驱动
内存控制器-安装Balloon驱动
网络适配器-安装NetKVM驱动
存储控制器-安装vioscsi驱动

#各个驱动安装操作一致,
cd C:WindowsSystem32
pnputil.exe -i -a D:NetKVM2k16amd64netkvm.inf
pnputil.exe -i -a D:vioscsi2k16amd64vioser.inf
pnputil.exe -i -a D:vioserial2k16amd64vioser.inf
pnputil.exe -i -a D:viostor2k16amd64vioser.inf


安装guest-agent
进入驱动D:guest-agent ,双击安装64bit的qemu-ga即可。

之后需要启动balloon服务(ceilometer采集虚拟机内存监控信息所用)
将virtio中的 balloon文件夹放到, c:Program Files下(和qemu-ga安装目录位置相同即可),在命令行或者图形界面运行次程序,
在服务里面查看有个 Balloon Service 确保服务启动和开机自启动

安装cloudbase-init

从上面提供的连接下载安装包,然后拷贝到虚拟机里面直接双击安装。

配置文件如下:C:Program FilesCloudbase SolutionsCloudbase-Init下两个文件。

Cloudbase-init.conf

Cloudbash-init-unattend.conf

代码语言:javascript复制
[DEFAULT]
# 创建什么用户以及用户属于什么组.
username=Admin          #一般都是改为Administrator
groups=Administrators
inject_user_password=true  # 从元数据中获取密码 (非随机).
# 那个设备是可能的配置驱动 (元数据).
config_drive_raw_hhd=true
config_drive_cdrom=true
# 与ubuntu中功能相同的tar命令默认路径.
bsdtar_path=C:Program Files (x86)Cloudbase SolutionsCloudbase-Initbinbsdtar.exe
# 日志等级.
verbose=true
debug=true
# 日志存放路径.
logdir=C:Program Files (x86)Cloudbase SolutionsCloudbase-Initlog
logfile=cloudbase-init-unattend.log
default_log_levels=comtypes=INFO,suds=INFO,iso8601=WARN
logging_serial_port_settings=
# 启用最大传输单元和时间同步服务.
mtu_use_dhcp_config=true
ntp_use_dhcp_config=true
# 存放用户用于执行的脚本的路径.
local_scripts_path=C:Program Files (x86)Cloudbase SolutionsCloudbase-InitLocalScripts
# 服务将会检测以下驱动直到某个能够成功获取元数据.
metadata_services=cloudbaseinit.metadata.services.configdrive.ConfigDriveService, #可以开启ConfigDrive和httpservice(Openstack)
cloudbaseinit.metadata.services.httpservice.HttpService,
cloudbaseinit.metadata.services.ec2service.EC2Service,
cloudbaseinit.metadata.services.maasservice.MaaSHttpService
# 需要执行的插件.
plugins=cloudbaseinit.plugins.common.mtu.MTUPlugin,
cloudbaseinit.plugins.common.sethostname.SetHostNamePlugin,
cloudbaseinit.plugins.windows.extendvolumes.ExtendVolumesPlugin,
cloudbaseinit.plugins.windows.userdata.UserDataPlugin,
cloudbaseinit.plugins.windows.setuserpassword.SetUserPasswordPlugin,
cloudbaseinit.plugins.windows.localscripts.LocalScriptsPlugin
# 其他配置.
allow_reboot=false    # allow the service to reboot the system
stop_service_on_exit=false

建议将两个文件中下面三行内容删掉,这样每次新建实例就不需要更改密码,使用安装系统的时候设置的密码进系统。 username=Admin groups=Administrators inject_user_password=true

OpenStack导入镜像

  • 现在镜像磁盘文件比较大需要使用qemu-img命令压缩文件,压缩之后大概6G左右,然后传到OpenStac控制节点。
代码语言:javascript复制
# cd /data/kvm/
# qemu-img convert -c -O qcow2 windows2016.qcow2 Windows_server_2016_x64.qcow2
  • 在OpenStack控制节点上使用glance命令导入到OpenStack镜像池中
代码语言:javascript复制
# glance image-create --name "Windows_server_2016_x64_2021-12-16" --file /root/Windows_server_2016_x64.qcow2 --disk-format qcow2 --container-format bare --visibility public --progress
[=============================>] 100%
 ------------------ -------------------------------------- 
| Property         | Value                                |
 ------------------ -------------------------------------- 
| checksum         | f6c1ed7911f488f2a0e7439b2e9d78ac     |
| container_format | bare                                 |
| created_at       | 2021-12-17T03:57:12Z                 |
| disk_format      | qcow2                                |
| id               | 38357c53-fbac-4848-b6f5-aa7f2fd567e9 |
| min_disk         | 0                                    |
| min_ram          | 0                                    |
| name             | Windows_server_2016_x64_2021-12-16   |
| owner            | 463600ca3a754a1a8eda96d2adf875ef     |
| protected        | False                                |
| size             | 5935333376                           |
| status           | active                               |
| tags             | []                                   |
| updated_at       | 2021-12-17T03:57:44Z                 |
| virtual_size     | None                                 |
| visibility       | public                               |
 ------------------ -------------------------------------- 
  • 查看镜像
代码语言:javascript复制
# glance image-list
 -------------------------------------- ------------------------------------ 
| ID                                   | Name                               |
 -------------------------------------- ------------------------------------ 
| b03f6ada-594f-4e5d-bb3c-3dbdbced6fe8 | Centos7-2019-03-21                 |
| 64ad4b9a-e8cc-442e-870c-198ec01dd423 | Centos7-2020-03-06                 |
| c2b7c8a7-3ae6-4c11-9c48-50b28e3c00da | Centos7-2021-08-10                 |
| 55949724-bc48-409b-9d60-e6aa650fbd01 | Centos7-2021-11-26                 |
| b66ae266-297c-41c2-9d8d-c01de9fe5b11 | Centos7-2021-11-27                 |
| d2b5c6bc-f270-4391-80dd-fb653808c9e6 | cirros-qcow2                       |
| f7bd732d-8637-41ee-9b61-3c34deac1028 | Windows_server_2012_r2_x64         |
| 38357c53-fbac-4848-b6f5-aa7f2fd567e9 | Windows_server_2016_x64_2021-12-16 | #有了
 -------------------------------------- ------------------------------------ 

下载镜像命令

代码语言:javascript复制
# glance image-download --file windows_2016.qcow2 38357c53-fbac-4848-b6f5-aa7f2fd567e9

最后就可以开机器了

0 人点赞