Windows 11 不用绕过
能得到什么
给虚拟机打开 TPM(向导里勾选,或在配置里写 "tpm": true),其余的 keelOS 都自动处理:第一次开机时生成 TPM 的身份(背书密钥、证书、SHA-256 的 PCR 组);每次开机或恢复时起一个新的 TPM 模拟器。TPM 的永久状态放在这台虚拟机自己的 ZFS 数据集里,快照和复制都会带上它。
怎么做的
虚拟机看到的是标准的 CRB 接口 TPM,后面是 swtpm,也就是 QEMU 和 Proxmox 用的那个 TPM 模拟器。keelOS 把它的两条通道都接上了:数据通道传 TPM 命令,控制通道管上电、复位和状态的导出导入。所以虚拟机重启时 TPM 会复位;挂起时,TPM 的易失状态(PCR、会话、已加载的密钥)写进虚拟机的检查点,恢复时灌进一个新的模拟器。宿主重启时用的也是这个检查点。
上游 bhyve 的 TPM 代码也修结实了:格式不对的命令回 TPM 错误,而不是让 TPM 永久失效;没实现的寄存器像真硬件一样忽略,而不是停掉虚拟机;模拟器挂了,虚拟机只收到 TPM 错误,照常运行。
实测
- Windows 11 25H2:安装程序自己的 TPM 2.0 和 Secure Boot 检查直接通过,没有任何绕过。
- BitLocker 用 TPM 保护器加密了系统盘。
- Windows 重启:TPM 自动解封,没要恢复密钥。
- 挂起再恢复(换成新的模拟器进程):暂停 3.7 秒,TPM 和 BitLocker 照常。
- 恢复前后 PCR 的值一致;虚拟机自己重启时,PCR 从零重新度量。
顺带解决的:新建的虚拟机把所有 vCPU 放进一个插槽(Windows 11 专业版最多用两个插槽);修了一个让 Windows 重启时卡住的 e1000 中断问题。
还没做的
- TPM 状态文件没有加密。它和磁盘在同一台机器上,加密在这里能防的情形有限。
- Secure Boot 还没有预置微软的密钥。
- 要固件在下次开机时执行的 TPM 请求(比如 Windows 里的"清除 TPM")会丢,上游 bhyve 也一样。
- 打开 BitLocker 之前要先卸下可启动的安装 ISO,否则 Windows 会拒绝。