Quantcast
Channel: aimdevel’s blog
Viewing all articles
Browse latest Browse all 35

Buildrootを活用して作成したrootfsをinitramfsとして利用する

$
0
0

初めに

前回の投稿でbusybox単体でinitramfsを動かすところまでは確認した。

aimdevel.hatenablog.com

しかし、現状の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に機能を持たせるのを試していこうと思う。


Viewing all articles
Browse latest Browse all 35

Trending Articles