1. 创建一个临时的目录,用于存储 TPM 的状态信息。
mkdir /tmp/mytpm
2. 确保主机上安装了swtpm 软件包:
$ rpm -qa | grep tpm
tpm2-tools-5.5-3.fc38.x86_64
tpm2-tss-4.0.1-3.fc38.x86_64
libtpms-0.9.6-2.fc38.x86_64
swtpm-libs-0.8.1-1.fc38.x86_64
swtpm-0.8.1-1.fc38.x86_64
swtpm-selinux-0.8.1-1.fc38.noarch
swtpm-tools-0.8.1-1.fc38.x86_64
3. 调用swtpm_setup 工具来配置软件 TPM
/usr/bin/swtpm_setup --tpm2 --tpmstate /tmp/mytpm --create-ek-cert --create-platform-cert --overwrite
具体选项的含义如下:
- –tpm2: 指定创建一个 TPM 2.0 实例。
- –tpmstate /tmp/mytpm: 指定 TPM 状态信息的存储路径为 /tmp/mytpm。
- –create-ek-cert: 创建一个 Endorsement Key (EK) 的证书。
- –create-platform-cert: 创建一个平台证书。
- –overwrite: 如果已经存在相同名称的 TPM 状态目录,则覆盖它。
4. 利用如下命令启动一个软件 TPM 模拟器:
/usr/bin/swtpm socket --daemon --ctrl type=unixio,path=/tmp/guest-swtpm.sock,mode=0600 --tpmstate dir=/tmp/mytpm,mode=0600 --tpm2
解释一下参数的含义:
- socket --daemon: 启动一个 TPM 模拟器,并将其作为守护进程运行。
- –ctrl type=unixio,path=/tmp/guest-swtpm.sock,mode=0600: 指定控制连接的类型为 UNIX 域套接字,并设置路径为 /tmp/guest-swtpm.sock,权限为 0600。
- –tpmstate dir=/tmp/mytpm,mode=0600: 指定 TPM 状态目录的位置为 /tmp/mytpm,权限为 0600。
- –tpm2: 指定要使用 TPM 2.0。
5. 在启虚拟机的qemu命令行中加入如下命令,将模拟好的tpm设备添加到目标虚拟机上:
-chardev socket,id=char_vtpm_tpm0,path=/tmp/guest-swtpm.sock \ -tpmdev emulator,chardev=char_vtpm_tpm0,id=emulator_vtpm_tpm0 \ -device tpm-crb,id=tpm-crb_vtpm_tpm0,tpmdev=emulator_vtpm_tpm0 \
解释一下具体含义:
- -chardev socket,id=char_vtpm_tpm0,path=/tmp/guest-swtpm.sock: 这一行设置了一个字符设备,连接到指定路径的 UNIX 域套接字。
- -tpmdev emulator,chardev=char_vtpm_tpm0,id=emulator_vtpm_tpm0: 这一行创建了一个 TPM 设备,连接到之前设置的字符设备。
- -device tpm-crb,id=tpm-crb_vtpm_tpm0,tpmdev=emulator_vtpm_tpm0: 最后一行指定了一个 TPM-CRB 设备,并将之前创建的 TPM 设备连接到它。