隠居日録

隠居日録

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

FreeBSD 13.0がリリースされた

ようやくFreeBSD 13.0がリリースされた。13.0からarm64もtier 1になるので、

FreeBSD/arm64 becoming Tier 1 in FreeBSD 13

12.2からの更新もfreebsd-updateコマンドで簡単にできると期待していたのだが、実際試してみると、

freebsd-update upgrade -r 13.0-RELEASE
src component not installed, skipped
Looking up update.FreeBSD.org mirrors... 3 mirrors found.
Fetching public key from update4.freebsd.org... failed.
Fetching public key from update1.freebsd.org... failed.
Fetching public key from update2.freebsd.org... failed.
No mirrors remaining, giving up.

This may be because upgrading from this platform (arm64)
or release (12.2-RELEASE) is unsupported by freebsd-update. Only
platforms with Tier 1 support can be upgraded by freebsd-update.
See https://www.freebsd.org/platforms/index.html for more info.

If unsupported, FreeBSD must be upgraded by source.

12.2からの更新はサポートされていないと言われる。これは盲点だった。12.2に更新するときに、セルフビルドするのに飽き飽きしていたので、The FreeBSD Project | Build Your Own FreeBSD Update Serverを参考に、クロス環境で自家ビルドし、更新していたのだが、もう一度このサイクルを実施しなければならないようだ。13.0-p1からはfreebsd-updateで更新できることを期待するしかない。
2021年4月19日追記
今回はABIも更新されたことだし、u-bootを更新したboot専用SDカードを作り直した。実は12.2の時は12.1の時のものでブートできたので、そのままにしていた。13.0でも12.1のものでブートできてはいるが、今後どうなるかわからないので、更新しておいた。

13.0のSDカードのイメージファイルのディスクのパーティションMBRからGPTに変わっていたので、以前のスクリプトでは対応できなく、変更しなければならなかった。

#!/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} bs=128k seek=1 conv=notrunc,sync

#
FAT_SIZE="54m -b 1m"
FAT_TYPE="16"
# create partitions
gpart create -s GPT /dev/${DEST}
gpart add -t efi -l efi -a 512k -s ${FAT_SIZE} /dev/${DEST}
newfs_msdos -L efi -F ${FAT_TYPE} /dev/${DEST}p1
gpart add -t freebsd-ufs -l rootfs -a 64k /dev/${DEST}
newfs -U -L rootfs  /dev/${DEST}p2

# copy files
DSOURCE=/media/source
DDEST=/media/dest
CONT=0

mkdir -p ${DSOURCE}
mkdir -p ${DDEST}

mount /dev/${SOURCE}p2 ${DSOURCE}
mount /dev/${DEST}p2 ${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}p1 ${DSOURCE}/boot/efi
  mount -t msdos /dev/${DEST}p1 ${DDEST}/boot/efi
  CONT=1
fi
if [ ${CONT} -eq 0 -a -d ${DSOURCE}/boot/msdos ]; then
  mount -t msdos /dev/${SOURCE}p1 ${DSOURCE}/boot/msdos
  mount -t msdos /dev/${DEST}p1 ${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 -)
touch ${DDEST}/boot/kernel/.freebsd-update
cp /boot/dtb/overlays/nanopi-neo2-ext-usb.dtbo ${DDEST}/boot/dtb/overlays
cp /boot/dtb/overlays/nanopi-neo2-ext-usb.dtbo ${DDEST}/boot/efi/dtb/overlays

# modifiy config file(s)
cat >> ${DDEST}/boot/loader.conf <<HERE
fdt_overlays="sun50i-h5-opp,sun50i-h5-sid,sun50i-h5-ths,sun50i-h5-nanopi-neo2-op
p,nanopi-neo2-ext-usb"
vfs.root.mountfrom="ufs:/dev/da0p1"
pf_load="YES"
nullfs_load="YES"
#kern.maxswzone="3072000"
#vm.pfault_oom_attempts="-1"
#vm.pfault_oom_wait="30"
HERE

# unmount and detach
cd /
umount /dev/${SOURCE}p1
umount /dev/${SOURCE}p2
umount /dev/${DEST}p1
umount /dev/${DEST}p2
mdconfig -d -u ${SOURCE}
mdconfig -d -u ${DEST}
rmdir ${DSOURCE}
rmdir ${DDEST}

/boot/loader.confに関してはSDカードに書き込んでから、編集して微調整する必要がある。また、ディスク上の/etc/fstabも修正する必要がある。

/dev/da0p1      /               ufs rw,noatime          1 1
/dev/da0p2      none            swap sw                 0 0
/dev/da0p3      /mnt/disk1      ufs rw,noatime          1 1
/dev/mmcsd0p2   /mnt/sdcard     ufs rw,noatime          1 1
/mnt/sdcard/boot        /boot   nullfs  rw              0 0
/dev/mmcsd0p1   /boot/msdos     msdosfs rw,noatime      1 1
proc            /proc           procfs  rw              0 0

SDカードのサイズを変更するときは、mmcsd0をすべてアンマウントして、

gpart recover mmcsd0
gpart resize -i 2 mmcsd0
growfs /dev/mmcsd0p2

を実行する。リサイズ後、mount -aで問題なくマウントできれば、OK。

2021年5月28日追記
FreeBSD-13.0p1がリリースされた。今度はfreebsd-updateで更新できた。

root@xxxxxx: freebsd-update fetch
src component not installed, skipped
Looking up update.FreeBSD.org mirrors... 2 mirrors found.
Fetching public key from update2.freebsd.org... done.
Fetching metadata signature for 13.0-RELEASE from update2.freebsd.org... done.
Fetching metadata index... done.
Fetching 2 metadata patches.. done.
Applying metadata patches... done.
Fetching 2 metadata files... done.
Inspecting system... done.
Preparing to download files... done.
Fetching 14 patches.....10.. done.
Applying patches... done.
Fetching 2 files... . done.
The following files will be updated as part of updating to
13.0-RELEASE-p1:
/bin/freebsd-version
/boot/kernel/ipdivert.ko
/boot/kernel/kernel
/boot/kernel/kernel.bin
/boot/kernel/mpt.ko
/boot/kernel/virtio_pci.ko
/usr/bin/bc
/usr/bin/dc
/usr/lib/debug/boot/kernel/ipdivert.ko.debug
/usr/lib/debug/boot/kernel/kernel.debug
/usr/lib/debug/boot/kernel/mpt.ko.debug
/usr/lib/debug/boot/kernel/virtio_pci.ko.debug
/usr/lib/debug/usr/bin/bc.debug
/usr/lib/debug/usr/lib/libradius.so.4.debug
/usr/lib/libradius.a
/usr/lib/libradius.so.4
/usr/lib/libradius_p.a
root@xxxxxx:~ # freebsd-update install
src component not installed, skipped
Installing updates...cp: ///boot/kernel.old/./.freebsd-update: File exists
Scanning //usr/share/certs/blacklisted for certificates...
Scanning //usr/share/certs/trusted for certificates...
Scanning //usr/local/share/certs for certificates...
 done.

リブート後freebsd-versonで確認すると、期待通り更新されている。