QEMU搭建arm虚拟机开发环境

获取QEMU代码

git clone https://gitlab.com/qemu-project/qemu.git

切换对应的工程分支

使用git指令切换到对应的分支上,我这里使用的是stable-4.0的分支

git checkout -b stable-4.0 remotes/origin/stable-4.0

配置&编译

在工程的根目录下执行

./configure --target-list=aarch64-linux-user,aarch64-softmmu --enable-virtfs --enable-debug

然后执行make,视情况是否要执行make install

需要注意的是,在make的过程中,由于有依赖关系,会在编译过程中产生git clone动作,而部分仓库又需要翻墙。

不过好在我已经下载了一份完整的,你们只要去这里下载即可:

qemu-stable4.0

内核代码获取与编译

这里使用的是5.9.2的内核,可以clone下来,也可以从下面的地址下载:

linux 5.9.2

内核编译

在开始编译之前,需要先指定一下默认的内核config(默认是x86平台),使用这个指令

make ARCH=arm64 defconfig

同时需要先下载教程工具链:gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu.tar

解压之后需要export一下,或者使用脚本export

编译脚本示例:

#!/bin/sh
export PATH=$PATH:/home/workspace/qemu-machine/toolchain/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/bin
export ARCH=arm64
export CROSS_COMPILE=aarch64-linux-gnu-
make

运行上面的脚本开始编译

busybox代码获取与编译

这里使用的是busybox-1.28.1.tar.bz2,可以从busybox官网下载

下载之后,解压,进入busybox源码目录

执行一次make menuconfig,配置你的busybox选项,退出保存config

然后使用下面指令开始编译:

#!/bin/sh
export PATH=$PATH:/home/workspace/qemu-machine/toolchain/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/bin
export ARCH=arm64
export CROSS_COMPILE=aarch64-linux-gnu-
make;make install

编译完成可以看到:

所有输出放在_install/目录下

制作rootfs

使用下面脚本生成根文件系统:

#!/bin/bash

cd _install
#在_install目录下补充必要文件

mkdir -p etc dev mnt proc sys tmp mnt etc/init.d/

echo "proc        /proc           proc         defaults        0        0" > etc/fstab
echo "tmpfs       /tmp            tmpfs        defaults        0        0" >> etc/fstab
echo "sysfs       /sys            sysfs        defaults        0        0" >> etc/fstab

echo "echo -e \"Welcome to tinyLinux\"" > etc/init.d/rcS
echo "/bin/mount -a" >> etc/init.d/rcS
echo "echo -e \"Remounting the root filesystem\"" >> etc/init.d/rcS
echo "mount  -o  remount,rw  /" >> etc/init.d/rcS
echo "mkdir -p /dev/pts" >> etc/init.d/rcS
echo "mount -t devpts devpts /dev/pts" >> etc/init.d/rcS
echo "echo /sbin/mdev > /proc/sys/kernel/hotplug" >> etc/init.d/rcS
echo "mdev -s" >> etc/init.d/rcS

chmod 755 etc/init.d/rcS

echo "::sysinit:/etc/init.d/rcS" > etc/inittab
echo "::respawn:-/bin/sh" >> etc/inittab
echo "::askfirst:-/bin/sh" >> etc/inittab
echo "::cttlaltdel:/bin/umount -a -r" >> etc/inittab

chmod 755 etc/inittab

cd dev

mknod console c 5 1
mknod null c 1 3
mknod tty1 c 4 1

cd ../..

rm -rf rootfs.ext3
rm -rf fs

dd if=/dev/zero of=rootfs_ext4.img bs=1M count=256
mkfs.ext4 rootfs_ext4.img
mkdir -p tmpfs
mount -t ext4 rootfs_ext4.img tmpfs/ -o loop
cp -af _install/* tmpfs/
umount tmpfs
rm -rf tmpfs
chmod 777 rootfs_ext4.img

cp rootfs_ext4.img /home/workspace/qemu-machine/kernel-5.9.2/linux-5.9.2/

exit

#然后通过以下执行将文件系统打包成gzip包
dd if=/dev/zero of=./rootfs.ext3 bs=1M count=32
mkfs.ext3 rootfs.ext3
mkdir fs
mount -o loop rootfs.ext3 ./fs
cp -rf ./_install/* ./fs
umount ./fs
gzip --best -c rootfs.ext3 > rootfs.img.gz

记得使用root权限运行这个脚本,成功之后可以看到有文件生成:

启动你的arm虚拟机

将riitfs_ext4.img复制到内核编译目录下,然后用下面脚本开启虚拟机

case "$1" in
  debug)
    # Start linux kernel with debug mode
    echo "Starting linux kernel with debug mode!(gdb)"
    /home/workspace/qemu-machine/qemu-project/qemu/aarch64-softmmu/qemu-system-aarch64 -s -S -machine virt -cpu cortex-a57 -machine type=virt -m 1024 -smp 2 -nographic -kernel arch/arm64/boot/Image -drive format=raw,file=./rootfs_ext4.img -append "noinitrd root=/dev/vda rw console=ttyAMA0 loglevel=8 initcall_debug" -fsdev local,id=kmod_dev,path=$PWD/kmodules,security_model=none -device virtio-9p-device,fsdev=kmod_dev,mount_tag=kmod_mount
    ;;
  dtb)
    # Start linux kernel with dtb image
    echo "Start linux kernel with dtb file!"
    /home/workspace/qemu-machine/qemu-project/qemu/aarch64-softmmu/qemu-system-aarch64 -s -S -machine virt -cpu cortex-a57 -machine type=virt -m 1024 -smp 2 -nographic -kernel arch/arm64/boot/Image -dtb arch/arm64/boot/dts/freescale/imx8mq-evk.dtb -drive format=raw,file=./rootfs_ext4.img -append "noinitrd root=/dev/vda rw console=ttyAMA0 loglevel=8 initcall_debug" -fsdev local,id=kmod_dev,path=$PWD/kmodules,security_model=none -device virtio-9p-device,fsdev=kmod_dev,mount_tag=kmod_mount
    ;;
  help)
    # help information
    echo "Invalid argument. Usage: myscript {start|stop|restart}"
    ;;
  *)
    #default mode
    echo "Starting linux kernel!"
    /home/workspace/qemu-machine/qemu-project/qemu/aarch64-softmmu/qemu-system-aarch64 -machine virt -cpu cortex-a57 -machine type=virt -m 1024 -smp 2 -nographic -kernel arch/arm64/boot/Image -drive format=raw,file=./rootfs_ext4.img -append "noinitrd root=/dev/vda rw console=ttyAMA0 loglevel=8" -fsdev local,id=kmod_dev,path=$PWD/kmodules,security_model=none -device virtio-9p-device,fsdev=kmod_dev,mount_tag=kmod_mount
    ;;
esac

中间可能会出现各种问题,需要你自己去把他解决掉

  • 8
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值