RISC-V Linuxのビルド環境を構築するにあたり、以下の目標を設定した。
- RISC-V LinuxカーネルとBusyBoxを自前でビルドし、QEMU上で動作させる
- ホスト環境を汚さず、Dockerコンテナ内で完結させる
- なるべく自動化して、再現性の高い環境を構築する
2. Dockerfileの構築
まずはベースとなるDockerfileを用意する。
Ubuntu 24.04をベースに、RISC-VツールチェインやLinuxビルドに必要なパッケージを一通りインストールする必要がある。
2.1 ベースイメージとパッケージのインストール
FROM ubuntu:24.04 # 必要なパッケージをインストール RUN apt-get update && apt-get install -y \ git \ make \ autoconf \ automake \ libtool \ build-essential \ device-tree-compiler \ cpio \ libssl-dev \ wget \ bc \ flex \ bison \ python3 \ curl \ autotools-dev \ python3-pip \ python3-tomli \ libmpc-dev \ libmpfr-dev \ libgmp-dev \ gawk \ texinfo \ gperf \ patchutils \ bc \ zlib1g-dev \ libexpat-dev \ ninja-build \ cmake \ libglib2.0-dev \ libslirp-dev \ sudo \ && apt-get clean
2.2 環境変数の設定
# Environment ENV RISCV=/opt/riscv ENV PATH=$RISCV/bin:$PATH ENV LD_LIBRARY_PATH=$RISCV/lib RUN mkdir -p $RISCV WORKDIR /linux_riscv/
2.3 RISC-Vツールチェインのインストール
RISC-V GNUツールチェインをダウンロードしてインストールする。
# Download riscv64-unknown-linux-gnu-gcc RUN cd $RISCV/../ && \ curl -L https://github.com/riscv-collab/riscv-gnu-toolchain/releases/download/2025.05.10/riscv64-glibc-ubuntu-24.04-gcc-nightly-2025.05.10-nightly.tar.xz | tar Jx
2.4 Spikeのビルド
RISC-Vのリファレンス実装であるSpikeをビルドする。
# Build Spike RUN git clone https://github.com/riscv-software-src/riscv-isa-sim.git && \ cd riscv-isa-sim && \ mkdir -p build && cd build && \ ../configure --prefix=$RISCV && \ make -j$(nproc) && make install && \ cd ../ && rm -rf build
2.5 QEMUのビルド
QEMU v9.2.4をビルドする。RISC-V 64bitのエミュレーションに特化した設定を行う。
# Build QEMU (v9.2.4) RUN git clone https://github.com/qemu/qemu.git --depth=1 -b v9.2.4 && \ cd qemu && \ mkdir -p build && cd build && \ ../configure --target-list=riscv64-softmmu --prefix=$RISCV && \ make -j$(nproc) && make install && \ cd ../ && rm -rf build
2.6 BusyBoxのビルドとルートファイルシステムの作成
BusyBox v1.36.0をビルドし、ルートファイルシステムを作成する。
RUN apt-get update && apt-get install -y \ libncurses-dev # Download BusyBox and create rootfs.cpio (v1.36.0) RUN git clone https://git.busybox.net/busybox --depth=1 -b 1_36_0 && \ cd busybox && \ CROSS_COMPILE=riscv64-unknown-linux-gnu- make defconfig && \ sed -i 's|# CONFIG_STATIC is not set|CONFIG_STATIC=y|g' .config && \ CROSS_COMPILE=riscv64-unknown-linux-gnu- make -j$(nproc) && \ CROSS_COMPILE=riscv64-unknown-linux-gnu- make install -j$(nproc) CONFIG_PREFIX=/linux_riscv/rootfs RUN echo "#!/bin/sh\nmount -t proc none /proc\nexec /bin/sh" > /linux_riscv/rootfs/init && chmod +x /linux_riscv/rootfs/init RUN cd /linux_riscv/rootfs && \ find . -print0 | cpio --null -ov --format=newc > /linux_riscv/rootfs.cpio
2.7 Linuxカーネルのビルド
Linux v6.9をビルドする。先ほど作成したルートファイルシステムを組み込む。
# Build Linux (v6.9) RUN git clone --depth=1 https://github.com/torvalds/linux.git -b v6.9 && \ cd linux && \ make ARCH=riscv defconfig && \ sed -i 's|CONFIG_INITRAMFS_SOURCE=""|CONFIG_INITRAMFS_SOURCE="/linux_riscv/rootfs.cpio"|g' .config && \ make ARCH=riscv CROSS_COMPILE=riscv64-unknown-linux-gnu- -j$(nproc)
2.8 OpenSBIのビルド
最後に、OpenSBI v1.6をビルドする。Linuxカーネルイメージをペイロードとして組み込む。
# Build OpenSBI (v1.6) RUN git clone https://github.com/riscv-software-src/opensbi.git --depth 1 -b v1.6 && \ cd opensbi && \ make CROSS_COMPILE=riscv64-unknown-linux-gnu- \ PLATFORM=generic FW_PAYLOAD_PATH=/linux_riscv/linux/arch/riscv/boot/Image