関連記事
- Raspberry Pi 3Bの場合は こちら
- Raspberry Pi 3B (U-Boot)の場合は こちら
概要
Raspberry Pi 4 Model BからLinuxカーネル (Raspbian)をネットワークブートするための環境を構築する方法を解説する。
Raspberry Pi 用カーネルのLinux Kernel 5.10をビルドし、ルートファイルシステムに必要なパッケージをインストールする。
Raspberry Pi 4 Model Bは、SDカードを挿入せずにネットワーク上にあるネットワークサーバからブートイメージとルートファイルシステムを取得する。
はじめに
Raspberry Pi 4 Model B (Raspberry Pi 4) は安価に手に入るシングルボードコンピュータとして広く利用されている。
Raspberry Pi は、DebianベースOSのRaspberry Pi OSが搭載されている。
そのため、組込みLinuxの動作確認用のボードとして手軽に使うことができる。
そして、組込みシステムの開発段階やデバッグ段階では、ネットワーク経由からシステムを起動(ネットワークブート)できることが理想的である。 Raspberry Pi 4では、ネットワーク経由からブートイメージの取得ルートファイルシステムのマウントして起動させることができる。
そこで、本記事ではRaspberry Pi 用カーネルのLinux Kernel 5.10を自前でビルドして、ネットワークブートを利用して起動する方法を記載する。
また、作成する環境でdm-verityとfs-verityが使えるようにセットアップする。
実行環境
下記の環境を使用して説明する。
開発用セグメントに、使用するRaspberry Pi 4 Model Bを接続する。
ネットワークブートサーバの詳細は下記のとおりである。
名前 | 詳細 |
---|---|
OS | Ubuntu 20.04.01 LTS |
Kernel | 5.4.0-58-generic |
IPアドレス (eth0) | 192.168.1.11 |
IPアドレス (eth1) | 172.16.1.1 |
ユーザ名 | leava |
ホスト名 | server |
Raspberry Pi 4のブートイメージ格納予定 | /srv/boot |
Raspberry Pi 4のルートファイルシステム格納予定 | /srv/rootfs |
計測対象のRaspberry Pi 4 Model Bの詳細は下記のとおりである。
名前 | 詳細 |
---|---|
Hardware | Raspberry Pi 4 Model B Rev 1.2 (4GB) |
OS | Raspbian GNU/Linux 10 (buster) |
Kernel | Linux version 5.10.3-v7l+ |
SDカード | HDMCSDH16GCL10UIJP-WOA |
USBメモリ | SILICON POWER SP032GBUF3B02V1K |
IPアドレス (eth0) | 172.16.1.3 |
ユーザ名 | pi |
ホスト名 | raspberry |
構築手順
Raspbian GNU/Linux 10 (buster)は、Linux Kernel 5.4.79ベースのOSとなっている。
この記事では、Linux Kernel 5.10.3を自前でビルドする。
ここでは、次回以降の検証のためにdm-verityとfs-verity関連のコンフィグを有効化しているので、不要の人はスキップしてほしい。
ネットワークブートへの対応
ネットワークブートサーバの構築方法については気になる方は、下記のページを参照してほしい。
必要パッケージのインストール
pi@raspberrypi:~ $ sudo apt update pi@raspberrypi:~ $ sudo apt full-upgrade pi@raspberrypi:~ $ sudo apt install rpi-eeprom
EEPROM のアップデート (著者の環境は既にアップデート済み状態)
pi@raspberrypi:~ $ sudo rpi-eeprom-update BCM2711 detected Dedicated VL805 EEPROM detected BOOTLOADER: up-to-date CURRENT: 2020年 12月 11日 金曜日 11:15:17 UTC (1607685317) LATEST: 2020年 12月 11日 金曜日 11:15:17 UTC (1607685317) FW DIR: /lib/firmware/raspberrypi/bootloader/stable VL805: up-to-date CURRENT: 000138a1 LATEST: 000138a1
既存のEEPROMの設定を確認する
pi@raspberrypi:~ $ vcgencmd bootloader_config [all] BOOT_UART=0 BOOT_ORDER=0x1
EEPROMの設定を更新する
pi@raspberrypi:~ $ sudo raspi-config ->6 Advanced Options Configure advanced settings -> A6 Boot Order Choose network or USB device boot -> B2 Network Boot Boot from network if SD card boot fails
EEPROMの設定が更新されていることを確認する
pi@raspberrypi:~ $ vcgencmd bootloader_config [all] BOOT_UART=0 BOOT_ORDER=0xf21
起動させるカーネルイメージを用意する。公式イメージの「Raspberry Pi OS Lite」から抽出する。
leava@server:~ $ wget https://downloads.raspberrypi.org/raspios_lite_armhf/images/raspios_lite_armhf-2020-12-04/2020-12-02-raspios-buster-armhf-lite.zip leava@server:~ $ unzip 2020-12-02-raspios-buster-armhf-lite.zip leava@server:~ $ sudo kpartx -av 2020-12-02-raspios-buster-armhf-lite.img add map loop4p1 (253:0): 0 524288 linear 7:4 8192 add map loop4p2 (253:1): 0 3096576 linear 7:4 532480 leava@server:~ $ sudo mount /dev/mapper/loop4p1 /mnt/boot leava@server:~ $ sudo mount /dev/mapper/loop4p2 /mnt/rootfs leava@server:~ $ sudo rsync -av /mnt/boot/ /srv/boot/ leava@server:~ $ sudo rsync -av /mnt/rootfs/ /srv/rootfs/ leava@server:~ $ sudo umount /mnt/boot leava@server:~ $ sudo umount /mnt/rootfs leava@server:~ $ sudo kpartx -d 2020-12-02-raspios-buster-armhf-lite.img leava@server:~ $ sudo mv /srv/tftpboot/cmdline.txt /srv/tftpboot/cmdline.txt.old leava@server:~ $ echo "console=serial0,115200 console=tty1 root=/dev/nfs nfsroot=172.16.1.1:/srv/rootfs,vers=3,proto=tcp rw ip=dhcp rootwait elevator=deadline" | sudo tee /srv/tftpboot/cmdline.txt
Raspberry Pi 4 のSDカードを抜去して、電源を再投入する
カーネルをビルド
公式ページのCross-compileを参考に32-bit カーネルをビルドする。
ビルドに必要なパッケージをインストール
leava@server:~ $ sudo apt install git bc bison flex libssl-dev make libc6-dev libncurses5-dev crossbuild-essential-armhf
Raspberry Pi 公式のカーネルソースをダウンロードする
leava@server:~ $ git clone --depth=1 --branch rpi-5.10.y https://github.com/raspberrypi/linux
デフォルトのコンフィグを生成する
leava@server:~ $ cd linux leava@server:~/linux $ KERNEL=kernel7l leava@server:~/linux $ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- bcm2711_defconfig
コンフィグを修正する (fs-verityとdm-verityの有効化)
leava@server:~/linux $ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig File systems ---> [*] FS Verity (read-only file-based authenticity protection) [*] FS Verity builtin signature support Device Drivers ---> [*] Multiple devices driver support (RAID and LVM) ---> <*> Device mapper support [*] Device mapper debugging support <*> Verity target support [*] Verity data device root hash signature verification support
カーネルのビルド
leava@server:~/linux $ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j$(nproc) zImage modules dtbs
カーネルモジュールのインストール
leava@server:~/linux $ sudo env PATH=$PATH make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- INSTALL_MOD_PATH=/srv/rootfs modules_install
カーネルイメージのインストール
leava@server:~/linux $ sudo cp arch/arm/boot/zImage /srv/boot/$KERNEL.img leava@server:~/linux $ sudo cp arch/arm/boot/dts/*.dtb /srv/boot leava@server:~/linux $ sudo cp arch/arm/boot/dts/overlays/*.dtb* /srv/boot/overlays/ leava@server:~/linux $ sudo cp arch/arm/boot/dts/overlays/README /srv/boot/overlays/
ルートファイルシステムの更新
QEMUを利用して、ルートファイルシステムに必要なパッケージをインストールする。
必要なパッケージをインストール
leava@server:~ $ sudo apt-get install qemu-user-static
Raspberry Pi 4B の ルートファイルシステム にユーザモードエミュレータをコピーする
leava@server:~ $ sudo update-binfmts --display | grep arm qemu-arm (enabled): interpreter = /usr/bin/qemu-arm-static qemu-armeb (enabled): interpreter = /usr/bin/qemu-armeb-static leava@server:~ $ sudo cp /usr/bin/qemu-arm-static /srv/rootfs/usr/bin/
chroot
でルートファイルシステムを変更するための準備leava@server:~ $ sudo mount -t sysfs sysfs arm/raspbian/sys leava@server:~ $ sudo mount -t proc proc arm/raspbian/proc leava@server:~ $ sudo mount -t devtmpfs udev arm/raspbian/dev leava@server:~ $ sudo mount -t devpts devpts arm/raspbian/dev/pts
chroot
でルートファイルシステムを変更するleava@server:~ $ sudo chroot /srv/rootfs/ /usr/bin/bash root@server:/# root@mainserver:/# lsb_release -a No LSB modules are available. Distributor ID: Raspbian Description: Raspbian GNU/Linux 10 (buster) Release: 10 Codename: buster
Raspberry Pi 4用のrootfsにに最低限の設定をする
root@server:/# systemctl enable ssh.service
Raspberry Pi 4用のrootfsに必要最低限のパッケージをインストールする
root@server:/# apt-get install libssl-dev fio root@server:/# wget https://git.kernel.org/pub/scm/linux/kernel/git/ebiggers/fsverity-utils.git/snapshot/fsverity-utils-1.2.tar.gz root@server:/# tar xf fsverity-utils-1.2.tar.gz root@server:/# cd fsverity-utils-1.2 root@server:/fsverity-utils-1.2# make && make install
実行結果
- Raspberry Pi 4 の電源を再投入する
シリアルコンソール経由でアクセスする。
Raspbian GNU/Linux 10 raspberrypi ttyS0 raspberrypi login: root Password: Last login: Thu Dec 3 16:27:35 GMT 2020 on ttyS0 Linux raspberrypi 5.10.3-v7l+ #1 SMP Mon Dec 28 05:53:15 UTC 2020 armv7l The programs included with the Debian GNU/Linux system are free software; the exact distribution terms for each program are described in the individual files in /usr/share/doc/*/copyright. Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent permitted by applicable law. SSH is enabled and the default password for the 'pi' user has not been changed. This is a security risk - please login as the 'pi' user and type 'passwd' to set a new password. Wi-Fi is currently blocked by rfkill. Use raspi-config to set the country before use. root@raspberrypi:~#
おわりに
本記事ではRaspberry Pi 用カーネルのLinux Kernel 5.10を自前でビルドして、ネットワークブートを利用して起動する方法を記載する。
次回は、作成した環境でdm-verityとfs-verityの使い方について確認する。
変更履歴
- 2021/1/1: 記事公開
- 2021/2/22: dm-verityとfs-verityの記事は別記事で管理する
参考
- Raspberry Pi Documentation - The Linux kernel
- Raspberry Pi 用カーネルをビルドする方法
- Raspberry Pi Documentation - Raspberry Pi Hardware
- Raspberry Pi 4のEEPROMブート
- Raspberry Pi のセルフビルド環境を QEMU で作る - Qiita
- Raspberry Pi用rootfsを更新する方法
- Raspberry Pi 4 を PXE + SSD Boot する - takutakahashi.dev
- Raspberry Pi 4でPXE bootする
- Raspberry Pi 4がPXEブートに正式対応していた - あっきぃ日誌
- Raspberry Pi 4でPXE bootする