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 整体流程一览

我把整个安装流程画了一张图,方便你对照执行。

Intel SGX SDK 安装流程 SGX SDK 安装流程 1. 下载源码 2. 安装依赖包 3. 编译 SDK 4. 安装 SDK 5. 配置环境变量 6. 验证安装 ⚠️ 常见问题 • 依赖包缺失 → 编译报错 • 环境变量未设置 → 找不到头文件 • CPU 不支持 → 运行时报错 💡 建议 • 使用 LTS 版本 • 安装前拍快照

这张图把六个步骤串起来了。你按顺序走,每一步做完检查一下,基本不会出问题。

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 都装好了,开箱即用。我现在的开发环境就是基于这个镜像,省心很多。