基于鲲鹏virtcca部署机密容器
发表于 2025/06/08
0
作者: 潘恒昌
一 环境
1. 处理器:鲲鹏920新型号处理器(7270Z、7280Z、7250Y、7260Y等)2. Host OS: openEuler24.03 SP2
3. Guetst OS: openEuler24.03 SP2
4. Golang: 1.22.4-linux-arm64
5. Rust: 1.77.1
二 编译部署Guest Kernel和rootfs
1. 编译Guest Kernel
1.1安装编译依赖。
yum install ncurses-devel openssl-devel
yum groupinstall "Development Tools"
1.2下载openEuler-24.03-LTS-SP2 Kernel源码。
yum install kernel-source -y
注:目标版本Kernel源码位于“/usr/src”目录下。
1.3进入“kernel”目录并修改deconfig
具体路径根据yum下载的kernel source版本决定。
cd /usr/src/linux-6.6.0-xxx.oe2403sp2.aarch64/
vim arch/arm64/configs/openeuler_defconfig
确保defconfig下述选项配置为如下值。
CONFIG_NET_9P=y
CONFIG_NET_9P_VIRTIO=y
CONFIG_VIRTIO_BLK=y
CONFIG_SCSI_VIRTIO=y
CONFIG_VIRTIO_NET=y
CONFIG_VIRTIO=y
CONFIG_VIRTIO_PCI_LIB=y
CONFIG_VIRTIO_PCI=y
CONFIG_EXT4_FS=y
修改/block/Kconfig文件。vim drivers/block/Kconfig
修改tristate“Virtio block driver”为如下。bool "Virtio block driver"
修改drivers/net/Kconfig文件。
vim drivers/net/Kconfig
修改tristate“Virtio network driver”为如下。bool "Virtio network driver"
修改drivers/virtio/Kconfig文件。vim drivers/virtio/Kconfig
将config VIRTIO_PCI_LIB下的tristate改为bool。bool "Virtio network driver"
修改tristate“PCI driver for virtio devices”为如下。bool "PCI driver for virtio devices"
生成.config配置文件。make openeuler_defconfig
1.4 编译Guest Kernel
其中LOCALVERSION指定了内核版本后缀,影响虚拟机内执行“uname -r”显示的值,需与后文rootfs编译里指定的版本保持一致,也可保持默认空值。
export LOCALVERSION=
make include/config/kernel.release
make -j $(nproc)
编译完成生成的Guest Kernel镜像位于“arch/arm64/boot/Image”路径下。Image文件即机密虚机启动时所需镜像文件。
2. 编译rootfs
在“/tmp“目录下创建“rootfs“。mkdir -p /tmp/rootfs/var/lib/rpm
rpm --root /tmp/rootfs/ --initdb
手动下载openEuler发布包,指定在“rootfs”目录中安装,安装完成后,在“rootfs”下会生成etc、usr、var子目录 。rpm -ivh --nodeps --root /tmp/rootfs/ https://repo.openeuler.org/openEuler-24.03-LTS-SP2/everything/aarch64/Packages/openEuler-release-24.03LTS_SP2-55.oe2403sp2.aarch64.rpm
注意:安装过程中产生报错不影响后续流程,可忽略error: failed to exec scriptlet interpreter /bin/sh: No such file or directory
安装yum、dnf包管理程序
mkdir /tmp/rootfs/etc/yum.repos.d
curl -o /tmp/rootfs/etc/yum.repos.d/openEuler-24.03-LTS-SP2.repo https://gitee.com/src-openeuler/openEuler-repos/raw/openEuler-24.03-LTS-SP2/generic.repo
下载dnf、yum等安装包dnf --installroot=/tmp/rootfs/ install -y dnf yum vim net-tools iproute iputils NetworkManager openssh-server passwd hostname ntp
打开“/tmp/rootfs/etc/resolv.conf”,设置DNS,写入以下内容。
nameserver 8.8.8.8
nameserver 114.114.114.114
配置网络,打开ifup-eth0文件。vi /tmp/rootfs/etc/sysconfig/network-scripts/ifup-eth0
向其中写入以下内容
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=dhcp
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=eth0
UUID=851a6f36-e65c-3a43-8f4a-78fd0fc09dc9
ONBOOT=yes
AUTOCONNECT_PRIORITY=-999
DEVICE=eth0
挂载必要的路径,设置rootfs密码
mount --bind /dev /tmp/rootfs/dev
mount -t proc /proc /tmp/rootfs/proc
mount -t sysfs /sys /tmp/rootfs/sys
进入文件系统chroot /tmp/rootfs/ /bin/bash
设置root密码passwd root
取消临时挂载目录。
umount -l /tmp/rootfs/dev
umount -l /tmp/rootfs/proc
umount -l /tmp/rootfs/sys
回到刚刚下载编译的kernel源码,编译内核模块。
cd /usr/src/linux-6.6.0-xxx.oe2403sp2.aarch64/
export LOCALVERSION=
make include/config/kernel.release
make modules -j $(nproc)
安装内核模块到rootfsmake modules_install INSTALL_MOD_PATH=/tmp/rootfs
创建空白镜像文件。dd if=/dev/zero of=/tmp/rootfs.img bs=1M count=5000
注:其中bs表示块大小,对应的rootfs.img大小为bs*count,即5000MB,用户可根据实际情况自定义容量大小。
创建EXT4类型的文件系统。
cd /tmp
mkfs.ext4 rootfs.img
将之前准备好的文件系统内容拷贝到文件系统镜像中。
mkdir -p rootfs1
mount rootfs.img rootfs1
cp -rfp /tmp/rootfs/* rootfs1/
umount rootfs1
对文件系统映像文件rootfs.img进行自动化的文件系统完整性检查和修复操作,同时最小化文件系统大小。
e2fsck -p -f rootfs.img
resize2fs -M rootfs.img
此时镜像文件rootfs.img制作完毕,将其复制到自定义目录。cp /tmp/rootfs.img /home/virtcca/
三 kata-shim编译和部署
1. 配置rust编译工具链
添加musl以实现静态编译。rustup target add aarch64-unknown-linux-musl
yum install -y musl-gcc
2. 下载编译kata-container
创建并进入工作目录,要求所有代码仓均位于同一目录下。所示路径仅供参考,用户可自行选择。mkdir -p /home/work && cd /home/work
下载 kata-container CC-0.8.0 版本和其组件代码。
git clone https://github.com/kata-containers/kata-containers.git -b CC-0.8.0
git clone https://github.com/confidential-containers/guest-components.git -b v0.8.0
获取virtcca适配patch。
git clone https://gitee.com/openeuler/virtCCA_sdk.git
应用代码patch。
cd /home/work/kata-containers
git apply ../virtCCA_sdk/confidential_container/kata-container.patch
cd /home/work/guest-components
git apply ../virtCCA_sdk/confidential_container/guest-components.patch
编译 containerd-shim-kata-v2,编译生成的目标文件位于“src/runtime/containerd-shim-kata-v2“下。
make -C src/runtime

ln -snf /home/work/kata-containers/src/runtime/kata-runtime /usr/bin/kata-runtime
ln -snf /home/work/kata-containers/src/runtime/containerd-shim-kata-v2 /usr/bin/containerd-shim-kata-v2
编译qemu,最终生成的qemu二进制路径为“/home/work/qemu/build/qemu-system-aarch64”。
yum install sphinx python3-sphinx_rtd_theme ninja-build libcap-ng-devel libattr-devel glib2-devel numactl-devel libslirp-devel liburing-devel meson.noarch
cd /home/work
git clone https://gitee.com/openeuler/qemu.git -b qemu-8.2.0 --depth=1
cd qemu
git apply ../virtCCA_sdk/confidential_container/qemu.patch
mkdir build && cd build
../configure --target-list=aarch64-softmmu --disable-docs
make -j $(nproc)
部署kata配置。
mkdir -p /etc/kata-containers
cp /home/work/kata-containers/src/runtime/config/configuration-qemu.toml /etc/kata-containers/configuration.toml
将kernel、image和path设置为下列机密虚机组件实际路径。
kernel为guest OS内核镜像,参考前文 编译Guest Kernel 步骤生成。
image为guest OS的rootfs,参考前文 编译rootfs步骤 步骤生成。
path为qemu可执行文件路径,生成的路径为: “/home/work/qemu/build/qemu-system-aarch64”。


3. rootfs配置kata-agent
拷贝rootfs镜像文件到目标路径。cd /home/work/kata-containers/tools/osbuilder/rootfs-builder
cp /tmp/rootfs.img ./
将rootfs.img挂载临时目录。
mkdir rootfs
mount rootfs.img rootfs
编译构建出kata-agent systemd默认启动配置
yum install -y lvm2-devel clang clang-devel device-mapper-devel --allowerasing
mkdir $PWD/kata-overlay
SECCOMP=no CFLAGS=-mno-outline-atomics ./rootfs.sh -r "$PWD/kata-overlay"
将kata-overlay下的文件拷贝到rootfs目录下。
cp -rf kata-overlay/etc/systemd/system/basic.target.wants/ rootfs/etc/systemd/system/
cp -rf kata-overlay/etc/systemd/system/kata-containers.target.wants rootfs/etc/systemd/system/
cp -rf kata-overlay/usr/lib/systemd/system/* rootfs/usr/lib/systemd/system/
cp -rf kata-overlay/usr/bin/kata-agent rootfs/usr/bin
取消挂载的目录。umount rootfs
4. 部署containerd
下载CoCo社区提供的containerd 1.6.8.2版本。wget https://github.com/confidential-containers/containerd/releases/download/v1.6.8.2/containerd-1.6.8.2-linux-arm64.tar.gz
解压获取可执行文件。
tar -xvf containerd-1.6.8.2-linux-arm64.tar.gz
拷贝可执行文件到“/usr/local/bin“目录下。
cp bin/* /usr/local/bin
安装runc。
yum install runc -y
生成containerd配置文件。
mkdir /etc/containerd/
containerd config default > /etc/containerd/config.toml
在配置文件中新增如下字段。
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.kata]
runtime_type = "io.containerd.kata.v2"
privileged_without_host_devices = false

wget raw.githubusercontent.com/confidential-containers/containerd/v1.6.8.2/containerd.service
cp ./containerd.service /usr/lib/systemd/system/
启动containerd。
systemctl daemon-reload
systemctl start containerd
systemctl enable containerd
使用containerd命令行工具ctr拉取镜像。
ctr image pull docker.io/library/busybox:latest
指定kata运行时运行基于virtcca机密虚机的机密容器。
ctr run --runtime "io.containerd.kata.v2" --rm -t docker.io/library/busybox:latest test-kata /bin/sh