部署核心组件
为构建一个安全的虚拟化环境,支持TEE的隔离执行和安全启动,需部署相关软件。本小节主要描述如何部署libvirt、QEMU、Host Kernel、EDK2、qcow2镜像相关组件。
部署libvirt
- 安装openEuler 24.03 LTS SP2源的libvirt。
- 查看系统中与libvirt相关的软件包的信息。
yum list | grep libvirt

- 安装版本号大于等于16的libvirt软件包。
yum install -y libvirt
- 查看系统中与libvirt相关的软件包的信息。
- 验证安装版本带安全内存的可观测主命令字。
virsh help | grep tmm

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

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

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

- 重新加载libvirtd配置。
systemctl reload libvirtd
- 查看当前用户。
部署QEMU
- 执行以下命令查看openEuler 24.03 LTS SP2源QEMU版本号,安装版本号大于等于37的QEMU。
yum list | grep qemu

- 执行以下命令安装openEuler 24.03 LTS SP2源的QEMU。
yum install -y qemu liburing-devel telnet
安装完成之后的QEMU默认路径为“/usr/libexec/qemu-kvm”。
部署Host Kernel
- 安装openEuler 24.03 LTS SP2源的Kernel。
- 执行以下命令查看openEuler 24.03 LTS SP2源kernel.aarch64版本号。
yum list | grep kernel.aarch64

- 安装Kernel。
yum install -y kernel
- 执行以下命令查看openEuler 24.03 LTS SP2源kernel.aarch64版本号。
- 为新安装的内核添加启动参数。
- 打开grub.cfg文件。
vim /boot/efi/EFI/openEuler/grub.cfg
- 按“i”进入编辑模式,添加启动参数virtcca_cvm_host=1。

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

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

- 安装版本号大于等于23的edk2-aarch64。
yum install edk2-aarch64 -y
- 执行以下命令查看openEuler 24.03 LTS SP2源edk2-aarch64版本号。
- 安装完成后,查看edk2-aarch64的路径。
rpm -ql edk2-aarch64

- 将QEMU_EFI.fd文件大小对齐到64MB。
fallocate -l $((64 * 1024 * 1024)) /usr/share/edk2/aarch64/QEMU_EFI.fd
制作机密虚拟机qcow2镜像
- 安装依赖。
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"
- 通过以下命令拉取脚本文件。
git clone https://gitee.com/openeuler/virtCCA_sdk.git cd virtCCA_sdk/cvm-image-rewriter/
- 确保libvirtd已安装并启动,具体安装步骤可参见部署libvirt。
systemctl start libvirtd
- 启动后查看libvirtd状态,状态为active (running)即为启动成功。
systemctl status libvirtd

- 执行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

- 脚本不支持同时指定创建镜像模式和度量模式,单次运行仅支持两种模式二选一。
配置机密虚机
- 将制作的密虚拟机qcow2镜像文件拷贝至目标环境。

- 创建并编辑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>
- 启动前机密虚拟机的libvirt配置xml文件内容应做如下修改。
修改vda disk的source file路径为qcow2文件系统绝对路径。

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

- 执行以下命令查看虚拟机定义。
virsh list --all
Name与xml中<name>cvm</name>一致。

- 关闭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
- 执行以下命令启动机密虚拟机。
virsh start cvm

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

镜像默认用户为root。
父主题: 机密虚机部署