Proxmox VE 添加 TPM 2.0 支持

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

效果

9 thoughts on “Proxmox VE 添加 TPM 2.0 支持

  1. 其实服务可以用 @ 来做

    [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]

  2. 全新安装 Windows 11 后 TPM 驱动提示

    该设备无法启动。 (代码 10)

    在驱动程序与设备间检测到协议错误。

    1. WinServer2019可以使用,目前PVE可以无TPM虚拟Win11(Win10升级Dev频道)
      如果只是简单的使用Win11,可以暂时无视TPM(微软对Win11的硬件要求也在摇摆)
      这里只是借Win11引入swtpm,我也只是通过Win11了解到swtpm,如果遇到问题可以等PVE官方的支持

  3. 今天才想起来说这事。。
    建议不要放在 /var/run/qemu-server/swtpm.sock 直接放在 /var/run/ 底下。可能是因为 systemd 启动顺序的问题,PVE 重启后 socket 文件在 qemu-server 内找不到,进而导致虚拟机也起不来,但其实 swtpm 服务是正常启动了的,我改成放在 /var/run/ 里就正常了。

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据