Orange Pi R1 のSPIフラッシュにOSを入れてルーターにする

メニュー

init.sh

rootfsを高圧縮だが読み込み専用なSquashFSにした上で、部分的に書き換え可能にするために取った方法で、自前のシェルスクリプトです。
kernel起動オプションで init=/init.sh を指定して最初に実行します。

/init.sh
#!/bin/sh
/bin/mount -t proc proc /proc
if [ -e /dev/mmcblk0p3 ];then
  /bin/mount /dev/mmcblk0p3 /mnt/rw
else
  /bin/mount /dev/mtdblock5 /mnt/rw
fi
/bin/mount -o bind /mnt/rw/etc /etc
/bin/mount -o bind /mnt/rw/home /home
/bin/mount -o bind /mnt/rw/var /var
/bin/mount -t tmpfs tmpfs /root
/bin/mount -t tmpfs tmpfs /var/log
if [ ! -e /mnt/rw/modules.dep ];then
  /sbin/depmod -a
fi
/sbin/modprobe 8189es
exec /sbin/init
こんな感じにしました。

最初に実行したあとに標準の /sbin/init が実行されます。
/sbin/init は /etc/inittab の内容を実行します。/etcはrootfsから分離して書き換え可能にしたいので、/etc/inittab はkernel起動時点でマウントされていません。

/procは/etc/inittabでマウントするようになっているので2重マウントしようとするとエラーが出ます。無視はできますが/etc/inittabの方も修正したほうがいいです。

SDカードとSPIフラッシュに両対応させています。
SDの第3パーティションの存在を確認しているだけなので、存在すればSDと判断されます。

/mnt/rwに書き換え可能なファイルシステムをマウントして、/etc /home /var にディレクトリをbindさせてます。
上記ディレクトリはrootfs上ではマウントポイントだけあればいいので空にして、rwパーティションの方に実体を設置しておきます。

modprobeでモジュールをロードするにはdepmodで /lib/modules/カーネルバージョン/modules.dep 作成する必要がありますが、
modules.dep は事前に用意するのも面倒なので /mnt/rw/modules.dep へのシンボリックリンクにしています。
起動時に/mnt/rw/modules.depの有無を確認し、なければdepmodを実行し作成されます。
起動時に8189esをロードします。

/rootはtmpfsにしました。
/tmp と /run は元々tmpfsです。
/var/logはBuildroot標準では/tmpへのリンクになっていますが、ログファイルを区別するために別mountにしました。

/etcだけマウントすれば他の処理は/etc/inittabの方でどうにかすることもできます。

/procは先にマウントしないとmountができません。
/devはカーネルがマウントするので最初からあります。
[編集]   [AD]
rentafree.net