最新的 Xen 4.3.0 发布时,已经支持ARM平台的虚拟化了,前阵子刚好有机会还用ARM Cortex A15板子(使用的是代号为Arndale的板子)测试了一下。很多细节的编译和配置信息,就不详述了,可以参考本文后面的“参考资料”;关于Xen on ARM的功能和性能,也暂不做过多评述(也不方便乱说)。这里只是简单记录一些笔记和参考资料的来源。
首先需要安装一些软件包,命令如下:
apt-get install python-dev gettext uuid-dev libncurses5-dev pkg-config libglib2.0-dev libyajl-dev libaio-dev libpixman-1-dev pkg-config
在x86-64平台的Ubuntu下进行交叉编译,命令如下(可能不是很完整,详见文末的“参考资料”):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
# install cross compiler apt-get install gcc-arm-linux-genueabi # build dom0 zImage cd linux-dom0 make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- zImage # build dom0 dtb make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- dtbs # build xen: make dist-xen XEN_TARGET_ARCH=arm32 CROSS_COMPILE=arm-linux-gnueabi- CONFIG_DTB_FILE=/root/linux-dom0/arch/arm/boot/dts/exynos5250-arndale.dts # make xen-uImage for booting on U-Boot mkimage -A arm -T kernel -a 0x80200000 -e 0x80200000 -C none -d "/root/xen.git/xen/xen" xen-uImage #build DomU kernel cd linux-arm make xen_domU_arndale_defconfig ARCH=arm make zImage ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- make dtbs ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- cat arch/arm/boot/zImage arch/arm/boot/dts/xenvm-4.2.dtb > domu-kernel.image |
Xen和Dom0内核启动选项,在arch/arm/boot/dts/exynos5250-arndale.dts 修改(如:dom0_mem=256M),然后需要重新生成Xen的UImage;DomU启动的内核选项可以在:arch/arm/boot/dts/xenvm-4.2.dts 中修改,然后重做DomU kernel。
在编译Xen中的tools时,可能遇到一些问题,比如:(Xen源代码中自带的libaio代码不包含对ARM的支持)
When building the tools, I found that libaio does not build for ARM since it was missing tools/libaio/src/syscall-arm.h
解决方法是:自己下载最新的libaio源码,替换到xen.git/tools/中去。
libaio upgrade: http://ftp.de.debian.org/debian/pool/main/liba/libaio/libaio_0.3.109.orig.tar.gz
Das U-Boot (Universal Bootloader) is an open source, primary boot loader used in embedded devices.
在使用我自己编译的系统启动Xen时,开始根据Xen官方wiki上的指导是有用“ext2load”这样的命令,而我的系统是使用ext4文件系统。开始时,一直以为需要自己重新编译U-Boot才能识别我的文件系统,因为找不到“ext4load”命令。后来我重新编译了Uboot并且把ext4的支持配置进去了,依然没看到ext4load这样的命令。后来才发现,我错了,原来那个U-boot就是支持ext4的。
ext2ls这样的以ext2开头的文件系统操作命令也支持ext4的(如果你的Uboot编译时支持配置了ext4的支持),尽管它不是以ext4作为命令开头。
直接中SD卡启动Xen/Dom0的U-Boot命令如下:
1 2 3 4 5 6 |
setenv kernel_addr_r 0x60000000 setenv xen_addr_r 0x50000000 setenv bootcmd_load_linux_mmc 'ext2load mmc 0:1 $kernel_addr_r /zImage' setenv boot_xen_mmc 'run bootcmd_load_linux_mmc; ext2load mmc 0:1 $xen_addr_r /xen-uImage; bootm $xen_addr_r -' setenv bootcmd 'run boot_xen_mmc' boot |
Dom0中可能需要挂载DomU的磁盘镜像,在使用kpartx时可能遇到如下错误:
root@linaro-server:/home/test# kpartx A15-4GB.img
/proc/misc: No entry for device-mapper found
Is device-mapper driver missing from kernel?
Failure to communicate with kernel device-mapper driver.
loop0p1 : 0 5859375 /dev/loop0 10240
loop0p2 : 0 15228 /dev/loop0 5878531
ioctl: LOOP_CLR_FD: Device or resource busy
这时,需要在Dom0内核中配置DM(Device Mapper)相关的东西。
启动DomU的配置文件示例如下:
1 2 3 4 5 |
kernel = "/root/domu-kernel.image" memory = 256 name = "jay-DomU" vcpus = 1 disk = [ 'phy:/dev/loop0,xvda,w' ] |
目前,A15硬件中有对CPU虚拟化的支持(类似于x86上的VMX),有对内存虚拟化的支持(类似于x86上的EPT)。
Xen on ARM 目前对guest的设计只支持一种类型的Guest,它就是PVH,在Xen on ARM中不需要任何QEMU的参与(当然不需要像在x86上那样编译qemu-xen了)。PVH guest在ARM架构上的实现,是让I/O全部都走PV的方式,而MMU都是ARM硬件中的nested paging(不需要也没有实现shadow page table那套复杂的东东)。
参考资料:
关于Arndale板子硬件相关信息:http://www.arndaleboard.org/wiki/index.php/Main_Page
Linaro上的资源下载:http://www.linaro.org/downloads/1307
运行在Arndale上的Ubuntu镜像:http://releases.linaro.org/13.07/ubuntu/arndale/
编译和烧录uimage和DTB:https://wiki.linaro.org/Boards/Arndale/Setup/EnterpriseUbuntuServer#Build.2C_burn_uImage_and_dtb
编译Xen on ARM: http://wiki.xen.org/wiki/Xen_ARMv7_with_Virtualization_Extensions#Building_Xen_on_ARM
http://wiki.xen.org/wiki/Xen_ARMv7_with_Virtualization_Extensions/Arndale
Xen on ARM的设计与实现:http://www.slideshare.net/xen_com_mgr/linaro-connect-xen-on-arm-update
PVH、Xen on ARM的视频演讲:http://blog.xen.org/index.php/2012/09/21/xensummit-sessions-new-pvh-virtualisation-mode-for-arm-cortex-a15arm-servers-and-x86/
非常有意思的工作,对ARM的virtualization 感兴趣。 我计划移植KVM到cortex A7。 如果有兴趣可以联系我 cinifr@gmail.com