3. Intel SGX SDK 安装:把环境一步步搭起来

说实话,SGX 的安装流程在 Intel 官方文档里写得挺全的,但真上手操作时,坑也不少。我最早在 Ubuntu 18.04 上折腾过一次,因为内核版本没对齐,PSW 驱动死活装不上,折腾了大半天。后来我养成了一个习惯——装之前先确认内核版本,这能省下不少时间。

这一章,我会带你走完完整的安装流程:从 Linux 环境准备,到 SDK 安装,再到 PSW/DCAP 驱动部署,最后验证安装是否成功。每一步我都会穿插一些实际项目中的经验,帮你避开那些常见的坑。

核心要点: SGX 的安装不是一次性的,它依赖内核版本、BIOS 设置、驱动版本三者对齐。任何一个环节不对,enclave 都跑不起来。

3.1 环境准备:先看看你的机器够不够格

在动手之前,先确认三件事:硬件支持、BIOS 开启、操作系统版本。

3.1.1 硬件要求

  • CPU: Intel 第 6 代酷睿(Skylake)及以上,且必须支持 SGX。我建议直接用第 8 代以上,兼容性更好。
  • BIOS: 必须开启 SGX 选项。不同厂商的 BIOS 菜单位置不一样,但关键词通常是 "SGX" 或 "Software Guard Extensions"。
  • 内存: 至少 8GB,推荐 16GB。EPC(Enclave Page Cache)大小受 BIOS 限制,通常最大 128MB 或 256MB。
注意: 有些服务器主板默认关闭 SGX,甚至 BIOS 里不显示该选项。如果你用的是云服务器,绝大多数不支持 SGX——除非你选的是 Intel 的 SGX 专用实例。

3.1.2 操作系统要求

官方支持 Ubuntu 18.04/20.04/22.04 LTS 和 RHEL 8.x。我个人习惯用 Ubuntu 20.04 LTS,因为社区活跃,遇到问题容易搜到解决方案。

确认内核版本:

uname -r

SGX 驱动对内核版本有要求。以 Ubuntu 20.04 为例,推荐内核版本为 5.4.0 或 5.11.0。如果你用的是 5.13 以上,可能需要手动编译驱动。

3.1.3 安装依赖包

先把基础工具链装好:

sudo apt update
sudo apt install -y build-essential ocaml ocamlbuild automake autoconf libtool wget python-is-python3 libssl-dev git cmake perl pkg-config

嗯,这里要注意:python-is-python3 这个包在 Ubuntu 20.04 上默认没有,但 SGX SDK 的某些脚本会调用 python 命令。如果不装这个,编译时会报错。我曾经因为这个卡了半小时,后来才发现是 Python 版本的问题。

3.2 安装 Intel SGX SDK

SDK 是开发 enclave 的基础工具包,包含编译器、链接器、库文件和调试工具。安装方式有两种:从源码编译,或者用预编译的二进制包。我推荐后者,省时省力。

3.2.1 下载 SDK 安装包

去 Intel 的 GitHub 仓库下载最新版本:

wget https://download.01.org/intel-sgx/sgx-linux/2.21.1/distro/ubuntu20.04-server/sgx_linux_x64_sdk_2.21.1.100.2.bin
chmod +x sgx_linux_x64_sdk_2.21.1.100.2.bin

版本号可能会更新,建议去 linux-sgx releases 页面确认最新版本。我写这段时用的是 2.21.1,但你可能看到更新的版本。

3.2.2 执行安装

sudo ./sgx_linux_x64_sdk_2.21.1.100.2.bin --prefix=/opt/intel/sgxsdk

安装过程中会询问安装路径,我习惯放在 /opt/intel/sgxsdk。你也可以放在用户目录下,但后续编译其他项目时,环境变量配置会麻烦一些。

安装完成后,设置环境变量:

source /opt/intel/sgxsdk/environment

建议把这行加到 ~/.bashrc 里,这样每次登录终端都能自动加载。

小技巧: 如果你同时开发多个 SGX 项目,可以用 sgx_sdk 环境变量指向不同版本的 SDK,方便切换。我一般会在项目根目录放一个 setenv.sh 脚本,里面写上 source /opt/intel/sgxsdk/environment。

3.3 安装 PSW/DCAP 驱动

