freebsd-update で出るエラーメッセージ

FreeBSDを13.3にupdateしようと思ったら以下のようなメッセージが出ました。

Installing updates...install: ///usr/include/c++/v1/__string exists but is not a directory
install: ///usr/include/c++/v1/__tuple exists but is not a directory
install: ///usr/include/c++/v1/__string/char_traits.h: Not a directory
install: ///usr/include/c++/v1/__string/constexpr_c_functions.h: Not a directory
install: ///usr/include/c++/v1/__string/extern_template_lists.h: Not a directory
install: ///usr/include/c++/v1/__tuple/make_tuple_types.h: Not a directory
install: ///usr/include/c++/v1/__tuple/pair_like.h: Not a directory
install: ///usr/include/c++/v1/__tuple/sfinae_helpers.h: Not a directory
install: ///usr/include/c++/v1/__tuple/tuple_element.h: Not a directory
install: ///usr/include/c++/v1/__tuple/tuple_indices.h: Not a directory
install: ///usr/include/c++/v1/__tuple/tuple_like.h: Not a directory
install: ///usr/include/c++/v1/__tuple/tuple_like_ext.h: Not a directory
install: ///usr/include/c++/v1/__tuple/tuple_size.h: Not a directory
install: ///usr/include/c++/v1/__tuple/tuple_types.h: Not a directory
install: ///var/db/etcupdate/current/etc/rc.d/growfs_fstab: No such file or directory
install: ///var/db/etcupdate/current/etc/rc.d/var_run: No such file or directory
install: ///var/db/etcupdate/current/etc/rc.d/zpoolreguid: No such file or directory

秘伝のたれみたいに古いバージョンから延々updatedしているシステムでよく出るやつです。まぁupdateは終わってるから良いよね・・と思って適当に流してたんですが何かのソフトをビルドするときに上記ファイルがなくて非常に困ったということもあり解決方法をちゃんと調べてみました。

エラーの原因ですが Not a direcotryのほうについてはメッセージからするに /usr/include/c++/v1/__stringは存在するかディレクトリではない(故にその先のファイルを作ることができない)ということだと思います。

-r--r--r--  0 root   wheel   47182  4月  7  2023 ./usr/include/c++/v1/__string

のようなファイルであり 13.3から

drwxr-xr-x  0 root   wheel       0  3月  2 11:52 ./usr/include/c++/v1/__string/
-r--r--r--  0 root   wheel   30793  3月  2 11:52 ./usr/include/c++/v1/__string/char_traits.h
-r--r--r--  0 root   wheel   13439  3月  2 11:52 ./usr/include/c++/v1/__string/extern_template_lists.h
-r--r--r--  0 root   wheel    8995  3月  2 11:52 ./usr/include/c++/v1/__string/constexpr_c_functions.h

となっています。どうもこのようなケースではfreebsd-updateでアップグレードできないようです。

No such file or directoryのほうについては確かにこのシステム上にそのファイルやディレクトリは存在しません。/var/db/etcupdate/current/etc/rc.dというディレクトリは10.0のときは存在せず10.1からあるようです。

13.2で/var/db/etcupdate/current/etc/rc.d/growfs_fstabが追加されたようですが
なのでこの頃からエラーが発生してたのかなぁという気はします。

これについてはエラーメッセージでググるとわかるのですが

https://cgit.freebsd.org/src/commit/?id=cfb624d7e2507c81441bb01e0078abad25ef235d

にて修正されているようです。つまり最新版の13.2にしてから13.3にすれば多分エラーなくupdateされたものと思われます。

問題はすでにやらかしてしまった場合の修正方法です。

今回の例で言えば/usr/include/c++/v1/__stringは今回のアップデートで発生したファイル(またはディレクトリ)であると思われるのでなんとかしてインストールしなおせば解決すると思うのですが/var/db/etcupdate/current/etc/rc.dにはもっと多数のファイルが存在してて相当前のバージョンからエラーになっていて欠落しています。

そこでこれはもう直で欠けているファイルを展開してしまうのが早いという結論に至りました。

fetch http://ftp.freebsd.org/pub/FreeBSD/releases/amd64/13.3-RELEASE/base.txz

でbase.txzファイルをもってきて

tar xvfp base.txz -C / usr/include/c++/v1/__string usr/include/c++/v1/__tuple var/db/etcupdate/current/etc/rc.d/

多分これでokと思います
Posted by issei

カテゴリ: BSD