作者: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 :
你也可以看到dom0less DomU kernel 和 rootfs 的配置用了NUM_DOMUS=1, DOMU_KERNEL[0] 和DOMU_RAMDISK[0],关于MMC的例子(也适用于其它的应用):
我从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来在它们之间切换。