Intel Trust Domain Extensions(Intel TDX)是一项机密计算技术。它部署称为信任域(Trust Domain,TD)的硬件隔离虚拟机,将其与虚拟机管理器(VMM)、Hypervisor 以及宿主平台上的其他非 TD 软件隔离,从而抵御广泛的软件攻击。这增强了平台用户对数据安全与知识产权保护的控制,也让云服务提供商能够提供托管服务,而不必将租户数据暴露给攻击者。
Ubuntu 同时支持 Intel TDX 宿主机与客户机。客户机支持从 Ubuntu 24.04 LTS 开始,宿主机支持从 Ubuntu 25.10 开始。
支持的硬件
以下 Intel Xeon 处理器支持 Intel TDX:
| 处理器 | 代号 | TDX 模块版本 |
|---|---|---|
| 第四代 Intel Xeon 可扩展处理器,部分支持 Intel TDX 的 SKU | Sapphire Rapids | 1.5.x |
| 第五代 Intel Xeon 可扩展处理器 | Emerald Rapids | 1.5.x |
| 采用 E-Core 的 Intel Xeon 6 | Sierra Forest | 1.5.x |
| 采用 P-Core 的 Intel Xeon 6 | Granite Rapids | 2.0.x |
配置宿主机
要在宿主机启用 Intel TDX,需要同时配置 BIOS 和宿主操作系统。首先,在 BIOS 中启用相关设置。
注意:以下仅为 BIOS 配置示例。不同平台所需菜单和设置可能不同,具体操作请咨询 OEM、ODM 或独立 BIOS 厂商。
进入“Socket Configuration → Processor Configuration → TME, TME-MT, TDX”,配置:
- Memory Encryption(TME):Enable。
- Total Memory Encryption Bypass:Enable。这是可选项,有助于获得最佳宿主系统和普通虚拟机性能。
- Total Memory Encryption Multi-Tenant(TME-MT):Enable。
- TME-MT memory integrity:Disable。
- Trust Domain Extension(TDX):Enable。
- TDX Secure Arbitration Mode Loader(SEAM Loader):Enable,允许从 ESP 或 BIOS 加载 Intel TDX Loader 和 Intel TDX Module。
- TME-MT/TDX key split:设置为非零值。
进入“Socket Configuration → Processor Configuration → Software Guard Extension(SGX)”,将“SW Guard Extensions(SGX)”设为 Enable。保存 BIOS 设置并重启。
接着,在 /etc/default/grub 的 GRUB_CMDLINE_LINUX_DEFAULT 中添加内核参数 nohibernate kvm_intel.tdx=1,运行 sudo update-grub,然后再次重启。
重启后,确认参数已经应用:
cat /proc/cmdline
BOOT_IMAGE=/boot/vmlinuz-6.19.0-3-generic root=UUID=f6ce4201-d6d1-4505-bdf5-019ee4fe842e ro nohibernate kvm_intel.tdx=1
然后确认 Intel TDX 已启用:
sudo dmesg | grep -i tdx
[ 1.824045] virt/tdx: BIOS enabled: private KeyID range [32, 64)
[ 1.824049] virt/tdx: Disable ACPI S3. Turn off Intel TDX in the BIOS to use ACPI S3.
[ 24.195089] virt/tdx: 1050644 KB allocated for PAMT
[ 24.195098] virt/tdx: module initialized
virt/tdx: module initialized 表示 TDX 模块确实已经初始化。
安装虚拟化组件
接下来安装运行 TD 所需的虚拟化组件:
sudo apt update
sudo apt install \
> qemu-system-x86 \
> ovmf-inteltdx \
> libvirt-daemon-system \
> libvirt-clients
这些软件包分别是:
qemu-system-x86:支持 Intel TDX 的 x86_64 QEMU 模拟器。ovmf-inteltdx:包含支持 Intel TDX 的 OVMF 构建的 EDK II UEFI 固件。libvirt-daemon-system:用于管理虚拟机的 libvirt 守护进程。libvirt-clients:virsh 等 libvirt 命令行工具。
安装后,确认支持 Intel TDX 的 OVMF 固件存在:
ls -l /usr/share/ovmf/OVMF.inteltdx.ms.fd
-rw-r--r-- 1 root root 4194304 Jan 15 12:00 /usr/share/ovmf/OVMF.inteltdx.ms.fd
创建客户机镜像
下载云镜像,本例使用 Ubuntu 26.04 LTS:
wget https://cloud-images.ubuntu.com/resolute/current/resolute-server-cloudimg-amd64.img
安装所需工具:
sudo apt install cloud-image-utils
创建 cloud-init 配置文件:
cat > user-data.yaml << 'EOF'
> #cloud-config
> chpasswd:
> list: |
> root:root
> expire: False
> ssh_pwauth: True
> disable_root: false
> EOF
使用该文件生成 cloud-init ISO:
cloud-localds user-data.img user-data.yaml
生成的 user-data.img 将挂载到虚拟机,用于应用配置。
注意:生产环境必须使用强密码,并配置基于 SSH 密钥的身份验证,不要使用密码身份验证。
使用 QEMU 启动 TD 客户机
准备好镜像后,可以通过 QEMU 启动 TD:
qemu-system-x86_64 \
> -accel kvm \
> -smp 32 \
> -m 16G \
> -cpu host \
> -object '{"qom-type":"tdx-guest","id":"tdx","quote-generation-socket":{"type": "vsock", "cid":"2","port":"4050"}}' \
> -object memory-backend-ram,id=mem0,size=16G \
> -machine q35,kernel_irqchip=split,confidential-guest-support=tdx,memory-backend=mem0 \
> -bios /usr/share/ovmf/OVMF.inteltdx.ms.fd \
> -nographic \
> -nodefaults \
> -vga none \
> -drive file=resolute-server-cloudimg-amd64.img,if=none,id=virtio-disk0 \
> -device virtio-blk-pci,drive=virtio-disk0 \
> -drive file=user-data.img,if=none,id=cloud-init,format=raw \
> -device virtio-blk-pci,drive=cloud-init \
> -serial stdio
关键的 Intel TDX 参数包括:
-object '{"qom-type":"tdx-guest","id":"tdx",...}':创建 TDX 客户机对象,启用机密计算能力。quote-generation-socket配置生成远程证明报告的 vsock 通道,CID 为2,端口为4050。-machine q35,kernel_irqchip=split,confidential-guest-support=tdx,memory-backend=mem0:其中kernel_irqchip=split用于正确隔离宿主机与客户机的中断处理;confidential-guest-support=tdx将机器关联到 TDX 对象;memory-backend=mem0关联受 TDX 保护的内存后端。-object memory-backend-ram,id=mem0,size=16G:定义将由 Intel TDX 加密的内存后端。-bios /usr/share/ovmf/OVMF.inteltdx.ms.fd:指定支持 TDX 且带 Microsoft Secure Boot 密钥的 UEFI 固件。-cpu host:使用宿主 CPU 模型,向客户机暴露 Intel TDX 能力。
这些参数的进一步说明见 QEMU 文档。
在客户机内确认 Intel TDX 已启用
TD 启动后,检查内核日志:
sudo dmesg | grep tdx
[ 0.000000] tdx: Guest detected
[ 11.162378] systemd[1]: Detected confidential virtualization tdx.
也可以查看 Intel TDX 客户机设备:
ls -l /dev/tdx_guest
crw------- 1 root root 10, 125 Jan 1 00:00 /dev/tdx_guest
使用 libvirt 启动 TDX 虚拟机
libvirt 可以管理 Intel TDX 虚拟机。需要修改域定义,加入机密虚拟机所需的信息。下面是一个域定义示例:
cat > tdx-vm.xml << 'EOF'
> <domain type='kvm' xmlns:qemu='http://libvirt.org/schemas/domain/qemu/1.0'>
> <name>tdx-guest</name>
> <memory unit='GiB'>16</memory>
> <memoryBacking>
> <source type="anonymous"/>
> <access mode="private"/>
> </memoryBacking>
> <vcpu placement="static">16</vcpu>
> <os>
> <type arch='x86_64' machine='q35'>hvm</type>
> <loader type='rom' readonly='yes'>/usr/share/ovmf/OVMF.inteltdx.ms.fd</loader>
> <boot dev='hd'/>
> </os>
> <features>
> <acpi/>
> <apic/>
> <ioapic driver='qemu'/>
> </features>
> <clock offset='utc'>
> <timer name='hpet' present='no'/>
> </clock>
> <cpu mode='host-passthrough'>
> <topology sockets='1' cores='16' threads='1'/>
> </cpu>
> <devices>
> <emulator>/usr/bin/qemu-system-x86_64</emulator>
> <disk type="file" device="disk">
> <driver name="qemu" type="qcow2"/>
> <source file="/var/lib/libvirt/images/resolute-server-cloudimg-amd64.img"/>
> <target dev="vda" bus="virtio"/>
> </disk>
> <console type='pty'>
> <target type='virtio' port='1'/>
> </console>
> </devices>
> <launchSecurity type='tdx'>
> <policy>0x10000000</policy>
> <quoteGenerationService>
> <SocketAddress type='vsock' cid='2' port='4050'/>
> </quoteGenerationService>
> </launchSecurity>
> </domain>
> EOF
定义虚拟机:
sudo virsh define tdx-vm.xml
启动虚拟机:
sudo virsh start tdx-guest
连接控制台:
sudo virsh console tdx-guest
原文列出的关键 libvirt 配置项如下:
<launchSecurity type='tdx'>:为虚拟机启用 TDX 机密计算。<policy>0x10000001</policy>:控制调试和其他 TD 特性的 TDX 策略。<quote-generation-service>:配置远程证明的 vsock 通道。<memoryBacking>:原文说明其使用 TDX 所需的 memfd 后端共享内存。<loader>:指定支持 TDX 的 OVMF 固件。
管理虚拟机
列出全部虚拟机:
sudo virsh list --all
关闭虚拟机:
sudo virsh shutdown tdx-guest
强制停止虚拟机:
sudo virsh destroy tdx-guest
删除虚拟机定义:
sudo virsh undefine tdx-guest
Intel TDX 故障排查
宿主机没有启用 Intel TDX
确认 BIOS 设置正确,内核参数已经启用,然后检查以下 MSR。
安装 MSR 工具包:
sudo apt install msr-tools
检查 MSR 0x982 的第 1 位,确认多密钥全内存加密(MK-TME)已启用:
sudo rdmsr 0x982 -f 1:1 1
预期值 1 表示 BIOS 已启用 MK-TME。
检查 MSR 0x1401 第 11 位,即 SEAMRR(SEAM 范围寄存器)的启用位,确认 TDX 支持:
sudo rdmsr 0x1401 -f 11:11 1
预期值 1 表示 SEAMRR 已启用。
检查 IA32_TME_CAPABILITY MSR 的第 63:32 位,确认分配给 TD 的私有密钥数量:
echo $((0x$(sudo rdmsr 0x87 -f 63:32)))
输出以十进制显示可供信任域使用的私有密钥数量 NUM_TDX_PRIV_KEYS。非零表示已经为 Intel TDX 分配密钥。
原文再次列出了同一项检查:
echo $((0x$(sudo rdmsr 0x87 -f 63:32)))
同样,非零的十进制结果表示已为信任域分配私有密钥。
检查 Intel SGX 与 MCHECK 状态:
sudo rdmsr 0xa0
预期值 1 表示已启用。值为 1861 时,SGX 注册 UEFI 变量可能损坏。进入 BIOS,将“SGX Factory Reset”设为 Enable,这会产生两个新密钥。
dmesg 报告 module initialization failed (-5)
如果 sudo dmesg | grep -i tdx 显示 virt/tdx: module initialization failed (-5),可能使用了旧的、不受支持的 Intel TDX 模块。尝试更新到最新模块。
注意:如果选择通过二进制部署更新 Intel TDX Module,必须使用与硬件相匹配的模块版本,参见前面的硬件支持表。
重启 TD 时却关机了
传统的非 TDX 客户机可以通过重置 vCPU 上下文重启,但 TD 客户机出于安全原因不允许这样做。必须先关闭,再重新启动。
原文:Confidential Computing with Intel Trust Domain Extensions (TDX)。作者/维护者:Canonical Ubuntu Server 文档贡献者。本文为原文的中文译文;代码保留原文内容。











暂无评论内容