やりたいこと
64bit RISC-VプロセッサをエミュレートするQEMU上でlinuxをブートさせたい。ユーザーランドは最低限のbusybox環境で済ます。とりあえず記憶と他サイトの記述から抜粋してメモ書き。細かいところは間違っているかもしれないので後で更新する。
環境
- Ubuntu 22.04LTS
- QEMU 6.2.0
- linux kernel v5.8
- busybox (マスター使っちゃった)
手順
1. クロスコンパイル用のツールを準備
https://toolchains.bootlin.com/ からarch = riscv64、libc = glibc を選択してダウンロード、展開。パスを通す。その他の方法でも良い。
2. linuxカーネルのビルド
% git clone --depth=1 -b v5.8 https://github.com/torvalds/linux
% cd linux
% make ARCH=riscv CROSS_COMPILE=riscv64-linux- defconfig
% make ARCH=riscv CROSS_COMPILE=riscv64-linux- menuconfig
% make ARCH=riscv CROSS_COMPILE=riscv64-linux- all
3. busyboxのビルド
% cd ..
% git clone https://git.busybox.net/busybox
% cd busybox
% make CROSS_COMPILE=riscv64-linux- defconfig
% make CROSS_COMPILE=riscv64-linux- menuconfig
menuconfigにおいて、以下のオプションのオンにしてstatic binaryを生成する。
Settings
Build Options
[*] Build static binary (no shared libs)
ビルドとインストール。
% make CROSS_COMPILE=riscv64-linux- all
% make CROSS_COMPILE=riscv64-linux- install
4. ルートファイルシステムの作成
% cd ..
% dd if=/dev/zero of=root.bin bs=1M count=64
% mkfs.ext2 -F root.bin
% mkdir mnt
% sudo mount -o loop root.bin mnt
% sudo cp -r busybox/_install/* mnt/
% cd mnt
% sudo mkdir dev etc proc run sys
% cd dev
% sudo cp -a /dev/console .
% sudo cp -a /dev/tty[0-4] .
% cd ../..
% sudo umount mnt
5. QEMU導入と起動
QEMUはapt-getで入れた。
% qemu-system-riscv64 -M virt -nographic -kernel linux/arch/riscv/boot/Image -append "root=/dev/vda rw console=ttyS0" -drive file=root.bin,format=raw,id=hd0 -device virtio-blk-device,drive=hd0