4. Intel SGX SDK 安装:从下载到验证的全流程
SGX SDK 的安装,说难不难,说简单也容易踩坑。我前后在十几台机器上装过 SGX SDK,从 Ubuntu 16.04 到 22.04,从裸机到 Docker 容器,踩过的坑能写满一页纸。今天我把最稳的流程拆开讲,你照着做,基本一次过。
核心原则:SGX SDK 对系统环境非常敏感。内核版本、GCC 版本、libc 版本,差一点就可能编译失败。我建议你装之前先拍个快照,或者用容器环境,方便回滚。
4.1 下载 SGX SDK
Intel 官方把 SGX SDK 放在 GitHub 上,项目名叫 linux-sgx。别去官网乱翻,直接去 GitHub 拉代码就行。
# 克隆仓库,建议指定版本号,别用 master
git clone https://github.com/intel/linux-sgx.git
cd linux-sgx
git checkout sgx_2.21 # 我习惯用 LTS 版本
为什么要指定版本?我曾经用 master 分支装过一次,结果第二天 SDK 更新了,依赖包版本对不上,折腾了两小时。嗯,从那以后我只用 tag 版本。
小技巧:如果你在中国大陆,GitHub 下载慢,可以用代理或者提前下载好压缩包。SDK 源码大概 200MB 左右,不算大。
4.2 安装依赖包
这是最容易出问题的一步。依赖包缺一个,编译就报错。我整理了一份清单,你直接复制粘贴执行。
# Ubuntu 20.04 / 22.04 通用
sudo apt-get update
sudo apt-get install -y \
build-essential \
ocaml \
ocamlbuild \
automake \
autoconf \
libtool \
wget \
python3 \
python3-pip \
libssl-dev \
libcurl4-openssl-dev \
protobuf-compiler \
libprotobuf-dev \
alien \
libxml2-dev \
libxslt1-dev \
uuid-dev \
libboost-all-dev \
liblog4cpp5-dev \
libjsoncpp-dev \
libcrypto++-dev \
libsqlite3-dev \
pkg-config
你可能会问:怎么这么多包?因为 SGX SDK 内部依赖了 Intel 的多个子项目,比如 IPP、TinyCrypt、Protobuf 等。少一个,编译脚本就会在某个角落报错。
注意:如果你用的是 Ubuntu 18.04,需要额外装 libjsoncpp1 而不是 libjsoncpp-dev。我当年在 CI 环境里踩过这个坑,编译到 90% 突然报错,查了半天才发现是版本问题。
4.3 编译安装 SDK
依赖装好之后,就可以编译了。Intel 提供了自动编译脚本,但我不建议直接跑 make,因为默认会编译所有组件,包括 PSW、SDK、工具链,耗时很长。
我个人习惯分步编译,先编译 SDK 核心,再编译工具链。
# 进入源码目录
cd linux-sgx
# 下载预编译的二进制依赖(Intel 提供的 IPP、TinyCrypt 等)
make preparation
# 只编译 SDK 部分,不编译 PSW
make sdk
# 编译安装工具链(包括 sgx_sign、sgx_edger8r 等)
make sdk_install_pkg
# 安装到系统目录
sudo ./linux/installer/bin/sgx_linux_x64_sdk_*.bin --prefix=/opt/intel/sgxsdk
这里有个细节:make preparation 会下载一些预编译的 .deb 包,如果你网络不好,可能会超时。我建议提前把 downloads 目录下的 URL 提取出来,用迅雷或者 axel 多线程下载。
安装路径建议:我习惯装到 /opt/intel/sgxsdk,而不是默认的 /opt/intel。这样方便多版本共存。你可以在 --prefix 参数里指定。
4.4 配置环境变量
安装完成后,需要设置环境变量。SDK 自带了一个脚本,直接 source 就行。
# 添加到 ~/.bashrc 或 ~/.zshrc
source /opt/intel/sgxsdk/environment
# 验证环境变量
echo $SGX_SDK
# 应该输出 /opt/intel/sgxsdk
为什么一定要 source?因为 SDK 的编译工具链依赖 SGX_SDK 这个环境变量来找头文件和库文件。不设置的话,编译你的第一个 Enclave 程序就会报错。
小技巧:我习惯在 ~/.bashrc 里加一行判断,只有 SDK 目录存在时才 source,避免在没装 SDK 的机器上报错。
if [ -d /opt/intel/sgxsdk ]; then
source /opt/intel/sgxsdk/environment
fi
4.5 验证安装是否成功
装完别急着走,先跑几个验证命令,确保 SDK 能用。
4.5.1 检查工具链
# 检查签名工具
sgx_sign --help
# 应该输出帮助信息
# 检查边缘路由器(用于生成 Enclave 代理代码)
sgx_edger8r --help
# 同样输出帮助信息
4.5.2 编译示例程序
SDK 自带了一些示例,在 SampleCode 目录下。我建议编译 SampleEnclave,它是最简单的入门示例。
# 进入示例目录
cd /opt/intel/sgxsdk/SampleCode/SampleEnclave
# 编译
make
# 运行
./app
# 应该输出 "Hello World" 相关的信息
如果编译失败,别慌。90% 的情况是依赖包没装全,或者 GCC 版本不对。我整理了一个常见问题表。
| 错误信息 | 原因 | 解决方案 |
|---|---|---|
fatal error: sgx.h: No such file or directory |
环境变量未设置 | 重新 source environment 脚本 |
undefined reference to sgx_create_enclave |
未链接 SGX 库 | 检查 Makefile 中的 -lsgx_urts 链接参数 |
libsgx_urts.so: cannot open shared object file |
LD_LIBRARY_PATH 未设置 | export LD_LIBRARY_PATH=$SGX_SDK/lib64 |
Error: Invalid CPU configuration |
CPU 不支持 SGX 或 BIOS 未开启 | 检查 cpuid 输出,进 BIOS 开启 SGX |
4.5.3 验证 SGX 驱动
如果你装了 SGX 驱动,还可以验证驱动是否正常工作。
# 检查 SGX 设备节点
ls -l /dev/sgx_enclave /dev/sgx_provision
# 应该显示两个设备文件
# 检查内核模块
lsmod | grep sgx
# 应该显示 sgx 相关模块
重要提醒:如果你在虚拟机里装 SGX SDK,记得先确认 CPU 是否支持 SGX。大部分云服务器不支持 SGX,只有 Intel ICX 系列或阿里云 g7t 等特定实例才支持。我见过有人花了两天时间在普通云服务器上折腾 SGX,最后发现根本不支持。
4.6 整体流程一览
我把整个安装流程画了一张图,方便你对照执行。
这张图把六个步骤串起来了。你按顺序走,每一步做完检查一下,基本不会出问题。
4.7 我踩过的坑
最后分享几个真实案例,你遇到了可以直接抄答案。
- 坑一:GCC 版本不兼容。Ubuntu 22.04 默认 GCC 11,但 SGX SDK 2.18 之前版本只支持 GCC 9 以下。我当时的解决方案是装 GCC 9 并设置优先级。
- 坑二:Python 版本问题。SDK 的编译脚本依赖 Python 3,但有些旧版本脚本写死了
python命令。我习惯建一个软链接:sudo ln -s /usr/bin/python3 /usr/bin/python。 - 坑三:磁盘空间不足。编译过程中会生成大量中间文件,大概需要 5GB 空间。我有一台 20GB 的云服务器,编译到一半报错磁盘满,后来清理了
/tmp才解决。
终极建议:如果你只是想快速体验 SGX 开发,不想折腾编译环境,可以直接用 Intel 提供的 Docker 镜像。运行 docker pull intel/sgx-sdk,里面 SDK 和 PSW 都装好了,开箱即用。我现在的开发环境就是基于这个镜像,省心很多。