隠居日録

隠居日録

2016年(世にいう平成28年)、発作的に会社を辞め、隠居生活に入る。日々を読書と散歩に費やす

FreeBSDとu-boot再び

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マスストレージが認識できないようで、ハードディスクが見えないのだ。だから、ディスクのルートパーティションがマウントさせられなく、起動できないようだ。一歩進んだが、なぜなのだろう?