使用QEMU ARM64虚拟机

安装qemu

可以通过apt-get install在线安装,也可以从qemu官网下载最新源码,编译安装。这里建议到qemu官网(https://www.qemu.org/)下载最新源码,编译安装,安装的时候选择需要的target-list,我们这里需要ARM64虚拟机,所以选择aarch64-softmmu即可,如果全部编译,会很慢。编译方法:
./configure –target-list=aarch64-softmmu
make && make install

安装交叉编译工具链

上一步安装了arm64虚拟机,那么可以在虚拟机上执行的指令需要由arm64交叉编译工具链编译生成。交叉编译工具链可以通过apt-get install在线安装,也可以从linaro官网(http://linaro.org/)下载,手动安装,这里建议从linaro官网下载。Linaro专注于ARM生态链的构建,其对aarch64交叉编译工具链做了很多支持和优化的工作。我们这里选择从linaro官网下载交叉编译工具链,aarch64-linux-gnu-。

编译kernel

下载最新版本的linux源码,通过如下方式编译生成Image。
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- defconfig
make
最终生成image:arch/arm64/boot/Image

制作根文件系统

  • 修改busybox配置

make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- defconfig make menuconfig

为了简单起见,busybox配置为静态编译,如果不配置为静态编译,则busybox的运行还需要依赖一些动态库,生成根文件系统的时候就需要从交叉编译工具链环境中将需要的动态库拷贝过来。
使用QEMU ARM64虚拟机_第1张图片
- 编译安装busybox

make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu-
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- install

  • 制作根文件系统

mkdir rootfs
cp busybox/_install/* rootfs/ -rf
cd rootfs
mkdir dev etc proc
cd dev
mknod console c 5 1
mknod null c 1 3
cd ../etc
mkdir init.d
添加文件inittab,内容为:
::sysinit:/etc/init.d/rcS
::respawn:-/bin/sh
::askfirst:-/bin/sh
::ctrlaltdel:/bin/umount -a -r
cd init.d
创建文件rcS,内容为:
#!/bin/sh
mount -t proc proc /proc
cd ../..
find . | cpio -o -H newc > rootfs.cpio
gzip -c rootfs.cpio > rootfs.cpio.gz

启动ARM64虚拟机

qemu-system-aarch64 -machine virt -cpu cortex-a53 -machine type=virt -nographic -m 2048 -smp 2 -kernel linux-4.9.31/arch/arm64/boot/Image -initrd rootfs.cpio.gz -append “root=/dev/ram0 rootfstype=ramfs rdinit=/linuxrc console=ttyAMA0”

进入debug模式

有时需要了解代码逻辑,最好的办法就是单步执行,非常幸运的是,qemu提供了非常棒的gdb功能,可以从kernel的第一条指令开始gdb。

  • 启动虚拟机,停在第一条指令处

qemu-system-aarch64 -machine virt -cpu cortex-a53 -machine type=virt -nographic -m 2048 -smp 2 -kernel linux-4.9.31/arch/arm64/boot/Image -initrd rootfs.cpio.gz -append “root=/dev/ram0 rootfstype=ramfs rdinit=/linuxrc console=ttyAMA0” -S -s

  • 连接到虚拟机开始gdb

cd linux-4.9.31
aarch64-linux-gnu-gdb ./vmlinux
target remote localhost:1234

你可能感兴趣的:(虚拟化技术解析)