0%

Arm平台 Kata开启Nvdimm(memory hotplug)

内存热插拔是容器在部署中动态分配内存的关键特性,在 x86 上,可以使用直接启用 ACPI 的 QEMU 启动 VM,因为它会隐式启动固件。但是对于 arm64,则需要明确指定固件。也就是说,如果准备在 arm64 上运行一个普通的 Kata Container,你需要额外做的是在使用内存热插拔功能之前安装 UEFI ROM。

安装 UEFI ROM

修改脚本适配系统

需要执行的脚本

1
$GOPATH/src/github.com/kata-containers/tests/.ci/aarch64/install_rom_aarch64.sh

该脚本默认适配的系统是Ubuntu,使用apt源安装相关依赖,适配麒麟系统需要修改为dnf源进行安装,将脚本安装依赖部分修改为

1
dnf install -y python python3 python3-distutils-extra uuid-devel bison flex

其他edk2相关git项,根据网络情况进行适配

执行脚本安装

1
sudo .ci/aarch64/install_rom_aarch64.sh

脚本执行安装完成后,默认kata的img路径下(/usr/share/kata-containers)生成2个文件kata-flash0.img和 kata-flash1.img

内核适配

内核默认不支持nvdimm,需要打社区提供的patch才能开启

目前适配的kernel版本是5.4.160,社区提供了5.4.x版本kernel相应的patch,路径如下:

1
$GOPATH/src/github.com/kata-containers/kata-containers/tools/packaging/kernel/patches/5.4.x/0006-arm64-mm-Enable-memory-hot-remove.patch

将该文件拷贝至kernel源码下,执行patch

1
2
3
cd {kernel_path}
cp $GOPATH/src/github.com/kata-containers/kata-containers/tools/packaging/kernel/patches/5.4.x/0006-arm64-mm-Enable-memory-hot-remove.patch ..
patch -p1 <../0006-arm64-mm-Enable-memory-hot-remove.patch

编译内核注意nvdimm相关的config要开启

1
2
3
4
5
6
CONFIG_ACPI_NFIT=y
CONFIG_ARCH_ENABLE_MEMORY_HOTREMOVE=y
CONFIG_MEMORY_HOTREMOVE=y
CONFIG_ZONE_DEVICE=y
CONFIG_NVDIMM_PFN=y
CONFIG_NVDIMM_DAX=y

重新编译后,替换编译后的内核文件

配置文件修改

1
2
3
4
5
6
7
8
# If false and nvdimm is supported, use nvdimm device to plug guest image.
# Otherwise virtio-block device is used.
# Default is false
#disable_image_nvdimm = true //这里不要打开

# -pflash can add image file to VM. The arguments of it should be in format
# of ["/path/to/flash0.img", "/path/to/flash1.img"]
pflashes = ["/usr/share/kata-containers/kata-flash0.img","/usr/share/kata-containers/kata-flash1.img"] //这里指定uefi的rom

注意事项

如果基于之前的kernel编译了驱动之类的内容,kernel打了patch需要重新编译驱动,否则出现mod无法加载的情况