前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >使用kvm制作OpenStack平台Windows镜像

使用kvm制作OpenStack平台Windows镜像

作者头像
用户9949933
发布2023-02-24 17:25:49
2.4K0
发布2023-02-24 17:25:49
举报

运行环境

镜像软件准备

关于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 Solutions\Cloudbase-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:\viostor\2k8R2\amd64\viostor.inf 添加选中文件,点击【下一步】进行安装

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

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

#各个驱动安装操作一致,
cd C:\Windows\System32
pnputil.exe -i -a D:\NetKVM\2k16\amd64\netkvm.inf
pnputil.exe -i -a D:\vioscsi\2k16\amd64\vioser.inf
pnputil.exe -i -a D:\vioserial\2k16\amd64\vioser.inf
pnputil.exe -i -a D:\viostor\2k16\amd64\vioser.inf


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

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

安装cloudbase-init

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

配置文件如下:C:\Program Files\Cloudbase Solutions\Cloudbase-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 Solutions\Cloudbase-Init\bin\bsdtar.exe
# 日志等级.
verbose=true
debug=true
# 日志存放路径.
logdir=C:\Program Files (x86)\Cloudbase Solutions\Cloudbase-Init\log\
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 Solutions\Cloudbase-Init\LocalScripts\
# 服务将会检测以下驱动直到某个能够成功获取元数据.
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

最后就可以开机器了 😎

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-12-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 运行环境
  • 镜像软件准备
  • 安装kvm环境
    • 安装准备
      • 安装kvm
        • 测试kvm是否安装成功
        • 验证KVM内核是否加载成功
        • 证实KVM正常运行
        • 确认libvirtld后台服务是否启动
        • 调出kvm图形化界面
    • 使用kvm制作镜像
      • 创建虚拟机
        • 加载VirtIO Driver,安装磁盘驱动
          • 装其他virtio驱动、启动balloon服务
          • 安装cloudbase-init
          • OpenStack导入镜像
          • 下载镜像命令
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档