PSW(Platform Software)和 DCAP(Data Center Attestation Primitives)是 SGX 的运行时组件。PSW 负责 enclave 的加载和管理,DCAP 提供远程认证能力。

这里有个关键点:PSW 和 DCAP 的版本必须与 SDK 版本匹配。否则,enclave 加载时会报 "AE service" 相关的错误。

3.3.1 安装 PSW

PSW 包含在 Intel SGX 的 RPM/DEB 仓库中。添加仓库并安装:

echo 'deb [arch=amd64] https://download.01.org/intel-sgx/sgx_repo/ubuntu focal main' | sudo tee /etc/apt/sources.list.d/intel-sgx.list
wget -qO - https://download.01.org/intel-sgx/sgx_repo/ubuntu/intel-sgx-deb.key | sudo apt-key add -
sudo apt update
sudo apt install -y libsgx-launch libsgx-urts libsgx-epid libsgx-quote-ex libsgx-dcap-ql

这些包的作用:

包名 作用
libsgx-launch enclave 启动服务
libsgx-urts 用户态运行时库
libsgx-epid EPID 认证协议支持
libsgx-quote-ex quote 生成扩展库
libsgx-dcap-ql DCAP 引用库

3.3.2 安装 DCAP 驱动

DCAP 驱动是内核模块,负责管理 EPC 内存和 enclave 的创建。安装方式:

sudo apt install -y linux-headers-$(uname -r)
wget https://download.01.org/intel-sgx/sgx-linux/2.21.1/distro/ubuntu20.04-server/sgx_linux_x64_driver_2.11.0_2d2b795.bin
chmod +x sgx_linux_x64_driver_2.11.0_2d2b795.bin
sudo ./sgx_linux_x64_driver_2.11.0_2d2b795.bin

安装完成后,检查驱动是否加载:

lsmod | grep sgx

如果看到 intel_sgx 或 sgx 模块,说明驱动加载成功。

常见问题: 如果你用的是 Ubuntu 22.04 或内核 5.15+,官方提供的预编译驱动可能不兼容。这时需要从源码编译驱动。我曾经在 Ubuntu 22.04 上试过,编译时遇到头文件缺失的问题,最后换回了 20.04。

3.4 验证安装:跑一个 Hello World

安装完成后,最好跑一个简单的 enclave 程序验证一下。SDK 自带了示例代码,我们直接用:

cd /opt/intel/sgxsdk/SampleCode/SampleEnclave
make
./app

如果输出类似下面的内容,说明安装成功:

Enclave created successfully.
Message from enclave: Hello World!
Enclave destroyed successfully.

嗯,这里要注意:如果报错 Failed to create enclave,大概率是驱动没加载,或者 BIOS 里 SGX 没开启。先检查 lsmod | grep sgx,再重启进 BIOS 确认。

3.5 知识体系总览

下面这张图总结了 SGX 安装的完整流程和组件关系:

Intel SGX 安装流程与组件关系 硬件层 Intel CPU (6代+) + BIOS 开启 SGX + 足够 EPC 内存 内核层 DCAP 驱动 (内核模块) → 管理 EPC 内存 & enclave 创建 运行时层 PSW (libsgx-urts, libsgx-launch, libsgx-epid, libsgx-quote-ex) 开发层 Intel SGX SDK (编译器、链接器、库文件、调试工具) 验证:运行 SampleEnclave → Hello World 版本必须对齐

3.6 常见问题与避坑指南

  • 驱动加载失败: 检查内核版本是否匹配。如果不匹配,从源码编译驱动。我曾经在 Ubuntu 22.04 上编译过,需要安装 linux-headers-$(uname -r) 和 dkms。
  • enclave 创建失败: 先确认 BIOS 里 SGX 是否开启。有些主板默认是 "Software Controlled",需要改成 "Enabled"。
  • AE service 错误: PSW 服务没启动。运行 systemctl start aesmd 手动启动,并设置开机自启。
  • 编译示例代码报错: 检查 SDK 环境变量是否加载。运行 echo $SGX_SDK,如果为空,重新 source 一下。
我的经验: 如果你在虚拟机里装 SGX,大概率会失败——因为 SGX 需要硬件支持,而大多数虚拟机不暴露 SGX 指令集。我建议直接用物理机,或者用 Intel 的 SGX 云实例(比如阿里云的 g7t 实例)。