文章目录
OpenStack Windows 镜像制作
基础环境
由于 OpenStack 的虚拟化层是 kvm ,所以最好是在 Linux 上进行制作,使用 VMware 和 Vbox 制作的镜像都会由于驱动问题,导致上传到 OpenStack 环境中后,实例无法启动,蓝屏报错信息:INACCESSIBLE BOOT DEVICE
,无法找到启动设备。
基础环境为一台安装了 kvm 虚拟化的 CentOS 7 机器,最好带桌面环境(如果没有桌面环境可以设置 X11 转发)。
安装 kvm:
# 检查当前环境是否支持虚拟化
grep -E '(vmx|svm)' /proc/cpuinfo
# 安装所需软件
yum install qemu-kvm qemu-img virt-manager libvirt libvirt-python libvirt-client virt-install virt-viewer bridge-utils -y
# 开启进程
systemctl start libvirtd
systemctl enable libvirtd
# x11 需要的软件包
yum install "@X Window System" xorg-x11-xauth xorg-x11-fonts-* xorg-x11-utils -y
准备工作
软件准备
本次制作镜像版本为 Windows 10 专业版 2004 版本,所需软件链接已附。
- 原生镜像。
- Windows ADK(只用到WSIM组件)
因为全部ADK全部组件下载完成要1个多G;贴出打包好的WSIM单工具地址:下载链接,可执行程序位于.\Assessment and Deployment Kit\Deployment Tools\WSIM\imgmgr.exe
。 - cloud-init 安装程序 :用于获取 OpenStack metadata 数据。
- virtio 驱动包:用于适配虚拟化平台。
- 其他需要预装到 Windows 中的软件。
OOBE 自动应答文件准备
解压文件
解压 Windows ISO 镜像文件到目录中,打开WSIM 工具,加载镜像中的sources\install.wim
,按照提示新增编录文件。
编辑应答文件
参考官方文档,对以下几个选项进行应答。
- Microsoft-Windows-International-Core settings
- Microsoft-Windows-Shell-Setup/OOBE settings
- Microsoft-Windows-Shell-Setup/OOBE/ProtectYourPC
- Microsoft-Windows-Shell-Setup/UserAccounts
将这几项都传送到 oobeSystem 中,并根据实际情况设置数值,具体选项含义参考:OOBE 全部配置项参考。
以下是我已经做好的基于 win10 2004 版本的自动跳过 OOBE 的应答文件部分内容,可根据需要自行修改,也可根据官方文档使用 WSIM 自定义更多初始化配置项。<OOBE> <VMModeOptimizations> <SkipAdministratorProfileRemoval>true</SkipAdministratorProfileRemoval> <SkipNotifyUILanguageChange>true</SkipNotifyUILanguageChange> <SkipWinREInitialization>true</SkipWinREInitialization> </VMModeOptimizations> <HideEULAPage>true</HideEULAPage> <HideLocalAccountScreen>true</HideLocalAccountScreen> <HideOEMRegistrationScreen>true</HideOEMRegistrationScreen> <HideOnlineAccountScreens>true</HideOnlineAccountScreens> <HideWirelessSetupInOOBE>true</HideWirelessSetupInOOBE> <NetworkLocation>Work</NetworkLocation> <SkipMachineOOBE>true</SkipMachineOOBE> <SkipUserOOBE>true</SkipUserOOBE> <UnattendEnableRetailDemo>false</UnattendEnableRetailDemo> <ProtectYourPC>3</ProtectYourPC> <OEMAppId>cloud.test.com</OEMAppId> </OOBE> <TimeZone>China Standard Time</TimeZone> <RegisteredOrganization>test.com</RegisteredOrganization> <SearchBoxVisibleInTouchImprovement>false</SearchBoxVisibleInTouchImprovement> <ShowWindowsLive>false</ShowWindowsLive> <DisableAutoDaylightTimeSet>true</DisableAutoDaylightTimeSet> <BluetoothTaskbarIconEnabled>false</BluetoothTaskbarIconEnabled> <ShowPowerButtonOnStartScreen>true</ShowPowerButtonOnStartScreen> <SignInMode>1</SignInMode> <EnableStartMenu>true</EnableStartMenu> <ConvertibleSlateModePromptPreference>0</ConvertibleSlateModePromptPreference> <AppIconInTouchImprovement>true</AppIconInTouchImprovement> <FileExplorerInTouchImprovement>true</FileExplorerInTouchImprovement> </component> </settings>
镜像制作
创建虚机
终端打开 virt-manager,新建虚拟机,加载 windows 系统镜像和 virtio 驱动镜像。
-
新建虚拟机
-
选择本地 Windows 镜像
-
分配内存和 CPU,4G 2CPU 足够
-
创建硬盘,15G足够,系统安装完后占用12G左右
-
选择 开始安装前自定义配置
-
重要:修改 Disk bus 为VirtIO
-
添加一块 CDROM,挂载 VirtIO 驱动镜像
-
连接 windows 镜像
-
修改启动顺序,勾选硬盘和 Windows 镜像
-
修改网卡驱动为 VirtIO
-
建议:将显示协议选为 VNC,提高操作体验;默认为 SPICE,没有 agent 操作很费劲。
-
右下角,
Apply
;左上角Begin Installation
开始安装。
系统安装
进入系统安装页面后,下一步 —> 现在安装 —> 专业版 —> 下一步 —> 自定义安装,直到选择系统盘的页面,加载网卡驱动和硬盘驱动。
加载网卡驱动:NetKVM/w10/adm64
加载硬盘驱动:viostor/w10/amd64
之后可以看到硬盘已经加载出来,新建一个分区,保留系统分区,选择 主分区,下一步 开始安装。
多次重启后安装完成,直到进入选择地区的页面,此时系统状态为 OOBE,按Ctrl + Shift + F3,进入 OOBE 审核模式。
关于审核模式的描述,见微软官方文档,审核模式概述。
进入系统后,会弹出 系统准备工具,关闭即可;之后进行系统配置及软件、驱动等的安装。
cloud-init 安装配置
将 clouod-init 安装文件通过 FTP 等方式传入系统中,打开安装。
在“Configuration options”窗口中,设置用户名为自己想要使用的用户,日志输出串口选择“COM1”,完成安装。
安装完成后点击 Finish,完成安装。
安装完成后,需要修改配置文件。
在配置文件 C:\Program Files\Cloudbase Solutions\Cloudbase-Init\conf\cloudbase-init.conf
中补充以下内容(去掉注释):
# 默认系统名只支持小于等于15个字符,修改后可支持到63个字符
netbios_host_name_compatibility=false
# 配置获取 openstack metadata 数据源
metadata_services=cloudbaseinit.metadata.services.httpservice.HttpService
# 配置重传次数,因为windows初始化时间比较长,为了防止无法获取到metadata,重传设置大一些
retry_count=40
retry_count_interval=5
# 默认情况下,第一次登录后,系统会强制用户修改密码,设置为 no 则不用强制
first_logon_behaviour=no
# 防止Windows添加默认路由导致metadata网络不通
[openstack]
add_metadata_private_ip_route=False
同一个配置文件中,还需要修改以下两行的关键字,保证日志可以正常输出:
# 第 12 行和 第 13 行,logdir 改为 log-dir ,logfile 改为 log-file,可能是由于软件版本比较新,软件代码改了而官方自带配置文件未及时更新
log-dir=C:\Program Files\Cloudbase Solutions\Cloudbase-Init\log\
log-file=cloudbase-init.log
关于windows系统密码
cloud-init windows 镜像默认使用随机密码或者强制用户首次登录更改密码,配置项中无法指定密码,参见官网定义。
若需要指定密码,可通过新建实例时,指定 metadata 的 admin_pass
字段或使用用户开机脚本来控制,方法见: openstack-windows-admin-password。
还有一种取巧的办法,既然必然会生成随机密码,而且无法获取到,想要固定密码,可以直接修改一下源码,让它直接生成一个固定的密码,这样如果metadata指定密码,则使用metadata的密码;未指定的话,使用固定密码。
可以修改C:\Program Files\Cloudbase Solutions\Cloudbase-Init\Python\lib\site-packages\cloudbaseinit\plugins\common\setuserpassword.py
第70行的函数_set_password
,直接在返回随机密码时,将密码修改为固定值。
VirtIO 驱动安装
打开资源管理器后,会看到已经加载了 VirtIO 的CDROM,直接运行 virtio-win-guest-tools
,会安装一系列驱动文件。
软件安装,系统配置等
安装自己所需预装软件即可。
打开远程桌面。
打开服务,设置远程桌面相关的 3 个服务为自动启动,并开启服务。
删除系统恢复分区,以便cloud-init可以自动扩展硬盘
使用 DiskGenius 工具,删除500多M的系统自带恢复分区,扩展为系统盘。
删除恢复分区,左上角 保存更改 后,在 磁盘管理 里面 扩展卷,将多余空间合并到系统盘。
合并之后,OpenStack上新建的实例可以进行硬盘自动扩展。
修改电源选项,从不休眠
修改时间服务器为本地内网NTP服务器
按需修改。
关闭防火墙
资源管理器中打开 控制面板\所有控制面板项\Windows Defender 防火墙\自定义设置
,关闭防火墙。
系统封装
整合应答文件
目录 C:\Program Files\Cloudbase Solutions\Cloudbase-Init\conf
中一个 Unattend.xml 文件,是默认的应答文件,该文件中对 OOBE 的应答效果不全,所以要将上文中根据具体系统版本生成的应答文件进行整合。
用文本编辑器将上文生成应答文件中的 <settings pass="oobeSystem"> ......</settings>
部分,替换到 Unattend.xml 文件中对应部分即可。
执行 sysprep
在cmd中切换到目录,C:\Program Files\Cloudbase Solutions\Cloudbase-Init\conf
,使用整合后的应答文件进行系统封装:
C:\windows\system32\sysprep\sysprep.exe /oobe /generalize /shutdown /mode:vm /unattend:my.xml
封装完成后会自动关机,镜像制作完成。
上传镜像
默认情况下,使用 virt-manager 新建的虚机,硬盘位于/var/lib/libvirt/images/win10.qcow2
,将该文件直接上传到 OpenStack 中即可使用。