开发者
我要评分
获取效率
正确性
完整性
易理解
在线提单
论坛求助

部署核心组件

为构建一个安全的虚拟化环境,支持TEE的隔离执行和安全启动,需部署相关软件。本小节主要描述如何部署libvirt、QEMU、Host Kernel、EDK2、qcow2镜像相关组件。

部署libvirt

  1. 安装openEuler 24.03 LTS SP2源的libvirt。
    1. 查看系统中与libvirt相关的软件包的信息。
      yum list | grep libvirt 

    2. 安装版本号大于等于16的libvirt软件包。
      yum install -y libvirt
  2. 验证安装版本带安全内存的可观测主命令字。
    virsh help | grep tmm

  3. 如需在启动libvirt中透传DTB dump参数,需要修改libvirt配置使QEMU启动用户与当前OS用户一致。
    1. 查看当前用户。
      whoami 

    2. 打开“/etc/libvirt/qemu.conf”文件。
      vim /etc/libvirt/qemu.conf
    3. “i”进入编辑模式,将user、group配置项修改为“root”。

    4. “Esc”键退出编辑模式,输入:wq!,按“Enter”键保存并退出文件。
    5. 查看libvirtd状态。
      systemctl status libvirtd
      如果libvirtd状态为inactive则执行如下命令启动libvirtd,否则需跳过此步骤,直接执行3.f
      systemctl start libvirtd

    6. 重新加载libvirtd配置。
      systemctl reload libvirtd

部署QEMU

  1. 执行以下命令查看openEuler 24.03 LTS SP2源QEMU版本号,安装版本号大于等于37的QEMU。
    yum list | grep qemu 

  2. 执行以下命令安装openEuler 24.03 LTS SP2源的QEMU。
    yum install -y  qemu liburing-devel telnet

    安装完成之后的QEMU默认路径为“/usr/libexec/qemu-kvm”

部署Host Kernel

  1. 安装openEuler 24.03 LTS SP2源的Kernel。
    1. 执行以下命令查看openEuler 24.03 LTS SP2源kernel.aarch64版本号。
      yum list | grep kernel.aarch64 

    2. 安装Kernel。
      yum install -y kernel
  2. 为新安装的内核添加启动参数。
    1. 打开grub.cfg文件。
      vim /boot/efi/EFI/openEuler/grub.cfg
    2. “i”进入编辑模式,添加启动参数virtcca_cvm_host=1。

    3. “Esc”退出编辑模式,输入:wq!,按“Enter”键保存并退出文件。
  3. reboot后在GRUB引导界面选择目标内核即可。

部署EDK2

  1. 安装EDK2。
    1. 执行以下命令查看openEuler 24.03 LTS SP2源edk2-aarch64版本号。
      yum list | grep edk2-aarch64

    2. 安装版本号大于等于23的edk2-aarch64。
      yum install edk2-aarch64 -y
  2. 安装完成后,查看edk2-aarch64的路径。
    rpm -ql edk2-aarch64

  3. 将QEMU_EFI.fd文件大小对齐到64MB。
    fallocate -l $((64 * 1024 * 1024)) /usr/share/edk2/aarch64/QEMU_EFI.fd 

制作机密虚拟机qcow2镜像

  1. 安装依赖。
    yum install dnf-plugins-core grub2-efi-aa64-modules libguestfs-tools qemu-img virt-install guestfs-tools cloud-utils-growpart nbdkit ncurses-devel openssl-devel elfutils-libelf-devel dwarves
    yum groupinstall "Development Tools"
  2. 通过以下命令拉取脚本文件。
    git clone https://gitee.com/openeuler/virtCCA_sdk.git
    cd virtCCA_sdk/cvm-image-rewriter/
  3. 确保libvirtd已安装并启动,具体安装步骤可参见部署libvirt
    systemctl start libvirtd
  4. 启动后查看libvirtd状态,状态为active (running)即为启动成功。
    systemctl status libvirtd

  5. 执行create-oe-image.sh脚本文件后在当前脚本目录下生成qcow2镜像和cVM镜像度量基线值文件image_reference_measurement.json。
    export LIBGUESTFS_BACKEND=direct
    sh create-oe-image.sh -v 24.03-LTS-SP2  -s 10

    其中create-oe-image.sh脚本支持两种模式,创建镜像模式和度量模式,对应的参数说明可参见表1

    表1 两种模式下的参数说明

    脚本模式

    参数名称

    参数说明

    创建镜像模式

    -v

    指定版本号。

    -p

    设置镜像root密码。

    -s

    • 扩容镜像空间,该参数为可选参数,默认为40GB。
    • 扩容空间时默认使用“/var/tmp”文件夹。

    -o

    指定镜像输出路径,该参数为可选参数,若不设置则默认为当前脚本路径。

    -f

    强制重新运行脚本并清理已下载的文件,该参数为可选参数。

    -k

    编译安装KAE驱动。该参数为可选参数。

    度量模式

    -i

    度量一个指定的镜像,度量完成后在脚本当前目录下生成cVM镜像度量基线值文件image_reference_measurement.json。

    • 创建镜像模式中若脚本报错空间不足,可执行以下命令更换空间充足的文件夹。
      export TMPDIR=/home/xxx

    • 脚本不支持同时指定创建镜像模式和度量模式,单次运行仅支持两种模式二选一。

