获取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动作,而部分仓库又需要翻墙。
不过好在我已经下载了一份完整的,你们只要去这里下载即可:
内核代码获取与编译
这里使用的是5.9.2的内核,可以clone下来,也可以从下面的地址下载:
内核编译
在开始编译之前,需要先指定一下默认的内核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
中间可能会出现各种问题,需要你自己去把他解决掉