嵌入式开发论坛

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 221|回复: 5

0) 基于QEMU搭建KVM/XEN on ARM64的开发环境

[复制链接]

7

主题

14

帖子

119

积分

注册会员

Rank: 2

积分
119
发表于 2018-12-28 15:51:13 | 显示全部楼层 |阅读模式
本帖最后由 johngong 于 2019-3-8 08:16 编辑

过程主要是参考这篇文章
对于嵌入式开发学习来说,使用QEMU模拟的开发板可以达到事半功倍的效果。
下面介绍如何在x86机器上通过QEMU模拟出arm64的开发板,如何运行KVM和XEN。这套环境可以同时用于开发KVM和XEN,目前XEN可以启动到Dom0。KVM已经可以启动到L2虚机(为了清晰起见,称x86 host为L0,arm64虚拟机为L1,arm64虚拟机中以KVM方式运行的虚拟机为L2)。

1)在x86机器上安装ubuntu 16.04 desktop版本,因为后面跑的Dom0和KVM虚拟机是arm64 版本的ubuntu 16.04,为了后续在交叉编译的方便,推荐x86也安装ubuntu 16.04。当然,如果x86机器本身性能很好,完全可以在虚拟机中安装ubuntu 16.04。

2)建立工作目录,笔者使用john用户,创建/home/john/work/git目录,下载XEN、QEMU、linux kernel的代码到git目录
  1. mkdir -p /home/john/work/git
复制代码
  1. cd  /home/john/work/git
复制代码
下载xen源码
  1. git clone git://xenbits.xen.org/xen.git
复制代码
下载qemu源码
  1. git clone git://git.qemu.org/qemu.git
复制代码
下载linux kernel stable tree的源码。stable tree是由Greg Kroah Hartman维护的,其中tag v4.19.16是目前最新的LTS版本,所以我们使用这个tag的代码
  1. git clone git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
复制代码

3)建立arm64虚拟机目录,创建/home/john/work/arm64目录,然后获取rootfs并重命名为ubuntu.qcow2
  1. cd /home/john/work/arm64
  2. wget   https://cloud-images.ubuntu.com/xenial/current/xenial-server-cloudimg-arm64-uefi1.img -O ubuntu.qcow2
复制代码

4)编译QEMU,用于模拟arm64。
a. 安装依赖的工具
  1. sudo apt install -y gcc python pkgconf make bison flex
复制代码
b. 安装依赖的库
  1. sudo apt install -y zlib1g-dev libglib2.0-dev  libpixman-1-dev
复制代码
c. 编译并安装QEMU v3.0.0
  1. cd /home/john/work/git/qemu
  2. git checkout v3.0.0
  3. mkdir out_arm64
  4. cd out_arm64
  5. ../configuration --prefix=/usr --target-list=aarch64-softmmu --enable-debug --disable-strip --disable-pie --extra-cflags='-g3' --extra-ldflags='-g3'
  6. make -j8
  7. sudo make install
复制代码

5)编译linux kernel for arm64,用于启动rootfs。
a. 安装交叉编译工具及依赖的工具和库文件
  1. sudo apt install -y gcc-4.8-aarch64-linux-gnu gcc-4.8-aarch64-linux-gnu-base bc bison flex  libssl-dev
复制代码
b. 首先生成defconfig的.config
  1. cd /home/john/work/git/linux
  2. git checkout v4.19.16
  3. make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- defconfig
复制代码
c. 修改.config,打开 CONFIG_SQUASHFS_XZ=y。后续启动rootfs的时候需要用到这个功能,不然会一直报错
d. 编译linux kernel for arm64。如果找不到gcc,进入/usr/bin,创建这个软连接: sudo ln -s aarch64-linux-gnu-gcc-4.8 aarch64-linux-gnu-gcc。多谢huangt提醒。
  1. ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- make all -j8
复制代码
e. copy压缩的kernel到arm64目录。这个kernel主要是为了启动ubuntu.qcow2,然后设置root的密码。
  1. cp arch/arm64/boot/Image.gz /home/john/work/arm64/
