利用Qemu-4.0虚拟ARM64实验平台
在无aarch64开发板的情况下,为了能够学习实验aarch64相关的代码,通过Qemu模拟器搭建aarch64运行环境,这样就能完全达到实验学习的目的,既节省了硬件成本又便于实验操作。本文记录一下环境的搭建过程和小坑,方便以后自己快速搭建调试环境。
交叉编译工具
1 | wget http://releases.linaro.org/components/toolchain/binaries/7.2-2017.11/aarch64-linux-gnu/gcc-linaro-7.2.1-2017.11-x86_64_aarch64-linux-gnu.tar.xz |
修改环境变量PATH,使工具方便使用
1
vim ~/.bashrc
在文件末尾添加如下内容
1
export PATH=$PATH:/path/to/toolchains/gcc-linaro-7.2.1-2017.11-x86_64_aarch64-linux-gnu/bin
注意:根据实际情况,确保路径设置正确
验证
1
aarch64-linux-gnu-gcc -v
在终端会输出aarch64-linux-gnu-gcc的配置及版本信息
构建QEMU
1 | wget https://download.qemu.org/qemu-4.0.0.tar.xz |
编译Kernel
1 | wget https://mirrors.edge.kernel.org/pub/linux/kernel/v4.x/linux-4.19.27.tar.xz |
模拟运行
1 | qemu-system-aarch64 -kernel build/arch/arm64/boot/Image -append "console=ttyAMA0" -m 2048M -smp 4 -M virt -cpu cortex-a57 -nographic |
- -m 指定内存大小
- -M 指定虚拟机器「machine」的类型
- -cpu 指定虚拟CPU的型号
- -smp 指定对称多处理的核心数
- -append 指定内核启动时使用的命令行参数「cmdline」
由于缺少根文件系统,虚拟aarch64平台还未能正常启动。
按Ctrl+A+X组合键退出qemu模拟器
按Ctrl+A+C组合键进入qemu-monitor,输入help可以查看操作命令
定制rootfs
ubuntu-base-18.04.1
安装Qemu用户模拟器(静态编译版)
1
sudo apt-get install qemu-user-static binfmt-support
检验
1
update-binfmts --display
图2 运行update-binfmts的输出
制作步骤
1 | wget http://cdimage.ubuntu.com/ubuntu-base/releases/18.04.2/release/ubuntu-base-18.04.2-base-arm64.tar.gz |
模拟运行验证
1 | qemu-system-aarch64 -machine virt,gic_version=3 -machine virtualization=true -cpu cortex-a57 -machine type=virt -nographic -smp 4 -m 4096 -kernel build/arch/arm64/boot/Image -append "console=ttyAMA0 root=/dev/vda rw" -drive if=none,file=ubuntu-18.04.1-rootfs_ext4.img,id=hd0,format=raw -device virtio-blk-device,drive=hd0 -netdev tap,id=net0,ifname=tap0,script=no,downscript=no -device virtio-net-device,netdev=net0,mac=52:55:00:d1:55:01 |
问题
在使用ubuntu-base启动虚拟aarch64平台时,等待dev-ttyAMA0.device超时而卡住,从而导致无法登录进入bash
解决方法
1 | sudo mount ubuntu-18.04.1-rootfs_ext4.img rootfs/ |
修改内容
1 | sudo vim rootfs/lib/systemd/system/serial-getty@ttyAMA0.service |
将BindsTo
和After
开头的行注释掉
参考地址:systemd for Administrators, Part XVI
1 | sudo umount rootfs |
最后卸载挂载,完成根文件系统的制作
busybox
1 | wget https://busybox.net/downloads/busybox-1.30.0.tar.bz2 |
制作步骤
1 | dd if=/dev/zero of=busybox-1.30.0-rootfs_ext4.img bs=1M count=100 oflag=direct |
模拟运行
1 | qemu-system-aarch64 -kernel build/arch/arm64/boot/Image -append "console=ttyAMA0 root=/dev/vda init=/linuxrc rw" -m 2048M -smp 4 -M virt -cpu cortex-a57 -nographic -hda busybox-1.30.0-rootfs_ext4.img |
由于未作任何系统配置,比如/etc/passwd、/etc/group、/etc/shadow、/etc/hostname等文件,所以系统的操作和易用性还有待改进。
制作initramfs
1 | cd rootfs |
运行实验
1 | qemu-system-aarch64 -kernel build/arch/arm64/boot/Image -initrd initramfs.cpio.gz -append "console=ttyAMA0 rdinit=/linuxrc" -M virt -cpu cortex-a53 -nographic -m 2048M |