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単独でできる。