复制代码

6)编译XEN
a. 首先进入xen的代码,然后执行编译命令。
  1. cd /home/john/work/git/xen
  2. git checkout RELEASE-4.11.1
  3. make -j8 dist-xen XEN_TARGET_ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu-
  4. cp xen/xen.efi /home/john/work/arm64/
复制代码

7)启动arm64的rootfs,设置root密码
a. 使用init=/bin/sh参数,进入拥有root权限的shell,手动mount rootfs,然后设置root密码。
  1. cd /home/john/work/arm64
  2. qemu-system-aarch64 \
  3.    -M virt,gic_version=3,virtualization=true,type=virt \
  4.    -cpu cortex-a57 -nographic -smp 4 -m 8800 \
  5.    -kernel Image.gz --append "console=ttyAMA0 root=/dev/vda1 init=/bin/sh" \
  6.    -drive if=none,file=ubuntu.qcow2,format=qcow2,id=hd0 -device virtio-blk-device,drive=hd0 \
  7.    -netdev user,id=hostnet0,hostfwd=tcp::2222-:22 -device virtio-net-device,netdev=hostnet0
复制代码
b. 在弹出的shell中,手动mount rootfs,然后使用passwd root命令设置root的密码。
  1. mount -o remout,rw /dev/vda1 /
  2. passwd root
复制代码

8)杀死qemu进程。然后去掉init=/bin/sh参数,重新起动arm64虚拟机
a. 杀死之前qemu进程,然后重新启动arm64虚拟机,这次启动会比较慢,可能会花费多达20分钟,因为有个cloud-init服务是开机启动的(如果实在无法忍受,读者可以参考3) 解决arm64虚机中编译带kvm功能的qemu效率低的问题,使用chroot切换到L1的rootfs后,使用sudo apt remove -y cloud-init来删除它),将它删除后,启动会快很多。启动成功,登陆以后,可以用systemctl -t service看一下有什么不需要的service,然后把关闭他们的开机启动。
  1. cd /home/john/work/arm64
  2. qemu-system-aarch64 \
  3.    -M virt,gic_version=3,virtualization=true,type=virt \
  4.    -cpu cortex-a57 -nographic -smp 4 -m 8800 \
  5.    -kernel Image.gz --append "console=ttyAMA0 root=/dev/vda1" \
  6.    -drive if=none,file=ubuntu.qcow2,format=qcow2,id=hd0 -device virtio-blk-device,drive=hd0 \
  7.    -netdev user,id=hostnet0,hostfwd=tcp::2222-:22 -device virtio-net-device,netdev=hostnet0
复制代码
b. 大概20分钟后,login界面出现,通过之前设置的root密码登陆arm64虚拟机。
c. 删除cloud-init服务(假设在a中没有使用chroot删除cloud-init服务)
  1. apt remove -y cloud-init
复制代码
d. 设置ssh密码访问权限,修改/etc/ssh/sshd_config,找到PasswordAuthentication,PasswordAuthentication no改为PasswordAuthentication yes,然后重启ssh服务。
e. 设置dom0的配置文件。touch a file /boot/efi/xen.cfg。
   加入以下内容
  1. options=console=dtuart noreboot dom0_mem=1024M
  2. kernel=kernel root=/dev/vda1 init=/bin/sh rw console=hvc0
  3. dtb=virt-gicv3.dtb
复制代码

9)生成XEN需要的dtb文件
  1. cd /home/john/work/arm64
  2. qemu-system-aarch64 -M virt,gic_version=3,virtualization=true,type=virt -cpu cortex-a57 -smp 4 -m 8800 -display none -machine dumpdtb=virt-gicv3.dtb
复制代码


