2020/6/20追記
起動しない原因がNAS kitに由来するもので、LTSとは関係ないので、内容及びタイトルを一部修正
以前NanoPi NEO2 NAS kitでu-bootが動かないということを書いた。
prozorec.hatenablog.com
その後もなんとなくこのことが頭に残っていて、思いつくと、検索をして何かヒントがないかと探しているのだが、見つからない。
u-bootの方も3か月に1回ぐらいのペースで更新されていて、最新版は2020.04になっている。実はもう一つ気になっているものがある。それは第一ステージのローダーだ。aach64ではbootaa64.efiという名前で存在している。当然これもソースツリーの一部になっていて、更新されているようなのだが、make installworldしても、新しいものをsdcardに書き込んだりはしていないし、ディスクにも書き込んでいない。これをいつ更新すべきなのだろうか?NAS kitではないNanoPi NEO2のsdcard上のファイルを更新して、再起動してみると立ち上がってきたので、FreeBSDの新しいリリースが出たら更新すべきなのかもしれない。で、ついでにu-bootも更新してみたのだが、今度はNanoPi NEO2が起動しなくなった。
FreeBSDのサイトからFreeBSD-12.1-RELEASE-arm64-aarch64-PINE64.imgをダウンロードし、これをsdcardに書き込み、NanoPi NEO2用のu-bootを書き込んで、起動してみると、それは立ち上がる。何が違うのだろうと調べてみると、FATパーティションにdtbというディレクトリができていて、どうやらu-bootが参照するようになっているようだ。
以上の事から、新しいFreeBSDがリリースされたら、imgファイルをダウンロードして、起動用のsdcardを作り直すのがいいのではないかと思い始めた。u-bootを積極的に変更する理由はないが、FreeBSDの新しいリリースの何らかの変更で起動しなくなる可能性もなくはないだろう。
手作業でやると間違うので、シェルスクリプトを書いた。
boot_sd.sh <original sd image> <u-boot binary> <new boot sd image>
と実行すると、起動用のイメージが作成される。ブートするだけなら1Gもあれば十分なので、1Gのイメージになるようにしている。
#!/bin/sh DISK_SIZE=1 GO=0 ORIG="" UBOOT="" NEW="" case $# in 3) GO=1 ORIG=$1 UBOOT=$2 NEW=$3 ;; *) ;; esac if [ ${GO} -eq 0 ]; then echo "boot_sd.sh <original sd image> <u-boot binary> <new boot sd image>" exit 1 fi # create dummy memory file dd if=/dev/zero of=${NEW} bs=1G count=${DISK_SIZE} # attach image SOURCE=`mdconfig -a -f ${ORIG}` DEST=`mdconfig -a -f ${NEW}` # write u-boot dd if=${UBOOT} of=/dev/${DEST} conv=notrunc,sync seek=16 # create partitions gpart create -s MBR /dev/${DEST} gpart add -a 63 -b 16384 -s 64m -t '!12' ${DEST} gpart set -a active -i 1 ${DEST} newfs_msdos -F 16 /dev/${DEST}s1 gpart add -t freebsd -a 512k ${DEST} gpart create -s BSD ${DEST}s2 gpart add -t freebsd-ufs -a 64k ${DEST}s2 newfs /dev/${DEST}s2 # copy files DSOURCE=/media/source DDEST=/media/dest CONT=0 mkdir -p ${DSOURCE} mkdir -p ${DDEST} mount /dev/${SOURCE}s2a ${DSOURCE} mount /dev/${DEST}s2a ${DDEST} mkdir -p ${DDEST}/boot mkdir -p ${DDEST}/boot/efi mkdir -p ${DDEST}/boot/msdos if [ -d ${DSOURCE}/boot/efi ]; then mount -t msdos /dev/${SOURCE}s1 ${DSOURCE}/boot/efi mount -t msdos /dev/${DEST}s1 ${DDEST}/boot/efi CONT=1 fi if [ -d ${DSOURCE}/boot/msdos ]; then mount -t msdos /dev/${SOURCE}s1 ${DSOURCE}/boot/msdos mount -t msdos /dev/${DEST}s1 ${DDEST}/boot/msdos CONT=1 fi if [ ${CONT} -eq 0 ]; then echo "Abort. No FreeBSD loader directory is detected" exit 2 fi cd ${DSOURCE}/boot tar cf - * | (cd ${DDEST}/boot; tar xvf -) # modifiy config file(s) cat >> ${DDEST}/boot/loader.conf <<HERE vfs.root.mountfrom="ufs:da0p1" pf_load="YES" nullfs_load="YES" HERE # unmount and detach cd / umount /dev/${SOURCE}s1 umount /dev/${SOURCE}s2a umount /dev/${DEST}s1 umount /dev/${DEST}s2a mdconfig -d -u ${SOURCE} mdconfig -d -u ${DEST} rmdir ${DSOURCE} rmdir ${DDEST}
新しいイメージを書き込んで、立ち上がることが確認出来たら、sdcardに合わせてリサイズしてもいいだろう。マウントされているmmcsd0をすべてアンマウントして、
gpart resize -i 2 mmcsd0 gpart resize -i 1 mmcsd0s2 growfs /dev/mmcsd0s2a
とすれば、sdcardの容量に合わせてリサイズされる。
で、NAS kitだが、やはり新しいバージョンのu-bootでも起動できない。ただし、orangepi-pc2のu-bootだと起動できる。不思議だ。
2020/6/15追記
ここは一度原点に戻って、オフィシャルのFreeBSDのリリースとNanoPi NEO2用のu-bootの組み合わせだとブートできるかどうか試してみた。変えたのは/etc/rc.confにIPアドレスの設定を入れたのと、/boot/loader.confのfdt_overlaysにsun50i-h5-nanopi-neo2-oppを追加したこと。これだとブートできる。当然ログインもできるので、何が起きているか見てみると、どうやら、USBマスストレージが認識できないようで、ハードディスクが見えないのだ。だから、ディスクのルートパーティションがマウントさせられなく、起動できないようだ。一歩進んだが、なぜなのだろう?