FPGA開発日記

カテゴリ別記事インデックス https://msyksphinz.github.io/github_pages , English Version https://fpgadevdiary.hatenadiary.com/

RISC-V LinuxをBusyBox付きでビルドするDocker環境の構築 (1. Dockerfileの作成)

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