みつきんのメモ

組み込みエンジニアです。Interface誌で「Yocto Projectではじめる 組み込みLinux開発入門」連載中

yocto raspberrypi4でNFSブート

はじめに

ラズベリーパイシリーズで、ルートファイルシステムNFSでマウントする。

以前にyocto raspberrypi3でNFSブートの記事を書いたが、 最近のmeta-raspberrypiでは作法が変わっているので焼き直し。

本稿で説明するのはyoctoの作法ではなくmeta-raspberrypiの作法なので、他のSoC向けのBSPレイヤでは適用できないので注意。

ベース環境の取得

$ mkdir -p ~/yocto/rpi4-nfs
$ cd ~/yocto/rpi4-nfs
$ git clone git://git.yoctoproject.org/poky.git -b kirkstone

oe-init-build-envの読み込み

下記を実行する。

$ cd ~/yocto/rpi4-nfs
$ source poky/oe-init-build-env

meta-raspberrypiをビルド対象に追加

下記を実行する。

$ bitbake-layers layerindex-fetch meta-raspberrypi

local.confの修正

以前とは異なり、最近のmeta-raspberrypiではCMDLINE変数を直接編集することはできない。 rpi-cmdline.bbのCMDLINE変数は下記のように定義されており、必要に応じて各変数の内容を上書きする。

CMDLINE = " \
    ${CMDLINE_ISOL_CPUS} \
    ${CMDLINE_DWC_OTG} \
    ${CMDLINE_SERIAL} \
    ${CMDLINE_ROOTFS} \
    ${CMDLINE_CMA} \
    ${CMDLINE_KGDB} \
    ${CMDLINE_LOGO} \
    ${CMDLINE_PITFT} \
    ${CMDLINE_DEBUG} \
    ${CMDLINE_RNDIS} \
    "

nfsブートに関連する変数はCMDLINE_ROOTFSとなるため、これをnfsブート用に上書きするために conf/local.confに下記を追加する。

MACHINE = "raspberrypi4"

CMDLINE_ROOTFS = "ip=dhcp root=/dev/nfs nfsroot=192.168.1.1:/srv/exports,vers=3,tcp rw rootwait"

動作確認

bitbakeの実行

$ bitbake core-image-base

書き込み

bmaptoolで書き込む。

$ sudo bmaptool copy core-image-base-raspberrypi4.wic.bz2 /dev/sdX

/dev/sdXは環境に応じて適宜読み替える。

nfsサーバ

インストール

$ sudo apt-get install -y nfs-kernel-server

公開ディレクトリの設定

/etc/exportsに下記の内容を追加する。

/exports 192.168.1.0/24(rw,sync,no_root_squash,no_subtree_check)

NFSデーモンの再起動

変更した設定を読み込むためにNFSデーモンを再起動

$ sudo systemctl restart nfs-kernel-server

ルートFSの展開

bitbakeで生成されたルートFSのイメージを/exportsに展開する。

sudo tar -I pbzip2 -xf ./build/tmp/deploy/images/raspberrypi4/core-image-base-raspberrypi4.tar.bz2 -C /srv/exports/

まとめ

4年も経つといろいろ変わってる。