配置机密虚机

  1. 将制作的密虚拟机qcow2镜像文件拷贝至目标环境。

  2. 创建并编辑libvirt启动机密虚拟机的cvm.xml,编辑内容如下:
    <domain type='kvm' xmlns:qemu="http://libvirt.org/schemas/domain/qemu/1.0">
      <name>cvm</name>
      <memory unit='GiB'>8</memory>
      <vcpu placement='static'>4</vcpu>
      <cputune>
        <vcpupin vcpu='0' cpuset='0'/>
        <vcpupin vcpu='1' cpuset='1'/>
        <vcpupin vcpu='2' cpuset='2'/>
        <vcpupin vcpu='3' cpuset='3'/>
        <emulatorpin cpuset='0-3'/>
      </cputune>
        <numatune>
        <memnode cellid='0' mode='strict' nodeset='0'/>
      </numatune>
      <os>
        <type arch='aarch64' machine='virt'>hvm</type>   
        <loader readonly='yes' type='rom'>/usr/share/edk2/aarch64/QEMU_EFI.fd</loader>
         <boot dev='hd'/>
      </os>
      <features>                         
        <acpi/>
        <gic version='3'/>
      </features>
      <cpu mode='host-passthrough'>        
        <topology sockets='1' dies='1' clusters='1' cores='4' threads='1'/>
               <numa>
          <cell id='0' cpus='0-3' memory='8' unit='GiB'/>
        </numa>
      </cpu>
      <on_poweroff>destroy</on_poweroff>
      <on_reboot>restart</on_reboot>
      <on_crash>destroy</on_crash>
      <devices>
        <emulator>/usr/libexec/qemu-kvm</emulator>
             <console type='pty'/>                     
        <disk type='file' device='disk' model='virtio-non-transitional'>      
          <driver name='qemu' type='qcow2' queues='2' cache='none' iommu='on'/>
          <source file='/home/virsh/cvm/openEuler-24.03-SP2-cvm-aarch64.qcow2'/>
          <target dev='vda' bus='virtio'/>
        </disk>
    <interface type='bridge'>
    <source bridge='virbr0'/>
    <driver iommu='on' event_idx='off'/>
    <model type='virtio-non-transitional'/>
    </interface>
      </devices>
      <launchSecurity type='cvm'/>
      <qemu:commandline>
        <qemu:arg value='-object'/>
        <qemu:arg value='tmm-guest,id=tmm0,sve-vector-length=128,num-pmu-counters=1'/>
      </qemu:commandline>
    </domain>
    • “sve-vector-length”“num-pmu-counters”属于可选配置参数。只有当SVE特性开启后,才可配置sve-vector-length。
    • cputune中emulatorpin的cpuset范围要与vcpupin的cpuset范围重合,否则会出现ttyAMA0超时问题。
    • 对于频繁启动销毁机密虚拟机等压力测试场景,推荐关闭virtio-net的event_idx机制以提升virtio网络稳定性,配置示例如下。
      <interface type='bridge'>
      <source bridge='virbr0'/>
      <driver iommu='on' event_idx='off'/>
      <model type='virtio-non-transitional'/>
      </interface>
  3. 启动前机密虚拟机的libvirt配置xml文件内容应做如下修改。

    修改vda disk的source file路径为qcow2文件系统绝对路径。

  4. 使用virsh define定义虚拟机配置。
    virsh define cvm.xml

  5. 执行以下命令查看虚拟机定义。
    virsh list --all

    Name与xml中<name>cvm</name>一致。

  6. 关闭SELinux。

    在KVM侧执行以下操作进行SELinux的相关配置。

    • Linux系统默认开启的SELinux安全机制会使TEE功能不可用。如果客户想在自己的系统中使用SELinux,需要手动配置SELinux规则。
    • 禁用SELinux可能会导致安全问题,如果客户最终的解决方案本身没有规划启用SELinux,建议通过端到端的整体方案来弥补SELinux关闭带来的风险,且需自行承担安全风险。如果客户有SELinux的需求,建议根据实际的SELinux问题进行细粒度的规则配置,并保证整个系统的安全。
    • 临时关闭SELinux。
      setenforce 0
    • 永久关闭SELinux(永久关闭的方法需要重启机器才能生效)。
      sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config
  7. 执行以下命令启动机密虚拟机。
    virsh start cvm

  8. 执行以下命令进入机密虚拟机串口。
    virsh console cvm

    镜像默认用户为root。