2021.10.10 更新:PVE Manager 7.0-13 添加了对 TPM 的原生支持(见下图)PVE 论坛链接,原文仅供参考
按上图配置安装 Win11
Windows 11 硬性要求 TPM 2.0,虽然现在看来可以通过各种手段绕过这个限制,但真正开启 TPM 2.0 才是最保险的方式
我的 Proxmox VE(PVE) 运行在 X99 主板上,CPU 为 5820k,主板上没有插 TPM 模块,需要软件模拟 TPM,下文使用 swtpm (libtpms 的一种实现) 来模拟 TPM
PVE 底层是 QEMU KVM,所以 QEMU 同理可用
另:PVE 官方已经计划在 PVE 中添加 vTPM(详见 vTPM support - do we have guide to add the vTPM support?),但是官方回应尚停留在今年 1 月
下文将展示如何在 Proxmox VE(PVE) 下为虚拟机开启 TPM 2.0
环境
- Proxmox VE 5.4.114-1
- 基于 Debian 10、QEMU KVM
参考
步骤
以下指令均在 root 用户下执行,其他用户请酌情添加 sudo
编译环境为 Debian,以下指令也适用于 Ubuntu,其他操作系统可以查看前两个参考链接
编译安装 libtpms
因为 swtpm 是 libtpms 的实现(依赖于 libtpms),所以需要先安装 libtpms
获取源码
执行
git clone https://github.com/stefanberger/libtpms.git
安装依赖环境
执行
apt -y install automake autoconf libtool gcc build-essential libssl-dev dh-exec pkg-config dh-autoreconf gawk
编译 libtpms
执行
cd libtpms ./autogen.sh --with-openssl make dist dpkg-buildpackage -us -uc -j4
安装
执行
cd .. dpkg -i libtpms0_*_amd64.deb libtpms-dev_*_amd64.deb
编译安装 swtpm
获取源码
执行
git clone https://github.com/stefanberger/swtpm.git
安装依赖环境
执行
apt -y install libfuse-dev libglib2.0-dev libgmp-dev expect libtasn1-dev socat tpm-tools python3-twisted gnutls-dev gnutls-bin libjson-glib-dev python3-setuptools softhsm2 libseccomp-dev
编译
执行
cd swtpm dpkg-buildpackage -us -uc -j$(nproc)
安装
执行
cd .. dpkg -i ./swtpm*.deb
配置 swtpm 服务
在 /etc/systemd/system 下新建服务文件 swtpm.service,写入以下内容
[Unit] Description=swtpm server [Service] Type=simple ExecStartPre=mkdir -p /var/lib/qemu-swtpm/swtpm ExecStart=swtpm socket --tpm2 --tpmstate dir=/var/lib/qemu-swtpm/swtpm --ctrl type=unixio,path=/var/run/qemu-server/swtpm.sock --log level=20 Restart=always [Install] WantedBy=multi-user.target
以上服务配置用来开启 TPM 2.0,开启其他版本需要更改 --tpm2 参数为对应版本参数
注意:此服务模拟了单个 TPM 设备,只能供一个虚拟机使用,多个虚拟机无法使用同一个模拟 TPM。如有多个虚拟机 TPM 需求,则按以上配置新建多个 swtpm 服务即可(将 swtpm 改为其他名称,例如:/var/lib/qemu-swtpm/swtpm2,/var/run/qemu-server/swtpm2.sock )
开启服务
systemctl start swtpm.service systemctl status swtpm.service # 开机启动 systemctl enable swtpm.service
客户机开启 TPM 2.0
进入 /etc/pve/qemu-server 目录,编辑待开启的虚拟机配置文件
#备份配置文件 cp [虚拟机编号].conf [虚拟机编号].conf.bak vim ./[虚拟机编号].conf
将以下内容添加到文件首行
args: -global driver=cfi.pflash01,property=secure,value=on -chardev socket,id=chrtpm,path=/var/run/qemu-server/swtpm.sock -tpmdev emulator,id=tpm0,chardev=chrtpm -device tpm-tis,tpmdev=tpm0
重启虚拟机
qm reboot [虚拟机编号]
重启后虚拟机会自动开启 TPM 2.0
其实服务可以用 @ 来做
[email protected]:~/swtpm# cat /etc/systemd/system/[email protected]
[Unit]
Description=swtpm server
[Service]
Type=simple
ExecStartPre=mkdir -p /var/lib/qemu-swtpm/swtpm-%i
ExecStart=swtpm socket –tpm2 –tpmstate dir=/var/lib/qemu-swtpm/swtpm-%i –ctrl type=unixio,path=/var/run/qemu-server/swtpm-%i.sock –log level=20
Restart=always
[Install]
WantedBy=multi-user.target
[email protected]:~/swtpm# systemctl enable –now [email protected]
Created symlink /etc/systemd/system/multi-user.target.wants/[email protected] → /etc/systemd/system/[email protected]
嗯,看了下文档,学习到了
全新安装 Windows 11 后 TPM 驱动提示
该设备无法启动。 (代码 10)
在驱动程序与设备间检测到协议错误。
WinServer2019可以使用,目前PVE可以无TPM虚拟Win11(Win10升级Dev频道)
如果只是简单的使用Win11,可以暂时无视TPM(微软对Win11的硬件要求也在摇摆)
这里只是借Win11引入swtpm,我也只是通过Win11了解到swtpm,如果遇到问题可以等PVE官方的支持
解决了,自己编译一份开启了 TPM 的 pve-edk2-firmware 然后装上就行了。
https://github.com/love4taylor/pve-edk2-firmware/commit/e08b156e4a538300e0a5136b5fe908c257be086a
👌🏻
今天才想起来说这事。。
建议不要放在 /var/run/qemu-server/swtpm.sock 直接放在 /var/run/ 底下。可能是因为 systemd 启动顺序的问题,PVE 重启后 socket 文件在 qemu-server 内找不到,进而导致虚拟机也起不来,但其实 swtpm 服务是正常启动了的,我改成放在 /var/run/ 里就正常了。
是的,之前重启PVE也发现了这个问题
官方已经开始支持啦。