教程[19] 在 PVE 中挂载虚拟磁盘 & 跳过 Windows OOBE 关于账户创建部分

开篇废话

这篇文章大概是记录一下我在 PVE 中做 Windows 系统模版的时候遇到的一个小问题,大概就这样。
核心点就是 Unattend.xml 文件的编写。
然而在这篇文章中主要是讲如何挂载 PVE 的虚拟机磁盘

正文

在 PVE 中挂载模版盘

如果不是 PVE 那么跳过此部分,此处为已经转换成模版盘的挂载情况,当然其他方式的也可以参考就是了,部分文件名称不太一样而已。

此处其实关机打个快照是最方便的方案,不过都克隆了就所谓了,懒得改了。

警告

在没有其它 Linked Clone 的情况下我们还是可以偷偷修改里面的文件,如果有 Linked Clone 的虚拟机了的话,一般情况下就不推荐修改而是再 clone 一份。

执意要改翻车了不要来找我

首先安装依赖:

apt install kpartx ntfs-3g

当然不用 kpartx 自己手算分区的 offset 也是可以的,此处不提供计算方式。
ntfs-3g 是肯定要的(或者找下其它的)有了这些我们才可以在 Linux 偷偷挂载 NTFS 分区。

在基于 LVM 的 PVE 中,虚拟机的磁盘映像在 /dev/mapper 里,对着 id 找,如图所示,模版映像的虚拟磁盘名称会变成 pve-base--200--disk--0 而通常情况下的名称为 pve-vm--200--disk--0

如果是删掉 lvm 用 qcow2 应该也差不多,只是磁盘路径不一样而已。

cd /dev/mapper
ls | grep base

如果 base 磁盘没有出现,那么在 pve 里执行一次 clone 操作就出现了。

ls /dev/mapper

然后我们使用 kpartx 来进行拆分分区操作:

kpartx -av /dev/mapper/pve-base--200--disk--0

然后挂载你觉得像 Windows 系统分区的盘符:

mount /dev/mapper/pve-base--200--disk--0p2 /mnt

空间紧张的话也可以把 swapfile.sys pagefile.sys 给删了,我是没有测试过

然后然后去添加 Unattend.xml 文件,也就是下一章的内容。

相关命令实践:

ls and mount

Unattend 自动值守

Unattend.xml 是 Windows 系统的自动化配置文件,路径为 /Windows/Panther/Unattend.xml
我们可以在这里添加一些自定义的配置,比如自动登录,自动安装等等,也可以设置系统运行什么 cmd 之类的,也可在 OOBE 过程中运行些其它程序,当然在本文最主要部分是拿来跳过用户创建过程。

此处是我成功跳过 oobe 用户创建的 Unattend.xml 可以按需使用:

此处为 WIndows 10 x64 下测试成功的文件

<?xml version="1.0" encoding="utf-8"?>
<unattend xmlns="urn:schemas-microsoft-com:unattend">
     <settings pass="oobeSystem">
          <component name="Microsoft-Windows-Shell-Setup" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
               <OOBE>
                    <HideEULAPage>true</HideEULAPage>
                    <HideOEMRegistrationScreen>true</HideOEMRegistrationScreen>
                    <HideOnlineAccountScreens>true</HideOnlineAccountScreens>
                    <HideWirelessSetupInOOBE>true</HideWirelessSetupInOOBE>
                    <HideLocalAccountScreen>true</HideLocalAccountScreen>
                    <SkipMachineOOBE>true</SkipMachineOOBE>
                    <SkipUserOOBE>true</SkipUserOOBE>
                    <ProtectYourPC>1</ProtectYourPC>
               </OOBE>
          </component>
     </settings>
</unattend>

(32位系统 把 amd64 改成 x86 应该就可以用了)

ls and edit
(用 nano 或者 vim 直接把上面的内容粘贴进去)

其中

<SkipMachineOOBE>true</SkipMachineOOBE>
<SkipUserOOBE>true</SkipUserOOBE>

是必要的部分。

此部分不再作解释翻译,都是简单英文。

在 PVE 中卸载磁盘

此部分也要单独说一下,一般套路就这样

cd
umount /mnt
kpartx -d /dev/mapper/pve-base--200--disk--0
sync

就可以了。

一般来说不卸载都可以,但还是有点怕

效果

总结

这次折腾对 Windows 模版的折腾还是有点了解了,大概知道怎么缝合 Unattend.xml 自动应答文件,应该也有一些生成工具可以生成这些配置,不过暂时需求不大就没去搜索了,另外 DISM++ 似乎也有一些设置可以干预 OOBE 过程?要用到的时候再来查吧。

然后大家都自己的折腾组合,我们有很多做模版方案,我的直接挂载改模版方案还是太灵了,学习以下综合知识来玩更好点:

  • 挂载 & 卸载虚拟磁盘
  • PVE 快照的使用
  • Sysprep
  • Unattend
  • dd 手动克隆硬盘
  • 如何使用搜索引擎

其中虚拟机打快照可以极大地节省我们测试 Unattend.xml 的时间,意识到这点折腾的体验就好很多了。

最后不要在生产环境玩这个,老老实实 clone 一份新的得了,不要作死




参考资料