嵌入式 Xen dom0-less 解决方案

作者:Peter Zhou,AMD赛灵思工程师

问题背景: 

在使用 Xen dom0-less的时候,会有一个问题产生: 可以用'xl' 命令boot起来的image,在dom0-less的情况下却boot不起来。

是否有参考例子可以用Petalinux工具链帮助创建一个最小的Xen系统? 是否有参考例子可以指导创建一个可以在dom0_less下boot起来的最小DomU Linux image?

解决方案:

用下面两个kconfig选项在任何ARM64 Linux kernel下都可以生成dom0less kernel:

  CONFIG_SERIAL_AMBA_PL011=y
  CONFIG_SERIAL_AMBA_PL011_CONSOLE=y

在Petalinux kernel下只需简单用下面这条命令来配置上述两项:
petalinux-config -c kernel

打开配置界面:
"Device Drivers" -> "Character devices" -> "Enable TTY" ->  -> "Serial drivers"

选择这两个:

  "ARM AMBA PL011 serial port support"
  "Support for console on AMBA serial port"

关于rootfs,任何的INITRD ("Image Packaging Configuration" -> "Root filesystem type" -> "INITRD") 都可以,没有特殊的要求。当然,越小越好,所以建议尽量去掉rootfs中的你认为不必要的东西。你不需要Xen来支持你的dom0less domU rootfs 或 kernel,所以你可以将其去掉以节省字节空间。
制作好kernel和rootfs后,就可以用 ImageBuilder 来创建一个可以boot的脚本 boot.scr :

https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/384663561/Building+Xen+Hypervisor+with+Petalinux+2020.1+and+2020.2#BuildingXenHypervisorwithPetalinux2020.1and2020.2-TFTPingXenusingImageBuilder


你也可以看到dom0less DomU kernel 和 rootfs 的配置用了NUM_DOMUS=1, DOMU_KERNEL[0] 和DOMU_RAMDISK[0],关于MMC的例子(也适用于其它的应用):

https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/384663561/Building+Xen+Hypervisor+with+Petalinux+2020.1+and+2020.2#BuildingXenHypervisorwithPetalinux2020.1and2020.2-Dom0less

我从petalinux 2019.1开始,并且我没有修改xen。 比起手动编辑xen.dtb,使用ImageBuilder更不容易出错。

假设dom0正在为您引导,那么我将跳过dom0的指令。我假设“xen-Image”是dom0的内核,“xen-root .cpio.gz”是dom0的rootfs。(你可以从预构建的2019.1获取xen-root .cpio.gz,方法是:dd if=xen-root .cpio.gz。U-boot =xen-root .cpio.gz bs=64 skip=1)
另外,作为一种快捷方式,我没有提供关于如何使用Petalinux 2019.1构建Xen 2021.2的说明,而是直接从预构建的2021.2中获取Xen管理程序二进制文件:

# cd xilinx-zcu102-2019.1/pre-built/linux/images/
# cp ../../../../xilinx-zcu102-2021.2/pre-built/linux/xen/xen .


并且修改下面的ImageBuilder
(https://gitlab.com/ViryaOS/imagebuilder.git) 配置文件 "xen.cfg":

---
MEMORY_START="0x0"
MEMORY_END="0x80000000"
XEN="xen"
DOM0_KERNEL="xen-Image"
DEVICE_TREE="xen.dtb"
DOM0_RAMDISK="xen-rootfs.cpio.gz"

NUM_DOMUS="1"
DOMU_KERNEL[0]="Image-domU"
DOMU_RAMDISK=[0]="xen-rootfs-domU.cpio.gz"
DOMU_MEM[0]=1024

UBOOT_SOURCE="xen_boot.source"
UBOOT_SCRIPT="xen_boot.scr"
---

正如您所看到的,我们还需要提供“Image-domU”和“xen-rootfs-domU.cpio.gz”,它们是domU的内核和ramdisk。

domU rootfs
===========
关于rootfs(用root权限):

# mkdir temp
# cd temp
# cat ../xen-rootfs.cpio.gz|gunzip|cpio -id
# vi etc/inittab


增加:
AMA0:12345:respawn:/bin/start_getty 115200 ttyAMA0 vt102

# find .|cpio -H newc -o|gzip > ../xen-rootfs-domU.cpio.gz

需要这个的原因是一个dom0less domU isttyAMA0(不是ttyPS0)的控制台,所以我们需要在etc/inittab中添加一个getty ttyAMA0行。

domU kernel
===========
对于domU内核,以下步骤应该是足够的:

# petalinux-config -c kernel
增加:
  CONFIG_SERIAL_AMBA_PL011=y
  CONFIG_SERIAL_AMBA_PL011_CONSOLE=y

如果你对上面的命令有问题(我已经看到它在这里的几个Ubuntu工作站崩溃),然后你可以通过以下步骤实现相同的事情,在sourcing 2019.1 tools/settings.sh之后:

# git clone https://github.com/Xilinx/linux-xlnx.git# cd linux-xlnx/
# git checkout -b my-2019.1 xilinx-v2019.1
# export CROSS_COMPILE=aarch64-none-elf-
# export ARCH=arm64
# cp arch/arm64/configs/xilinx_zynqmp_defconfig .config
# make olddefconfig
# make menuconfig
    CONFIG_SERIAL_AMBA_PL011=y
    CONFIG_SERIAL_AMBA_PL011_CONSOLE=y
# make -j8 Image.gz
# cp arch/arm64/boot/Image.gz /path/to/Image-domU


ImageBuilder
============
最后,我运行imagebuilder如下:

# bash /path/to/imagebuilder/scripts/uboot-script-gen -t tftp -d . -c ./xen.cfg
生成 uboot 脚本 xen_boot.scr, 在0xC00000地址加载:
tftpb 0xC00000 xen_boot.scr; source 0xC00000

然后用如下命令开始运行系统:

# petalinux-boot --qemu --prebuilt 2
ZynqMP> setenv serverip 10.0.2.2; setenv ipaddr 10.0.2.3 tftpb 0xC00000
ZynqMP> xen_boot.scr; source 0xC00000

之后可以看到两个domains开始运行了,并且可以通过Ctrl-AAA来在它们之间切换。

最新文章

最新文章