FreeBSD 13.0-BETA でバイナリを使い回した時の install が失敗する2021年02月20日 13時22分13秒

FreeBSD 13.0-RELEASE が迫っている。手元でもぼちぼちと更新して準備中。

普段は、一番速い機械で頻繁に更新。ある程度様子を見てから、問題が無かったのを確認して他の機械を更新。大体様子見の間にも更新するから /usr/obj/usr/src/i386.i386/tmp 以下に作られるブートストラップのバイナリは最新の 13.0-BETA 相応になる。そして、/usr/src と /usr/obj を nfs、ggate、USB ディスクなどで共有し遅い機械に順次インストールをする。

今までリリース時の更新ではこの方法で失敗したことはなかった。しかし、今回の FreeBSD 13.0-BETA ではエラーが出るようになっている。releng/13.0 が切られる前はこの方法で 12.2-RELEASE にも installkernel installworld をしていたので、影響が出たのは最近だと思われる。

実際のエラーはこんな感じ。これは 12.2-RELEASE 上で make installkernel をしたときの結果。

12.2-release $ make installkernel -C /usr/src
--------------------------------------------------------------
>>> Install check kernel
--------------------------------------------------------------
--------------------------------------------------------------
>>> Installing kernel GENERIC on Fri Feb 19 00:42:38 EST 2021
--------------------------------------------------------------
cd /usr/obj/usr/src/i386.i386/sys/GENERIC;  MACHINE_ARC
H=i386  MACHINE=i386  CPUTYPE= CC="cc -target i386-unk
nown-freebsd13.0 --sysroot=/usr/obj/usr/src/i386.i386/tmp -
B/usr/obj/usr/src/i386.i386/tmp/usr/bin" CXX="c++  -target i
386-unknown-freebsd13.0 --sysroot=/usr/obj/usr/src/i386.i38
6/tmp -B/usr/obj/usr/src/i386.i386/tmp/usr/bin"  CPP="cpp -
target i386-unknown-freebsd13.0 --sysroot=/usr/obj/usr/src/i3
86.i386/tmp -B/usr/obj/usr/src/i386.i386/tmp/usr/bin"  AS="
as" AR="ar" LD="ld" LLVM_LINK=""  NM=nm OBJCOPY="objcop
y"  RANLIB=ranlib STRINGS=  SIZE="size" STRIPBIN="strip" PAT
H=/usr/obj/usr/src/i386.i386/tmp/bin:/usr/obj/usr/src/i386.i
386/tmp/usr/sbin:/usr/obj/usr/src/i386.i386/tmp/usr/bin:/us
r/obj/usr/src/i386.i386/tmp/legacy/usr/sbin:/usr/obj/usr/src
/i386.i386/tmp/legacy/usr/bin:/usr/obj/usr/src/i386.i386/tm
p/legacy/bin:/usr/obj/usr/src/i386.i386/tmp/legacy/usr/libe
xec::/sbin:/bin:/usr/sbin:/usr/bin  make  KERNEL=kernel install
ld-elf.so.1: /usr/obj/usr/src/i386.i386/tmp/legacy/usr/sbin/m
ake: Undefined symbol "regcomp@FBSD_1.6"
*** Error code 1

Stop.
make[1]: stopped in /usr/src
13.0-BETA が入っている機械では make installkernel installworld が成功するので、ブートストラップを作った母艦のバージョンが合わないと起きる様だ。

次回