如何制作OpenStack Windows镜像
在上一篇文章如何制作OpenStack Linux镜像中我们以CentOS7.9为例,介绍了手动制作OpenStack Linux镜像的详细步骤,本文我们将继续以制作Windows Server 2012 R2数据中心版镜像为例,介绍手动制作OpenStack Windows镜像的详细步骤。
手动制作OpenStack Windows镜像
下载镜像
访问I Tell You,在左侧单击“操作系统”,选择“Windows Server 2012 R2 with Update”,根据所需的语言和版本下载官方原版镜像并上传到/tvm下。
下载virtio驱动
访问virtio官方下载地址,下载稳定版virtio驱动并上传到/tvm下。

创建虚拟机
首先创建一个raw格式镜像文件,作为虚拟机的系统盘,大小50G。
说明
镜像文件大小可根据实际情况自行调整,本文以50G为例
1 | cd /tvm/ |
修改/tvm/templates.xml,在下图红色方框处指定虚拟机镜像文件绝对路径和ISO文件绝对路径,同时新增一个cdrom设备,将virtio驱动的ISO镜像也挂载到虚拟机中。

启动虚拟机
1 | cd /tvm/ |
启动完成后,使用vnc client连接到虚拟机控制台。
安装OS
进入虚拟机控制台可以看到虚拟机正在加载文件,加载完成后选择语言,单击“下一步”,接着单击“现在安装”

待安装程序启动后,选择要安装的操作系统“Windows Server 2012 R2 Datacenter(带有 GUI 的服务器)”,然后单击“下一步”

勾选“我接受许可条款(A)”,单击“下一步”

选择“自定义:仅安装 Windows(高级)(C)”

单击“加载驱动程序(L)”
说明
此时提示说“未找到任何驱动器。要获取存储设备驱动程序,请单击“加载驱动程序””。因为在KVM中,Windows虚拟机默认Disk使用的是Qemu IDE硬盘,默认网卡是100M网卡,为了使KVM主机在相同的配置下有更好的效率,我们在XML文件中设置了bus='virtio',使硬盘工作在SCSI模式,但因缺少virtio驱动,识别不到硬盘,所以我们需要用刚挂载的virtio驱动的ISO文件安装相应的virtio驱动。

单击“浏览”

选择virtio驱动器的viostor/2k12R2/amd64目录,单击“确定”。
说明
2k12R2代表Windows Server 2012 R2,如果安装的为其他操作系统版本,请自行选择对应的目录。
说明
如果按照操作系统版本选择对应目录扫描后提示“找不到签名的设备驱动程序。请确保安装介质包含正确的驱动程序,然后单击“确定”。”,可以直接使用更新版本的操作系统目录扫描试试,只要驱动兼容即可使用。

扫描出来可用的SCSI驱动后,单击“下一步”

单击“新建(E)”进行磁盘分区,将所有的磁盘空间划分到C盘,最后单击“下一步”


等待安装完成…

配置OS
安装网卡驱动、VirtIO Balloon Driver和VirtIO Serial Driver
打开“服务器管理器”,单击右上角“工具”,选择“计算机管理”打开计算机管理

单击左侧“设备管理器”可以看到有2个以太网控制器、1个PCI设备和1个PCI简单通讯控制器显示有一个黄色感叹号,任选其一右键单击,选择”更新驱动程序软件(P)...“

选择”浏览计算机以查找驱动程序软件(R)“

单击“浏览”

选择virtio所在的驱动器,单击“确定”

单击“下一步”

勾选“始终信任来自"Red Hat,Inc."的软件(A)”,单击“安装”

单击“关闭”,完成驱动安装。并重复上述步骤完成其他异常设备的驱动安装。

开启远程桌面服务
在任务栏右键单击,单击“任务管理器(K)”,单击“详细信息(D)”,切换到“服务”选项卡,单击“打开服务”,找到“Remote Desktop Services”服务,单击“启动”。

右键单击“Remote Desktop Services”服务,选择“属性”,将“启动类型”改成“自动”,并单击“确定”

打开“文件资源管理器”,对“这台电脑”右键单击,选择“属性”,单击左侧“远程设置”,勾选“允许远程连接到此计算机(L)”,取消勾选“仅允许运行使用网络级别身份验证的远程桌面的计算机连接(建议)(N)”,最后单击“确定”

关闭防火墙
在左下角开始图标右键单击,选择“控制面板(P)”,单击“系统和安全”

单击“Windows防火墙”

单击“启用或关闭Windows防火墙”

勾选“专用网络设置”和“公用网络设置”的“关闭Windows防火墙(不推荐)”选项,单击“确定”

关闭自动更新
在左下角开始图标右键单击,选择“控制面板(P)”,单击“系统和安全”

单击“Windows更新”

单击“更改设置”

选择“从不检查更新(不推荐)”,单击“确定”
说明
自动更新建议根据实际情况进行设置

修改Windows系统远程桌面会话时间限制(可选)
关闭客户体验改善计划(可选)
修改Windows默认远程桌面端口(可选)
安装qemu-guest-agent
打开“文件资源管理器”,进入virtio驱动器

进入guest-agent文件夹

根据操作系统位数选择对应版本的安装包,右键单击,选择“安装”
说明
qemu-ga-i386为32位安装包,qemu-ga-x86_64为64位安装包

在任务栏右键单击,单击“任务管理器(K)”,切换到“服务”选项卡,单击“打开服务”,找到“QEMU Guest Agent”服务,确认状态为“正在运行”,启动类型为“自动”

