BIOS 禁用了 SGX,无法启动,如何解决 BIOS 无法打开 SGX 的问题?
1.准备工作
1.1 查看硬件SGX支持
首先应该确认计算机CPU是否支持SGX,此处有两种方法:
- https://ark.intel.com/content/www/us/en/ark.html#@PanelLabel12213 为Intel提供硬件信息的官方网址,输入电脑CPU型号,查看是否有SGX支持。
- 根据https://github.com/ayeks/SGX-hardware/blob/master/test-sgx.c,在Linux或者Windows环境下,编译该代码,查看运行结果。本计算机的运行结果如下图所示:
可见,本计算机支持SGX的硬件数为1,即为支持。
本次实验采用的硬件平台为Intel® Core™ i7-9700K,为Intel i7第9代Products formerly Coffee Lake 系列CPU,https://ark.intel.com/content/www/us/en/ark/products/186604/intel-core-i7-9700k-processor-12m-cache-up-to-4-90-ghz.html,14纳米制程,8核8线程,标准频率为3.60 GHz。具体信息如下图所示。
该处理器支持SGX,如下图所示。
对于支持SGX的计算机,也需要在BIOS里开启SGX选项。开机按F2键进入BIOS界面,开启SGX选项。
查看系统信息
lsb_release -a
实验的软件平台为Ubuntu18.04.2 LTS,信息如下图所示:
根据硬件是否支持SGX:
- 不支持,则仅安装SDK,在编译代码时,make SGX_MODE=SIM,即在模拟模式下运行,。
- 如支持,则需要首先安装一些支持库,然后按顺序安装SGX driver,PSW和SDK,https://github.com/intel/linux-sgx。
1.2 下载安装包
根据硬件和软件环境,这里选择Intel SGX Linux 2.3.1 Release for Ubuntu18.04版本,下载网址为https://download.01.org/intel-sgx/linux-2.3.1/ubuntu18.04/,界面如下图所示。
其中的libsgx-enclave-common_2.3.101.46683-1_amd64.deb对应SGX PSW,sgx_linux_x64_driver_4d69b9c.bin对应SGX driver,sgx_linux_x64_sdk_2.3.101.46683.bin对应SDK。下载这三个文件即可。
注意:较高版本的PSW改为libsgx-enclave-common__amd64.deb文件
1.3 安装工具
1.3.1 安装工具库
在Ubuntu18.04下,输入以下命令。
sudo apt-get install libssl-dev libcurl4-openssl-dev libprotobuf-dev
sudo apt-get install build-essential
sudo apt-get install uuid-dev libxml2-dev cmake libsystemd-dev
1.3.2 安装alien
sudo apt-get install alien
1.3.3 下载并安装Intel® Capability Licensing Service(iclsClient):
下载网址为http://registrationcenter-download.intel.com/akdlm/irc_nas/11414/iclsClient-1.45.449.12-1.x86_64.rpm,进入下载文件夹,编译 iclsClient:
sudo alien --scripts iclsClient-1.45.449.12-1.x86_64.rpm
会在文件夹中生成同名的deb文件,然后安装iclsClient:
sudo dpkg -i iclsclient_1.45.449.12-2_amd64.deb
iclsClient会安装在 /opt/intel/ 目录下生成的iclsClient文件夹。
1.3.4 安装JHI服务:
从https://github.com/intel/dynamic-application-loader-host-interface中下载dynamic-application-loader-host-interface源码,解压后进入路径,使用以下命令编译并安装JHI服务。
cmake .;make;sudo make install;sudo systemctl enable jhi
2 安装SGX
这里参考了,。
2.1 安装SGX驱动
由于下载的.bin文件没有被执行的权限,使用以下命令修改权限。
chmod 777 sgx_linux_x64_driver_4d69b9c.bin
运行该.bin文件
sudo ./sgx_linux_x64_driver_4d69b9c.bin
SGX驱动会将其设置为开机启动,并在 /opt/intel/sgxdriver 目录下生成uninstall.sh脚本。为确保驱动已经成功安装,可输入以下命令
ls /dev/isgx >/dev/null 2>1 && echo "SGX Driver installed" || echo "SGX Driver NOT installed"
打印SGX Driver installed
即为安装成功。
2.2 安装SGX PSW
在当前路径下,使用以下命令安装
sudo dpkg -i libsgx-enclave-common_2.3.101.46683-1_amd64.deb
PSW的库文件默认安装在了 /usr/lib/x86_64-linux-gnu文件夹下,AESM服务以及相关的库安装在了 /opt/intel/libsgx-enclave-common文件夹下。
2.3 安装SGX SDK
为下载得到的SDK文件添加可执行权限:
chmod 777 sgx_linux_x64_sdk_2.3.101.46683.bin
使用以下命令安装SGX SDK:
sudo ./sgx_linux_x64_sdk_2.3.101.46683.bin
安装过程中会询问安装的路径,可以输入yes安装到当前文件夹,也可以输入no选择自己想安装到的文件夹。这里选择yes,将SGX SDK安装到 /opt/intel/sgxsdk 文件夹下。如果选择no,则需要手动输入自定义的路径。
2.4 修改环境变量
如果SDK安装在了自定义的路径下,由于Makefile默认的SDK路径是在opt/intel/sgxsdk,所以在编译代码时,Makefile里的SDK路径要修改为安装的路径。
安装完成时,编译代码报错
Please use the correct uRTS library from PSW package.
Error: Unexpected error occurred.
这里参考https://github.com/intel/linux-sgx/issues/47,编译时没有使用正确的PSW提供的libsgx_urts.so文件,这个文件应该不是opt/intel/sgxsdk里的那个同名文件,而应该是PSW提供的。所以要添加这个库所在的路径:/usr/lib/x86_64-linux-gnu。使用以下命令打开bashrc文件。
sudo gedit ~/.bashrc
在文件末尾添加以下代码。
export LD_LIBRARY_PATH=/usr/lib/x86_64-linux-gnu:$LD_LIBRARY_PATH
重启终端,运行以下命令,确定环境变量添加成功。
echo $LD_LIBRARY_PATH
在模拟模式下编译,可能会出现以下错误。
libsgx_urts_sim.so:cannot open sharedobject file: No such file or directory
这也是库文件路径的问题,因为处于模拟模式,所以只需要添加SDK下的库文件路径即可。这里,该文件在opt/intel/sgxsdk/lib64下,所以在bashrc文件里添加以下语句即可。
export LD_LIBRARY_PATH= opt/intel/sgxsdk/lib64:$LD_LIBRARY_PATH
由于 opt/intel/sgxsdk 下的文件不可修改,所以这里可以将sgxsdk文件夹复制到其它路径下,进行代码的编辑与测试。
2.5 环境测试
进入到sgxsdk路径下的SampleCode文件夹下,以SampleEnclave项目为例,
cd SampleEnclave
make
编译过程会生成app可执行文件
./app
程序运行结果如下图,表明环境安装成功。
关于SGX程序的编写,请参考我的另一篇文章:Intel SGX程序编写
3 环境卸载
按照SGX driver、PSW、SDK的顺序卸载。
3.1 SGX driver卸载
安装之后在 /opt/intel/sgxdriver 路径下回生成uninstall.sh文件,运行该文件即可卸载驱动。
3.2 卸载PSW
之前安装的是libsgx-enclave-common_2.3.101.46683-1_amd64.deb,这里使用以下命令卸载
sudo dpkg -P libsgx-enclave-common
3.3 卸载SDK
在安装SDK的路径下,会生成对应的uninstall.sh,运行该文件即可卸载SDK。
参考资料:
- https://ark.intel.com/content/www/us/en/ark.html#@PanelLabel122139
- https://github.com/ayeks/SGX-hardware/blob/master/test-sgx.c
- https://ark.intel.com/content/www/us/en/ark/products/186604/intel-core-i7-9700k-processor-12m-cache-up-to-4-90-ghz.html
- https://github.com/intel/linux-sgx
- https://download.01.org/intel-sgx/linux-2.3.1/ubuntu18.04/
- http://registrationcenter-download.intel.com/akdlm/irc_nas/11414/iclsClient-1.45.449.12-1.x86_64.rpm
- https://github.com/intel/dynamic-application-loader-host-interface
- https://github.com/intel/linux-sgx/issues/47
- https://download.01.org/intel-sgx/linux-2.3.1/docs/Intel_SGX_Installation_Guide_Linux_2.3.1_Open_Source.pdf