FPGA開発日記

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

RISC-VのLinuxブート環境をbuildrootで構築する

RISC-V向けLinuxのビルド環境として、buildrootを使用したいのだがどうも安定してビルドできる環境の資料がないので、自分で環境を作ることにした。

自分はWSL上で作業しているのだが、環境変数の設定など少し厄介なところがあるので、せっかくなのでDockerfile上に構築することにした。

https://github.com/msyksphinz-self/riscv-buildroot-linux

https://hub.docker.com/repository/docker/msyksphinz/buildroot

以下のようなフローでbuildrootの構築はできる。ポイントはbuildrootのダウンロードとvirt向けのMakefileの構築だ。

FROM ubuntu:22.04

# -----------------------------
# Ubuntu Package Update
# -----------------------------
RUN apt update

RUN apt install -y git python3 make autoconf g++ device-tree-compiler pkg-config

RUN apt install -y libglib2.0-dev
RUN apt install -y libpixman-1-dev
RUN apt install -y ninja-build

WORKDIR /work-buildroot/

# -------------------
# Build QEMU Package
# -------------------

WORKDIR /work-buildroot/
RUN git clone https://github.com/qemu/qemu
WORKDIR /work-buildroot/qemu
RUN ./configure --target-list=riscv64-softmmu
RUN make -j $(nproc)
RUN make install

# ----------------
# Buildroot Build
# ----------------
WORKDIR /work-buildroot/
RUN git clone https://github.com/buildroot/buildroot.git
WORKDIR /work-buildroot/buildroot/
RUN make qemu_riscv64_virt_defconfig
RUN apt install -y file wget cpio unzip rsync bc
RUN make -j 10

これで、/work/buildroot/output/Linuxビルド用のファイルが生成されるが、Docker内で構築しているためホスト上で実行することができない。 よって、以下のスクリプトで生成物を回収することにした。

DOCKER_NAME := $(shell bash -c 'echo $$RANDOM')
DOCKER_ID := $(shell docker ps -aqf "name=$(DOCKER_NAME)")

copy:
        docker cp $(DOCKER_ID):/work-buildroot/buildroot/output .
        docker kill $(DOCKER_NAME)

これで、/work-buildroot/buildroot/output/内の生成物を回収することができる。 ホストマシン上でQEMUを使ってbuildrootのLinuxを実行することができるようになった。

run-qemu:
        ./qemu/riscv64-softmmu/qemu-system-riscv64 \
                -bios ./output/images/fw_jump.elf \
                -nographic -machine virt -kernel ./output/images/Image \
                -append "root=/dev/vda ro console=ttyS0" \
                -drive file=./output/images/rootfs.ext2,format=raw,id=hd0 -device virtio-blk-device,drive=hd0 \
                -netdev user,id=net0 -device virtio-net-device,netdev=net0
$ make run-qemu
OpenSBI v0.9
   ____                    _____ ____ _____
  / __ \                  / ____|  _ \_   _|
 | |  | |_ __   ___ _ __ | (___ | |_) || |
 | |  | | '_ \ / _ \ '_ \ \___ \|  _ < | |
 | |__| | |_) |  __/ | | |____) | |_) || |_
  \____/| .__/ \___|_| |_|_____/|____/_____|
        | |
        |_|

Platform Name             : riscv-virtio,qemu
Platform Features         : timer,mfdeleg
Platform HART Count       : 1
Firmware Base             : 0x80000000
Firmware Size             : 124 KB
Runtime SBI Version       : 0.2

Domain0 Name              : root
Domain0 Boot HART         : 0
Domain0 HARTs             : 0*
Domain0 Region00          : 0x0000000080000000-0x000000008001ffff ()
Domain0 Region01          : 0x0000000000000000-0xffffffffffffffff (R,W,X)
Domain0 Next Address      : 0x0000000080200000
Domain0 Next Arg1         : 0x0000000082200000
Domain0 Next Mode         : S-mode
Domain0 SysReset          : yes

Boot HART ID              : 0
Boot HART Domain          : root
Boot HART ISA             : rv64imafdcsu
Boot HART Features        : scounteren,mcounteren,time
Boot HART PMP Count       : 16
Boot HART PMP Granularity : 4
Boot HART PMP Address Bits: 54
Boot HART MHPM Count      : 0
Boot HART MHPM Count      : 0
Boot HART MIDELEG         : 0x0000000000000222
Boot HART MEDELEG         : 0x000000000000b109
[    0.000000] Linux version 5.15.43 (root@buildkitsandbox) (riscv64-buildroot-linux-gnu-gcc.br_real (Buildroot 2022.08-353-geedd93f010) 11.3.0, GNU ld (GNU Binutils) 2.38) #1 SMP Sun Sep 25 06:40:33 UTC 2022
[    0.000000] OF: fdt: Ignoring memory range 0x80000000 - 0x80200000
[    0.000000] Machine model: riscv-virtio,qemu
[    0.000000] efi: UEFI not found.
[    0.000000] Zone ranges:
[    0.000000]   DMA32    [mem 0x0000000080200000-0x0000000087ffffff]
...
Starting network: udhcpc: started, v1.35.0
udhcpc: broadcasting discover
udhcpc: broadcasting select for 10.0.2.15, server 10.0.2.2
udhcpc: lease of 10.0.2.15 obtained from 10.0.2.2, lease time 86400
deleting routers
adding dns 10.0.2.3
OK

Welcome to Buildroot
buildroot login:
...