初めに
前回の投稿でbusybox単体でinitramfsを動かすところまでは確認した。
しかし、現状のinitramfsにはbusybox以外が何も入っていないため、何らかの処理を行うにはほかのライブラリやツールをインストールする必要がある。
そこで今回は、インストールを簡単に行うためにbuildrootを使用して作成したrootfsをinitramfsで使えないか試してみる。
手順
Buildroot動作確認
Buildrootは初使用のため、まずはあまり設定の変更などはしないで動かしてみる。
ラズパイ用のdefconfigが用意されているので、そのまま使って起動させる。
mkdir ~/initramfs-buildroot && cd ~/initramfs-buildroot wget https://buildroot.org/downloads/buildroot-2024.02.3.tar.gz tar xf buildroot-2024.02.3.tar.gz cd buildroot-2024.02.3 make raspberrypi4_64_defconfig make
結果はoutput
に格納されている。
どうやらoutput/images/sdcard.img
がsdカードイメージのようなので、これをsdカードに焼く。
ラズパイで起動すると以下のようにログインできる状態になることを確認できた。
Starting network: [ 3.555057] bcmgenet fd580000.ethernet: configuring instance for external RGMII (RX delay) [ 3.564719] bcmgenet fd580000.ethernet eth0: Link is Down udhcpc: started, v1.36.1 udhcpc: broadcasting discover udhcpc: no lease, forking to background OK Welcome to Buildroot buildroot login:
Buildrootでパッケージ追加
ビルド環境に戻ってパッケージを追加してみる。
後にdm-verityを触りたいので、cryptsetupを追加してみる。raspberrypi4_64_defconfig
に設定を追加してビルドする。
echo "BR2_PACKAGE_CRYPTSETUP=y" >> configs/raspberrypi4_64_defconfig make raspberrypi4_64_defconfig make
キャッシュが残っているので初回よりはビルドが早い。
動作確認すると、cryptsetupコマンドが使えることを確認できた。
initramfsとして動かすための仕込み
次にこのrootfsをinitramfsにする。
Buildrootで作成したrootfsはoutput/target
に存在する。
ここにinitrafsで必要なファイルを追加していく。ここら辺の手順は前回行ったのとほぼ同様。
初めにinitを用意する。linuxrc
は不要なので削除し、代わりにinit
を作成する。
cd output/target rm linuxrc touch init chmod +x init
initの内容は以下とする。
前回からの変更点として、rootfsとして使用するパーティションを/proc/cmdline
から取得するようにしている。
#!/bin/sh mount -v --bind /dev /dev mount -v --bind /dev/pts /dev/pts mount -vt proc proc /proc mount -vt sysfs sysfs /sys mount -vt tmpfs tmpfs /run mdev -s echo "start switch_root!" # parse cmdline cmdline=$(cat /proc/cmdline) for param in $cmdline; do case $param in root=*) ROOT=`echo $param | sed 's/.*=//'` ;; esac done # wait rootfs for i in {1..5} do /sbin/mdev -s TMP=`ls -l /dev/ | grep $ROOT` if [ -n "${TMP}" ];then break fi echo "waiting rootfs..." sleep 1 done # mount mrootfs. mkdir -p /dev/root mount $ROOT /dev/root # switch root exec switch_root -c /dev/console /dev/root /sbin/init
initramfsとして組み込み、起動
前回の記事と同様にinitramfsにして、FIT imageに組み込んで起動すると、initramfs経由でラズパイOSが立ち上がり、ログインできるようになる。
find . | cpio -H newc -ov -F ../rootfs.cpio cd ../ gzip rootfs.cpio cp rootfs.cpio.gz /path/to/linux/arch/arm64/boot/ cd /path/to/linux/arch/arm64/boot/ mkimage -f kernel.its FITImage
残件
使っていないパッケージが残っていることや、Linux kernelのバージョンがあっていないことが気になるが、ひとまず動いたのでここでは以下に残件としておいておく。
- Buildrootのrootfsのkernelバージョン
- 不要パッケージの削減
Buildrootを触った感想
自分はいままでyoctoばかり使っていたので、この機会にBuildrootを触ってみたが、細かいbsp関連の設定を行いたい場合はyocto、そこまでbspに依存しないrootfsだけを作成する場合はBuildroot、という風に使い分ければいいのだろうか? 大は小を兼ねるの考えでyoctoだけ使えればよい?もう少しBuildrootを触ってどう使い分ければいいかも考えてみたい。
終わりに
Buildrootで作成したrootfsをinitramfsとして起動し、そこからラズパイOSを起動した。
今回でinitramfsにある程度好きなパッケージをインストールできるようになったので、次回以降はinitramfsに機能を持たせるのを試していこうと思う。