Skip to content

Run linux on qemu-system-aarch64

Posted on:November 23, 2024

以下測試環境為 Macbook pro 2014, OSX 10.15.6 運行 ubuntu 20.04 on parallels

主要有三個部分要建立,分別是

先安裝些基本工具

sudo apt-get install build-essential gcc-aarch64-linux-gnu libncurses5-dev libssl-dev

Rootfs

為了建立 rootfs,我選擇使用 buildroot,他可以快建立 embedded system 常用的東西 ex. rootfs, busybox.

先將 buildroot repo clone 下來

git clone git://git.buildroot.net/buildroot

接著利用 menuconfig 選則 config

make menuconfig

開啟下列選項

接著下 make 出 rootfs, build 出來的 image 會在 output/images/rootfs.cpio,記住這個路徑接下來會用到。

make

Linux kernel

將 linux kernel 載回

git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git

先選擇要使用的 kernel config,config 位置在 arch/arm64/configs 底下,可先使用已有的 defconfig,對 kernel 較熟後可以再依需求開關。個人習慣建一個資料夾 out 放編譯出的東西,因此參數加上 O=out。要編譯的目標平台是 arm64,也須在 make 的參數中指定。

make O=out ARCH=arm64 defconfig

此時可以看到 out 資料夾下出現 .config,這就是從 defconfig 產生的完整 config 檔。

接著用 menuconfig 開啟必要的 config

make O=out ARCH=arm64 menuconfig

出現選單後可用 ’/’ 尋找 config 位置並開啟下面這幾個 config ,搜尋時輸入 COINFIG 名稱即可。 ex. 想開啟 CONFIG_PCI,搜尋時直接搜 “PCI”。接著設定 cmdline & init ramfs,cmdline 設 “console-ttyAMA0” 對應到 buildroot 編譯時選的 config,init ramfs 則是 buildroot 編出 的 output/images/rootfs.cpio。

CONFIG_DEVTMPFS=y
CONFIG_DEVTMPFS_MOUNT=y

CONFIG_CMDLINE="console-ttyAMA0"
CONFIG_INITRAMFS_SOURCE="/home/yun/workspace/buildroot/output/images/rootfs.cpio"

CONFIG_PCI=y
CONFIG_VIRTIO_PCI=y
CONFIG_PCI_HOST_GENERIC=y
CONFIG_NET_9P=y
CONFIG_NET_9P_VIRTIO=y
CONFIG_NET_9P_DEBUG=y (Optional)
CONFIG_9P_FS=y
CONFIG_9P_FS_POSIX_ACL=y

將 config 存好後就下 make 編譯吧!記得指定 cross compile 的 compiler。編完可以看到 out 下產生很多檔案。

make O=out ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu-

Qemu

Ubuntu 可以直接靠 apt-get 安裝。

sudo apt-get install qemu

Launch qemu

用下面 command 啟動 qemu,記得將 kernel 位置改成你 build 出來的 image 路徑,路徑為 out/arch/arm64/boot/Image

qemu-system-aarch64 \
        -machine virt,virtualization=true,gic-version=3 \
        -nographic \
        -m size=1024M \
        -cpu cortex-a57 \
        -smp 2 \
        -kernel /home/yun/workspace/linux/out/arch/arm64/boot/Image \
        --append "console=ttyAMA0"

linux 就被帶起來,login 時輸入 root 即可。

 [    0.000000] Booting Linux on physical CPU 0x0000000000 [0x411fd070]
[    0.000000] Linux version 5.9.0-mainline-dirty (yun@ubuntu) (aarch64-linux-gnu-gcc (Ubuntu 9.3.0-17ubuntu1~20.04) 9.3.0, GNU ld (GNU Binutils for Ubuntu) 2.34) #16 SMP PREEMPT Fri Dec 11 15:33:21 CST 2020
[    0.000000] Machine model: linux,dummy-virt
[    0.000000] efi: UEFI not found.
[    0.000000] cma: Reserved 16 MiB at 0x000000007f000000
[    0.000000] Zone ranges:
[    0.000000]   DMA      [mem 0x0000000040000000-0x000000007fffffff]
[    0.000000]   DMA32    empty
[    0.000000]   Normal   empty
[    0.000000] Movable zone start for each node
[    0.000000] Early memory node ranges
[    0.000000]   node   0: [mem 0x0000000040000000-0x000000007fffffff]
[    0.000000] Initmem setup node 0 [mem 0x0000000040000000-0x000000007fffffff]
...
Welcome to Buildroot
buildroot login: root

Exit qemu

ctrl-A X

Share Folder

使用 qemu 有時想 host/geust 可以共用資料夾。可以利用下面的 command 設定 (需要的 config 在一開始已經開啟)。fsdev 的 path 就是你想要共用的資料夾

qemu-system-aarch64 \
        -machine virt,virtualization=true,gic-version=3 \
        -nographic \
        -m size=1024M \
        -cpu cortex-a57 \
        -smp 2 \
        -kernel /home/yun/workspace/linux/out/arch/arm64/boot/Image \
        -fsdev local,security_model=passthrough,id=test_dev,path=/home/yun/workspace/qemu/share \
       -device virtio-9p-pci,id=fsdev0,fsdev=test_dev,mount_tag=test_mount \
        --append "console=ttyAMA0"

進入 guest OS 後將共用資料夾掛載起來即可。

mount -t 9p -o trans=virtio test_mount /mnt

Related Posts