10)copy需要的文件到arm64虚拟机。需要把Image.gz、xen.efi、virt-gicv3.dtb 从L0 copy到L1的/boo/efi目录中。       由于huangt反应root不能直接通过ssh登陆,需要修改sshd的配置文件,具体的修改大家可以google一下。
  1. cd /home/john/work/arm64
  2. scp -P2222 Image.gz root@127.0.0.1:/boot/efi/kernel
  3. scp -P2222 xen.efi root@127.0.0.1:/boot/efi
  4. scp -P2222 virt-gicv3.dtb root@127.0.0.1:/boot/efi
复制代码

11)使用QEMU_EFI.fd启动arm64虚拟机,
a. 首先获取QEMU_EFI.fd
  1. cd /home/john/work/arm64
  2. wget  http://snapshots.linaro.org/components/kernel/leg-virt-tianocore-edk2-upstream/latest/QEMU-AARCH64/RELEASE_CLANG35/QEMU_EFI.fd
复制代码
b. 使用QEMU_EFI.fd启动arm64虚拟机
  1. qemu-system-aarch64 \
  2.    -M virt,gic_version=3,virtualization=true,type=virt \
  3.    -cpu cortex-a57 -nographic -smp 4 -m 8800 \
  4.    -bios QEMU_EFI.fd \
  5.    -drive if=none,file=ubuntu.qcow2,format=qcow2,id=hd0 -device virtio-blk-device,drive=hd0 \
  6.    -netdev user,id=hostnet0,hostfwd=tcp::2222-:22 -device virtio-net-device,netdev=hostnet0
复制代码
c. 赶紧连续敲击esc键,进入uefi的设置界面,进入Boot Manager,然后再进入EFI Internal Shell。   如果不敲击esc键的话,就会进入默认的ubuntu中。
   在EFI shell中,执行

12)默认连接的是Dom0的串口,启动信息里面有提示:type 'CTRL-a' three times to switch input to Xen,可以切换到Xen的输出,但是好像没有内容。

以上只是启动到了Dom0,目前还不知道怎么启动其他的Domain。后续有空再研究。
HAVE FUN!

John Gong


















本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

59

主题

62

帖子

249

积分

版主

Rank: 7Rank: 7Rank: 7

积分
249
发表于 2018-12-29 10:56:13 | 显示全部楼层
66666
回复

使用道具 举报

8

主题

15

帖子

100

积分

版主

Rank: 7Rank: 7Rank: 7

积分
100
发表于 2019-1-13 14:44:02 | 显示全部楼层
本帖最后由 huangt 于 2019-1-13 22:02 编辑

在安装了aarch64 toolchain之后编译过程还是找不到gcc toolchain的解决办法:进入/usr/bin,创建这个软连接
  1. sudo ln -s aarch64-linux-gnu-gcc-4.8 aarch64-linux-gnu-gcc
复制代码
自己制作rootfs的方式,参考:https://blog.csdn.net/UbuntuTouch/article/details/83585564


回复

使用道具 举报

8

主题

15

帖子

100

积分

版主

Rank: 7Rank: 7Rank: 7

积分
100
发表于 2019-2-24 22:54:52 | 显示全部楼层
9中完整的命令为:
  1. qemu-system-aarch64 -M virt,gic_version=3,virtualization=true,type=virt -cpu cortex-a57 -smp 4 -m 8800 -display none -machine dumpdtb=virt-gicv3.dtb
复制代码
回复

使用道具 举报

7

主题

14

帖子

119

积分

注册会员

Rank: 2

积分
119
 楼主| 发表于 2019-3-8 08:10:37 | 显示全部楼层
huangt 发表于 2019-2-24 22:54
9中完整的命令为:

已修正。多谢!
回复

使用道具 举报

8

主题

15

帖子

100

积分

版主

Rank: 7Rank: 7Rank: 7

积分
100
发表于 2019-3-9 22:03:30 | 显示全部楼层
编译Linux的时候也需要打开这个config
  1. CONFIG_SQUASHFS_ZLIB=y
复制代码
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|TEE and Virtualization

GMT+8, 2019-3-19 00:02 , Processed in 0.092835 second(s), 29 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表