右键单击“QEMU Guest Agent VSS Provider”服务,选择“属性”,将“启动类型”改成“自动”,并单击“确定”

安装Cloudbase-Init
Cloudbase-Init是一种在Windows操作系统中安装的工具,它的作用是帮助用户在云环境中自动化地配置和初始化Windows虚拟机。在云环境中,用户需要快速创建和部署虚拟机,而Cloudbase-Init可以帮助用户在创建虚拟机时自动完成一些初始化工作,例如配置网络、安装软件、执行脚本等。
- Cloudbase-Init官网:https://cloudbase.it/cloudbase-init/
- Cloudbase-Init下载链接:https://github.com/cloudbase/cloudbase-init/releases
说明
CloudbaseInitSetup_X_X_X_x86.msi为32位安装包,CloudbaseInitSetup_X_X_X_x64.msi为64位安装包
下载CloudbaseInitSetup_X_X_X_XXXX.msi安装包上传到桌面,双击打开Cloudbase-Init安装包,进入Cloudbase-Init安装界面,单击“Next”

勾选“I accept the terms in the License Agreement”,单击“Next”

单击“Next”
说明
如果需要修改Cloudbase-Init的安装目录,可单击“Browse...”进行修改

在Configuration options界面,将Username设置为Administrator,Serial port for logging设置为COM1,勾选Run Cloudbase-Init service as LocalSystem,最后单击“Next”。

单击“Install”,安装Cloudbase-Init

待Cloudbase-Init完成安装后,单击“Finish”,关闭Cloudbase-Init安装界面
说明
关闭Cloudbase-Init安装界面时,请勿勾选任何复选框,不要运行Sysprep

说明
如果安装过程中出现“无法启动此程序,因为计算机中丢失api-ms-win-crt-runtime-l1-1-0.dll。尝试重新安装该程序以解决此问题。”的错误提示导致安装失败,连续单击2次“确定”让安装程序自动回滚所有操作,并单击“Finish”关闭然后到微软官方下载Visual C++ Redistributable for Visual Studio 2015并安装,然后再执行以上安装步骤
打开cloudbase-init.conf配置文件,在文件末尾添加以下内容,保存退出
说明
cloudbase-init.conf配置文件的默认路径为:C:\Program Files\Cloudbase Solutions\Cloudbase-Init\conf
1 | first_logon_behaviour=no |
说明
更多有关Cloudbase-Init的配置详情请参考官方文档的Services、Plugins、Userdata、Configuration options reference章节
最后删除Cloudbase-Init和Visual C++ Redistributable for Visual Studio 2015的安装包并清空回收站
禁用Windows随机生成的接口ID
在左下角开始图标右键单击,选择“命令提示符(管理员)(A)”,在打开的cmd窗口输入以下命令并回车
1 | netsh interface ipv6 set global randomizeidentifiers=disabled |

清理系统日志
打开“服务器管理器”,单击右上角“工具”,选择“事件查看器”打开事件查看器

双击”Windows日志“,对“应用程序”右键单击,单击“清除日志(C)...”

单击“清除(C)”

重复上述步骤清除“安全”、“设置”、“系统”、“已转发事件”等模块中的日志
正常关机
单击左下角开始图标,单击右上角电源图标,选择“关机”

说明
以上为比较常见通用的配置项,更多自定义配置请根据自己的云环境情况进行调整,例如安装对应云环境的监控agent、安全加固配置、安装防暴力破解工具等等
转换镜像格式
将raw格式镜像文件转换成qcow2格式镜像文件,压缩空间便于传输。
1 | qemu-img convert -c -f raw Windows2012_R2_Datacenter.raw -O qcow2 Windows2012_R2_Datacenter.qcow2 |
上传镜像
使用glance命令上传镜像
OpenStack Windows镜像制作完成后,将最终生成的qcow2镜像文件上传到OpenStack控制节点,先转成raw镜像文件,然后通过glance命令上传镜像,最后设置镜像的hw_qemu_guest_agent属性为yes即可。相关命令如下:
1 | qemu-img convert -f qcow2 Windows2012_R2_Datacenter.qcow2 -O raw Windows2012_R2_Datacenter.raw |
通过rbd直接导入镜像
由于镜像通常比较大,上传时如果使用Glance API,则通过HTTP上传,由于HTTP协议的限制,导致上传非常慢,非常耗时,并且可能会超时导致上传失败。如果Glance使用Ceph作为存储后端,可以通过rbd直接导入(import)的方式上传到Ceph中,速度会大幅度提高。
首先需要把镜像转为raw格式
1 | qemu-img convert -f qcow2 Windows2012_R2_Datacenter.qcow2 -O raw Windows2012_R2_Datacenter.raw |
创建一个空镜像,并记录${IMAGE_ID}(不需要指定文件路径,只是占个坑)
1 | glance image-create --name "Windows2012_R2_Datacenter" --disk-format raw --container-format bare --is-public True |
使用rbd命令直接导入镜像并创建快照
1 | rbd --user ${USER_ID} -k ${Keyring} -p ${POOL_NAME} import Windows2012_R2_Datacenter.raw |
更新镜像的locations参数
1 | glance location-add --url rbd://${FS_ID}/${POOL_NAME}/${IMAGE_ID}/snap $IMAGE_ID [--metadata '{"backend": "${BACKEND_NAME}"}'] |
设置hw_qemu_guest_agent属性为yes
1 | glance image-update --property hw_qemu_guest_agent=yes ${IMAGE_ID} |
