yocto raspberrypi3でNFSブート

raspberrypi3のルートファイルシステムNFSでマウントする。

ベース環境の取得

$ git clone git://git.yoctoproject.org/poky.git -b pyro
$ cd poky
$ git clone git://git.yoctoproject.org/meta-raspberrypi -b pyro

使用するのはpyroブランチ。

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

下記を実行する。

$ cd ~/rpi3
$ source poky/oe-init-build-env

これにより、クロスコンパイルに必要な環境変数が設定され、ビルドディレクトリに移動される。

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

次のコマンドを実行する。

$ bitbake-layers add-layer ../poky/meta-raspberrypi

local.confの修正

マシンの設定と、カーネルのブートパラメータを設定する。

MACHINE ?= "raspberrypi3"

CMDLINE_remove = "root=/dev/mmcblk0p2 rootfstype=ext4 rootwait"
CMDLINE_append = " ip=192.168.1.100 root=/dev/nfs nfsroot=192.168.1.10:/exports rw rootwait"

動作確認

bitbakeの実行

$ bitbake rpi-basic-image

SDカードの作成

本来はブートパーティションだけで良いが、手順が複雑になるので、通常通りSDカードイメージをddで書き込む

$ sudo dd if=./tmp/deploy/images/raspberrypi3/core-image-sato-raspberrypi3.rpi-sdimg of=/dev/sdb bs=100M

nfsサーバ

インストール

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

公開ディレクトリの設定

tftpサーバとは異なり、デフォルトの公開ディレクトリは設定されていないため、この設定をおこなう。

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

/exports 192.168.1.0/255.255.255.0(rw,no_root_squash,subtree_check)

/exportsを作成する。

$ sudo mkdir /exports

NFSデーモンの再起動

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

$ sudo systemctl restart nfs-kernel-server

ファイルの展開

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

$ sudo tar xvf ./tmp/deploy/images/raspberrypi3/rpi-basic-image-raspberrypi3.tar.bz2 -C /exports/

ラズパイ起動

ここまでやってSDカードをraspberrypi3に挿入して起動すると、ルートファイルをNFSでマウントした状態で起動される。