【QingTian Enclave】系统时间漂移问题
问题描述
在业务稳定运行一段时间后,发现Enclave内部的系统时间出现漂移(enclave内部时间与primary VM系统时间不一致)。
问题上报
目前和QingTian Enclave开发团队沟通后,认为通过vsock通道,将Enclave的系统时间和primary VM的系统时间进行同步是一个比较可行的方案。
问题修复方案概述

在开源huawei-qingtian源码的基础上,做了以下两点修改:
- 对enclave内部的第一个进程(init)做了定制化修改,他可以fork出一个time_sync进程,作为vsock的server端,通过9000端口,监听来自primary VM的时间同步信息。
- qt-enclave常驻进程原本是被用来管理enclave的生命周期的。为了修复时间漂移问题,我们修改了这部分的源码,让他作为vsock的client端,每隔180s发送一次时间同步请求到enclave的time_sync进程,由time_sync进程完成enclave系统时间同步。
修复验证
环境部署
1、购买一台c7t实例虚机,勾选Enclave选项
目前Enclave只在上海一、新加坡、土耳其局点支持
2、下载必要外围组件 (如果您使用ubuntu镜像的话,按照[ubuntu镜像必要包安装])
(https://bbs.huaweicloud.com/blogs/451439))
yum install qingtian-tool virtio-qtbox qt-enclave-bootstrap -y
● qingtian-tools用于管理enclave生命周期
● virtio-qtbox 安装enclave相关驱动
● qt-enclave-bootstrap 包含enclave镜像文件制作的必要文件
3、配置enclave隔离资源,并进行资源隔离
vim /etc/qingtian/enclave/qt-enclave-env.conf
建议一次性隔离出较大内存资源预留给Enclave使用,避免反复隔离,造成系统内存碎片化,隔离服务重启失败
启动资源隔离服务:
systemctl start qt-enclave-env
如果出现隔离服务失败,无法申请到足够内存,可能存在内存碎片,推荐重启虚拟机,再执行隔离服务
4、安装必要python包
pip3 install docker knack
5、安装docker和git
yum install docker git -y
Note: 如果您使用ubuntu: apt-get install docker git -y
6、安装文件编译时需要的依赖包
yum install gnutls-devel cjson-devel glib2-devel -y
● gnutls-devel用于提供加密通信能力
● cjson-devel提供 JSON 解析 / 生成能力
● glib2-devel提供基础工具集(数据结构、内存 / 线程管理)
修复步骤
1.从gitee仓库下载huawei-qingtian-enclave代码
cd /home git clone https://gitee.com/HuaweiCloudDeveloper/huawei-qingtian.git
本实例用于实践修复时间漂移现象,请切到dev分支
cd /home/huawei-qingtian git checkout dev
参考该提交:https://gitee.com/HuaweiCloudDeveloper/huawei-qingtian/pulls/27
2.编译并替换init文件
cd /home/huawei-qingtian/enclave/init
执行编译命令
make
替换原有的init文件
cp -rf init /usr/local/share/qingtian/enclave/init
3.编译并替换qingtian-tool相关的二进制文件
本因为使用Git命令下载大文件时会出现下载不完整的现象,需要手动下载并替换相关文件
cd /home/huawei-qingtian/qingtian-tools/platform/linuxkit/
删除此文件下所有文件
rm -rf ./*
使用wget命令下载对应文件linuxkit-linux-amd64
wget https://gitee.com/HuaweiCloudDeveloper/huawei-qingtian/raw/dev/qingtian-tools/platform/linuxkit/linuxkit-linux-amd64?lfs=1
下载文件名字为linuxkit-linux-amd64?lfs=1,需要对其进行改名操作
mv linuxkit-linux-amd64\?lfs\=1 linuxkit-linux-amd64
编译并替换qingtian-tool相关文件
cd /home/huawei-qingtian/qingtian-tools
make
make install
如果认为180s时间不合适,可以修改qingtian-tools/include/enclave.h文件中的INTERVAL数值
修复验证
测试镜像制作
cd /home/huawei-qingtian/enclave/qtsm-sdk-c/tests/vsock_shell
1、编写一个调测DockerfileTest
FROM ubuntu:22.04 AS base-img
# COPY debug tool source code
COPY ./vsock_shell.c /root/vsock_shell.c
RUN apt-get update -y && \
apt-get install gcc -y
RUN cd /root && \
gcc vsock_shell.c -o directShell && \
chmod 777 /root/directShell
# COPY your enclave app
# eg. hello_world.sh
#COPY ./hello_world.sh /root/
RUN echo "#!/bin/bash" >> hello_world.sh && \
echo "echo hello" >> hello_world.sh
# Let launch the debug tool firstly
CMD ["/root/directShell"]
该directShell默认监听9999端口;
2、生成docker image并转换为Enclave的镜像
docker build -f DockerfileTest -t test .
qt enclave make-img --docker-uri test --eif test.eif
使用nc-vsock调试
1、获取并编译vsock_client
cd /home
git clone https://github.com/stefanha/nc-vsock.git
cd /home/nc-vsock && make
2、启动Enclave,并使用vsock_client登录
启动Enclave
qt enclave start --cpus 2 --mem 8192 --eif test.eif --cid 4
使用vsock_client登录
/home/nc-vsock/nc-vsock 4 9999
3、调试修正时间漂移
查看Enclave内当前时间
date
修改时间
date -s 2027-01-01
过一段时间后重新执行,查看时间是否修正(代码中规定时间为180秒)
date
观察到时间修正,调试成功
这里的4 和Enclave 的Cid一致
这种方式仅仅推荐使用在调测阶段,不要在生产环境中使用
- 点赞
- 收藏
- 关注作者
评论(0)