Skip to the content.

Qemu - 在ARM64上运行系统

1.安装依赖

$ sudo apt install build-essential bc flex bison gawk texinfo file tree curl wget unzip libncurses5-dev libssl-dev git ssh libc6-dev
$ sudo apt install gcc-10-aarch64-linux-gnu
$ sudo apt install qemu-system-aarch64

2.下载资源

kernel:

https://kernel.org/

busybox:

https://busybox.net/downloads/

3.编译内核

$ tar -xvf linux-5.10.7.tar.xz
$ cd linux-5.10.7/
$ make defconfig ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu-
$ make -j4 ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu-

4.制作根文件系统

4.1 创建rootfs文件夹

$ mkdir rootfs

4.2 解压busybox

$ tar -xvf busybox-1.33.1.tar.bz2
$ cd busybox-1.33.1/

4.3 配置config

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

做如下修改:

// 勾选编译静态库
Settings  --->
    [*] Build static binary (no shared libs)

4.4 编译

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

4.5 创建根文件系统

$ cp -rf busybox-1.33.1/_install/* ./rootfs
$ cd ./rootfs/
$ mkdir lib proc tmp dev home etc sys opt mnt
$ mkdir -p etc/init.d

4.6 安装modules

非必要时,建议跳过此步,因为文件量很大,此步骤影响驱动相关内容。

$ cd linux-5.10.7/
$ make ARCH=arm64 modules_install INSTALL_MOD_PATH=../rootfs

4.7 添加rcS

$ cd rootfs/etc/init.d
$ touch rcS
$ chmod a+x rcS
$ vim rcS

添加如下内容:

echo "---------------------------"
echo "--------hello world--------"
echo "---------------------------"

4.8 复制动态库

前面步骤有安装gcc-10-aarch64-linux-gnu,我们把它的库复制到根文件系统。

$ sudo cp -rf /usr/aarch64-linux-gnu/lib/* ./rootfs/lib/

4.9 创建设备节点

$ cd rootfs/dev/
$ sudo mknod -m 664 tty1 c 4 1
$ sudo mknod -m 664 tty2 c 4 2
$ sudo mknod -m 664 tty3 c 4 3
$ sudo mknod -m 664 tty4 c 4 4
$ sudo mknod -m 664 console c 5 1
$ sudo mknod -m 664 null c 1 3

4.10 打包文件系统

# count值根据实际rootfs大小定,如果没有执行4.6步骤,128应该够用,否则应该需要很多,比如1024.
$ dd if=/dev/zero of=rootfs.ext4 bs=1M count=1024
$ mkfs.ext4 rootfs.ext4
$ sudo mount rootfs.ext4 /mnt/ -o loop
$ sudo cp -rf rootfs/* /mnt/
$ sudo umount /mnt/

5. 测试系统

编写启动脚本:

$ touch boot.sh
$ chmod a+x boot.sh

修改为如下内容:

#!/bin/sh

qemu-system-aarch64 \
    -M virt \
    -cpu cortex-a53 \
    -nographic \
    -smp 1 \
    -m 512M \
    -kernel linux-5.10.7/arch/arm64/boot/Image \
    -append "rootwait root=/dev/vda rw console=ttyAMA0" \
    -netdev user,id=eth0 \
    -device virtio-net-device,netdev=eth0 \
    -drive file=rootfs.ext4,if=none,format=raw,id=hd0 \
    -device virtio-blk-device,drive=hd0

如果顺利的话,就可以正常进入系统了。