前天M$正式发布了Windows 11,虽然可能有些在很早之前的Preview版都知道怎么操作
不过还是来分享一下怎么把现有的Win10 VM在不重灌的情况下升级成Win11
目前大多数人都知道要升级成Win11,必须先满足两个条件
1. BIOS必须启动并且OS已经是处在Secure Boot模式
2. 必须具备TPM,并且至少得是2.0版本
基于上述两个需求,原Win10 VM也必须是在当初以UEFI模式安装系统的情况下才可升级
当然网络上也可以查到怎么样不重灌从Legacy BIOS改成UEFI开机的方法
不过这不在本篇要介绍的范围
1. 更新KVM相关驱动
VirtIO相关的Windows驱动在之前都是没有经过WHQL认证的,这在Secure Boot上会有问题
不过最新的稳定版VirtIO驱动(0.1.208+)已经都有了WHQL认证
因此第一步是先更新这些驱动到最新版
2. 替换成支援Secure Boot的OVMF档案
再来只要把现有的OVMF档案换成secboot类型的即可
由于Win11的安装ISO还有升级小帮手并不会侦测系统是否处在Secure Boot状态
所以我们只要确保OVMF有Secure Boot功能即可,并不一定需要去启用它
但有一点要留意,有些Linux distro所推送的OVMF_Sec并不会包含M$的签章
目前知道的是Fedora与Ubuntu官方repo所提供的OVMF_Sec都已经包含签章
其他的比如ArchLinux是没有包含的,需要另外从其他distro上找
确定OK后,就可以直接替换档案,方法是直接编辑VM的XML
把<loader>中的OVMF_CODE.fd改成OVMF_CODE.secboot.fd即可
另外除非你想要重置VM成启用Secure Boot状态,否则不需要去动xxx_VARS.fd
(xxx=VM名称)
如果想启用Secure Boot,则必须再做额外两个修改
a. 将原先加载OVMF_CODE.secboot.fd的loader加入secure='yes'参数,变成:
<loader readonly='yes' type='pflash' secure='yes'>/path/of/OVMF_CODE.secboot.fd
</loader>
b. 找到OVMF_VARS.secboot.fd然后覆蓋掉原本的xxx_VARS.fd
3. 增加CPU features参数
之后还需要在XML内的<features>增加一个参数进去
<smm state='on'/>
加入后就像这样 https://i.imgur.com/nmWHL3P.png
4. 加入TPM
TPM有两种加入方式,一个是直接用KVM模拟的TPM,另一个是直接passthrough
后者的优点是日后比较不会遇到相容性问题,缺点是只能给一个VM使用
而且必须要先进BIOS清除前一笔TPM资料(如果有的话)
先讲模拟TPM,KVM支援两种模拟方式,分别是CRB及TIS
CRB仅支援TPM 2.0、TIS则支援大多数TPM版本
首先必须先安装swtpm这个套件才可以使用模拟TPM,Fedora及Arch默认的repo可直接安装
Ubuntu/Debian则要找第三方来源
装好后,直接透过virt-manager或者是修改XML的方式加入:
<tpm module='tpm-crb'>
<backend type='emulator' version='2.0'/>
</tpm>
如果在使用CRB的情况下出现以下错误,则可以改用TIS试试
"qemu-system-x86_64: Requested buffer size of 3968 is smaller than host TPM's
fixed buffer size of 4096"
若要使用硬件TPM,在从BIOS启用TPM功能后(AMD fTPM或是Intel PTT)
先看一下是否有在/dev内出现tpm0这个device
之后编辑XML加入TPM:
<tpm module='tpm-tis'>
<backend type='passthrough'>
<device path='/dev/tpm0'/>
</backend>
</tpm>
驱动、Secure Boot、与TPM都搞定后,便可以进到Win10 VM用M$的检测工具
或者是Win11升级小帮手验证是否可以升级
这些变动没办法改变原先Windows Update的判定状态,所以没办直接用其升级
不过只要升级小帮手判定OK就可以直接做升级了
昨天经过这些修改后升级成功,目前VM内的系统已经是Win11
虽然用处不算大,还是给各位做一个参考