# QingTian Enclave系统时间校准最佳实践
#### 操作场景
业务稳定运行一段时间后，在QingTian Enclave系统内部出现时间漂移问题，即QingTian Enclave内部时间与Primary VM系统时间不一致。
本文介绍如何通过Vsock通道，将QingTian Enclave的系统时间与Primary VM的系统时间进行同步，实现QingTian Enclave系统时间校准。
#### 背景知识
图1时间校准方案   
![](https://support.huaweicloud.com/usermanual-ecs/zh-cn_image_0000002512270500.png "点击放大")
本方案实现方式：
1. 定制化修改QingTian Enclave内部的第一个进程init，使之fork出一个time_sync进程，作为Vsock的服务器端（server），通过9000端口，监听来自Primary VM的时间同步信息。
2. 修改qt-enclave常驻进程源码，作为Vsock的客户端（client），每隔180s发送一次时间同步请求到QingTian Enclave的time_sync进程，由time_sync进程完成enclave系统时间同步。
 
#### 操作步骤
1. 环境部署。 
   1. 购买一台C7t规格的ECS，在购买时设置"可信系统"并勾选"Enclave"。
   
   2. 执行以下命令，下载必要外围组件。
      ```
      yum install qingtian-tool virtio-qtbox qt-enclave-bootstrap -y
      ```
      如果ECS使用Ubuntu操作系统，请参考[快速入门](https://support.huaweicloud.com/usermanual-ecs/ecs_03_1404.html)进行必要包安装。
      - qingtian-tools：用于管理QingTian Enclave生命周期
      
      - virtio-qtbox：安装QingTian Enclave相关驱动
      
      - qt-enclave-bootstrap：包含QingTian Enclave镜像文件制作的必要文件
       
   
   3. 执行以下命令，配置QingTian Enclave隔离资源，并进行资源隔离。
      ```
      vim /etc/qingtian/enclave/qt-enclave-env.conf
      ```
      建议一次性隔离出较大内存资源预留给QingTian Enclave使用，避免反复隔离，造成系统内存碎片化，隔离服务重启失败。
      
   
   4. 执行以下命令，启动资源隔离服务。
      ```
      systemctl start qt-enclave-env
      ```
      如果出现隔离服务失败，无法申请到足够内存，可能存在内存碎片，推荐重启虚拟机，再执行隔离服务。
      
   
   5. 执行以下命令，安装必要python包。
      ```
      pip3 install docker knack
      ```
      
   
   6. 执行以下命令，安装docker和git。
      ```
      yum install docker git -y
      ```
      如果ECS使用Ubuntu操作系统，请执行命令：
      ```
      apt-get install docker git -y
      ```
      
   
   7. 执行以下命令，安装文件编译时需要的依赖包。
      ```
      yum install gnutls-devel cjson-devel glib2-devel -y
      ```
      - gnutls-devel：用于提供加密通信能力
      
      - cjson-devel：提供JSON解析/生成能力
      
      - glib2-devel：提供基础工具集，包含数据结构、内存/线程管理
       
   
   
   
   
2. 修复步骤。 
   1. 执行以下命令，从gitee仓库下载huawei-qingtian-enclave代码。
      ```
      cd /home git clone https://gitee.com/HuaweiCloudDeveloper/huawei-qingtian.git
      ```
      
   
   2. 本示例用于修复时间漂移问题，执行以下命令，切到dev分支。
      ```
      cd /home/huawei-qingtian 
      git checkout dev
      ```
      
   
   3. 执行以下命令，编译并替换原有的init文件。
      ```
      cd /home/huawei-qingtian/enclave/init
      make
      cp -rf init /usr/local/share/qingtian/enclave/init
      ```
      
   
   4. 执行以下命令，编译并替换qingtian-tools相关的二进制文件。 由于使用Git命令下载大文件时可能会出现下载不完整的现象，需要手动下载并替换相关文件。
      ```
      cd /home/huawei-qingtian/qingtian-tools/platform/linuxkit/
      ```
      
   
   5. 执行以下命令，删除此文件下所有文件。
      ```
      rm -rf ./*
      ```
      
   
   6. 执行以下命令，下载对应文件linuxkit-linux-amd64。
      ```
      wget https://gitee.com/HuaweiCloudDeveloper/huawei-qingtian/raw/dev/qingtian-tools/platform/linuxkit/linuxkit-linux-amd64?lfs=1
      ```
      
   
   7. 执行以下命令，修改文件名。
      ```
      mv linuxkit-linux-amd64\?lfs\=1 linuxkit-linux-amd64
      ```
      
   
   8. 执行以下命令，编译并替换qingtian-tools相关文件。
      ```
      cd /home/huawei-qingtian/qingtian-tools
      make 
      make install
      ```
      如果认为180秒时间不合适，可以修改qingtian-tools/include/enclave.h文件中的INTERVAL数值
      
   
   
   
   
3. 修复验证。 
   **测试镜像制作。**
   1. 编写一个调测DockerfileTest。
      ```
      cd /home/huawei-qingtian/enclave/qtsm-sdk-c/tests/vsock_shell
      ```
      该directShell默认监听9999端口。
      ```
      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"]
      ```
      
   
   2. 执行以下命令，生成docker image并转换为QingTian 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. 执行以下命令，启动QingTian Enclave。
      ```
      qt enclave start --cpus 2 --mem 8192 --eif test.eif --cid 4
      ```
      
   
   3. 执行以下命令，使用vsock_client登录。
      ```
      /home/nc-vsock/nc-vsock 4 9999
      ```
      
   
   4. 执行以下命令，查看QingTian Enclave内当前时间。
      ```
      date
      ```
      
   
   5. 执行以下命令，修改QingTian Enclave时间。
      ```
      date -s 2027-01-01
      ```
      
   
   6. 一段时间后重新执行以下命令，查看QingTian时间是否修订。
      代码中规定时间为180秒。
      ```
      date
      ```
      若观察到时间修正，则调试成功
      
   
   
   
   
 
