ubldrの起動パーティションの切り替え

やること

crochetでNanoBSDを作ると、/dev/mmcsd0s2aと/dev/mmcsd0s2bができる。

mmcsd0s2a: 今のバージョンのFreeBSD
mmcsd0s2b: 未使用

なので、mmcsd0s2bに新しいバージョンのFreeBSDをインストールしてみたメモ。

OSの準備

crochetを使って準備する。

u-bootからubldrを呼び出すスクリプトの準備

ubldrのソースを見ると環境変数loaderdevで起動パーティションを切り替えていた。boot.scrでloaderdevを設定するようにした。

boota.cmdとする。

setenv loaderdev mmc0:1.0;fatload ${devtype} ${devnum}:${distro_bootpart} ${kernel_addr_r} ubldr.bin && go ${kernel_addr_r}
echo "Cannot load ubldr.bin"

bootb.cmdはmmc0:1.0の部分をmmc0:1.1として作る。

それができたら、mkimageを使ってu-bootで読み込めるファイルを作る。

mkimage -A arm -O FreeBSD -T script -c none -d boota.cmd boota.scr
mkimage -A arm -O FreeBSD -T script -c none -d bootb.cmd bootb.scr

SDカード書き込み

ここからRaspberry Piでの作業。 イメージをネットワーク経由で取得して書き込む。イメージのaをSDのbに書き込むのは注意。

mount_smbfs -I 192.168.1.13 //foo@192.168.1.13/public /mnt
mdconfig -f /mnt/FreeBSD-armv6-12.0-RPI-B-344277P-RaspberryPi.img
dd status=progress if=/dev/md0s2a of=/dev/mmcsd0s2b bs=1m
mdconfig -d -u 0

# ついでにboot scriptも転送
cp /mnt/boota.scr /mnt/bootb.scr /tmp
umount /mnt

ブートのスクリプトを変える

mount -tmsdosfs -o noatime /dev/mmcsd0s1 /mnt
mv -i /mnt/boot.scr /mnt/boot.scr.original
cp -ip /tmp/boota.scr /tmp/bootb.scr /mnt

# bから起動したいのでbootbをコピーする。
cp -ip /tmp/bootb.scr /mnt/boot.scr
sync
umount /mnt

fstabの書き換え

/dev/mmcsd0s2aから起動しないようにfstabを書き換える。

mount -o noatime /dev/mmcsd0s2b /mnt
cp -ip /mnt/etc/fstab /mnt/etc/fstab.original
sed -i -e 's|mmcsd0s2a|ufs/rootfs|g' /mnt/etc/fstab
sync
umount /mnt

tunefs -L '' /dev/mmcsd0s2a
tunefs -L 'rootfs' /dev/mmcsd0s2b

最後に再起動。

reboot

起動したら新しいバージョンで起動しているのを確認する。

unman -a

前のバージョンに戻したくなったら、FATバーティションのboot.scrをboota.scrに戻せばOK。 aとbのパーティションに交互に使うことで、常に前のバージョンに戻せる状態を維持しながらアップデートできる。 あと、アップデートがRaspberry Pi単独でできる。