---
title: 部署核心组件
description: "为构建一个安全的虚拟化环境，支持TEE的隔离执行和安全启动，需部署相关软件。本小节主要描述如何部署libvirt、QEMU、Host Kernel、EDK2、qcow2镜像相关组件。"
url: https://www.hikunpeng.com/document/detail/zh/kunpengaiagent/bestpractice/aiagent-0084.html
sourcePath: /source/zh/kunpengaiagent/bestpractice/aiagent-0084.html
indexId: 8bae9b83e83448570d3cd81881769d9f8d00dc933848d84bff9ba25698caae4256
---
# 部署核心组件

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

openEuler 24.03 LTS SP2 、openEuler 24.03 LTS SP3均可，只要软件版本号满足下述要求即可。


#### 部署libvirt

1. 安装openEuler 24.03 LTS SP2源的libvirt。

  a. 查看系统中与libvirt相关的软件包的信息。

```
yum list | grep libvirt
```


  b. 安装版本号大于等于16的libvirt软件包。

```
yum install -y libvirt
```


2. 检查virsh是否支持tmm命令。

```
virsh help | grep tmm
```


3. 如需在启动libvirt时透传DTB dump参数，需要修改libvirt配置使QEMU启动用户与当前OS用户一致。

  a. 查看当前用户。

```
whoami
```


  b. 打开“/etc/libvirt/qemu.conf”文件。

```
vim /etc/libvirt/qemu.conf
```


  c. 按“i”进入编辑模式，将user、group配置项修改为“root”。
  d. 按“Esc”键退出编辑模式，输入:wq!，按“Enter”键保存并退出文件。
  e. 查看libvirtd状态。

```
systemctl status libvirtd
```


    如果libvirtd状态为inactive
    则执行如下命令启动libvirtd，否则需跳过此步骤，直接执行3.f
    。

```
systemctl start libvirtd
```


  f. 重新加载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。

  a. 执行以下命令查看openEuler 24.03 LTS SP2源kernel.aarch64版本号。

```
yum list | grep kernel.aarch64
```


2. 为新安装的内核添加启动参数。

  a. 打开grub.cfg文件。

```
vim /boot/efi/EFI/openEuler/grub.cfg
```


  b. 按“i”进入编辑模式，添加启动参数virtcca_cvm_host=1。
  c. 按“Esc”退出编辑模式，输入:wq!，按“Enter”键保存并退出文件。
3. reboot后在GRUB引导界面选择目标内核即可。


#### 部署EDK2

1. 安装EDK2。

  a. 执行以下命令查看openEuler 24.03 LTS SP2源edk2-aarch64版本号。

```
yum list | grep edk2-aarch64
```


  b. 安装版本号大于等于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://gitcode.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，编辑内容如下，如果开启SMT，需要进行绑核，参照下面cputune的写法。将cpuset绑定至SMT对应物理核上：

```
<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。
