FreeBSD 10.0は、ALPHAからBETA1まで怒涛のアップデートが続いたと思ったら、BETA2でいきなり足踏みがあった。
これは、freebsd-update(8)にバグがあったためで、結果として以下の問題があったようだ。

①freebsd-updateでFreeBSD 10.0-BETA1へのアップグレードができない
②FreeBSD 10.0-BETA1でfreebsd-updateを使えない。

それが2013/10/29(日本時間)に解決された。
各OSバージョンでいったんfreebsd-updateし、最新の状態にしてから10.0-BETA2に更新すればよい。
詳細は以下。
Multiple freebsd-update bugs break upgrading to FreeBSD 10.0

油断してるとpkgngが死ぬ

もう一つ。
今回のfreebsd-updateでは、freebsd-update installを3回求められた。
あまり記憶がないのだが、前からこうだったかな..。

ただこの3回目のinstallが曲者である。
メッセージ(後述)を見ると分かるが、古いライブラリを削除するもののようだ(make delete-old-libsのようなもの)。
したがって、ports, pkgでインストールしたソフトウェアは動かなくなる可能性がある。
恐ろしいのは、pkgコマンド(pkgng)も対象であるということだ。

告白すると、「面倒くせえ。そんなもん、後でゆっくりアップグレードするわい」と進めたら、pkgが死んでその他のソフトウェアもアップグレードできなくなって頭を抱えました。はい。

さて以下に正しい手順を示す。

アップグレード例(FreeBSD 10.0-BETA1からBETA2へ)

ではまず現状の確認。
upgradeすると失敗する。
情報通りですな。

# uname -a
FreeBSD testsv 10.0-BETA1 FreeBSD 10.0-BETA1 #0 r256420: Sun Oct 13 01:43:07 UTC 2013     root@snap.freebsd.org:/usr/obj/usr/src/sys/GENERIC  amd64
# freebsd-update upgrade -r 10.0-BETA2
Password:
Looking up update.FreeBSD.org mirrors... none found.
Fetching public key from update.FreeBSD.org... done.
Fetching metadata signature for 10.0-BETA1 from update.FreeBSD.org... done.
Fetching metadata index... done.
Fetching 2 metadata files... done.

The update metadata is correctly signed, but
failed an integrity check.
Cowardly refusing to proceed any further.
#

そこでupgradeではなく、いったんupdateするとfreebsd-updateが更新される。

# freebsd-update fetch
(略)
The following files will be updated as part of updating to 10.0-BETA1-p1:
/bin/freebsd-version
/usr/sbin/freebsd-update
/var/db/mergemaster.mtree

WARNING: FreeBSD 10.0-BETA1 is approaching its End-of-Life date.
It is strongly recommended that you upgrade to a newer
release within the next 1 month.
# freebsd-update install
Installing updates... done.
#

フレッシュなfreebsd-updateで改めてアップグレード。
今度は問題なし。

# freebsd-update upgrade -r 10.0-BETA2
Looking up update.FreeBSD.org mirrors... none found.
Fetching metadata signature for 10.0-BETA1 from update.FreeBSD.org... done.
Fetching metadata index... done.
Inspecting system... done.

The following components of FreeBSD seem to be installed:
kernel/generic src/src world/base world/games world/lib32

The following components of FreeBSD do not seem to be installed:
world/doc

Does this look reasonable (y/n)?
(略)

あとは指定されるままにinstall, reboot,もう一回installをすると以下のメッセージが。

# freebsd-update install
Password:
Installing updates...
Completing this upgrade requires removing old shared object files.
Please rebuild all installed 3rd party software (e.g., programs
installed from the ports tree) and then run "/usr/sbin/freebsd-update install"
again to finish installing updates.

ここで迂闊に3回目のfreebsd-updateをすると、先述の通り面倒なことになる。
pkgコマンドですべてのソフトウェアを強制再インストールする。
man pkg-installしてもそれっぽいのが無かったので、以下のようにした。

# pkg info|cut -f1 -d" "|xargs pkg install -fy
Updating repository catalogue
pkg: No packages matching 'gettext-0.18.3.1' has been found in the repositories
(略)
[18/18] Reinstalling tmux-1.8_1... done
#

(2013/11/18 追記)
 pkg upgrade -fyですべてのpkgを再インストール可能
(2013/11/18 追記ここまで)

freebsd-update installをもう一回して終了。

freebsd-updateの修正

以上、なのだが。
今回のfreebsd-updateバグ回避方法にはもうひとつ、freebsd-updateそのものを更新する方法がある。
その方法も試したので以下に示す。
(正直に言うと、ERRATAの「Perform one of the following:」を読み飛ばし、freebsd-updateにパッチ当てるという余計な手間をかけた。悔しいので手順を示す)

とはいえ、freebsd-updateの修正とOSアップデート手順は先述URLに丁寧に書かれている。
英語ではあるけれども、鍛えられたFreeBSDソルジャーなら屁でもない。
が、どこかに有用と感じてくれる人がいるかもしれない。
以下は10.0-BETA1から10.0-BETA2にアップグレードした例。

必要なものはsrc。
gpgもあるといいけど、まあ要らない。

srcの展開

srcのある人はスキップしてよい。
bsdconfigやら、DVDイメージ、DVDから展開する。
以下はDVDから展開する例(実際は仮想マシンからディスクイメージ読んでるだけなんですけどね)。

$ sudo mount -t cd9660 /dev/cd0 /mnt
$ cd /mnt/usr/freebsd-dist
$ sudo tar -C / -xvzpf ./src.txz
(略)

gnupgのインストール

これも、まあ本気のサーバ管理をしている人以外は不要じゃないかな。
以下はpkgでインストールする例。
意外にたくさんのお友達を連れてきた。

$ pkg search gnupg
gnupg-1.4.15
gnupg-2.0.22
pecl-gnupg-1.3.3_1
py27-gnupg-1.2.3
qca-gnupg-2.0.0.b3_1
$ sudo pkg install gnupg-2.0.22
Updating repository catalogue
The following 8 packages will be installed:

        Installing libgpg-error: 1.12
        Installing libgcrypt: 1.5.3
        Installing libassuan: 2.1.1
        Installing ca_root_nss: 3.15.1_1
        Installing curl: 7.32.0
        Installing pth: 2.0.7
        Installing libksba: 1.3.0
        Installing gnupg: 2.0.22

The installation will require 15 MB more space

3 MB to be downloaded
(略)

パッチの入手と適用

gnupgのない人は拡張子.ascのダウンロードは不要。

$ fetch http://security.freebsd.org/patches/EN-13:04/freebsd-update.patch
fetch: http://security.freebsd.org/patches/EN-13:04/freebsd-update.patch: size of remote file is not known
freebsd-update.patch                                  2754  B   25 kBps 00m00s
$ fetch http://security.freebsd.org/patches/EN-13:04/freebsd-update.patch.asc
fetch: http://security.freebsd.org/patches/EN-13:04/freebsd-update.patch.asc: size of remote file is not known
freebsd-update.patch.asc                               801  B 3785  Bps 00m00s
$

gpgでファイルの確認。
gpgが無ければスキップしてよい。

$ gpg --verify ./freebsd-update.patch.asc
Warning: using insecure memory!
gpg: Signature made Sun Oct 27 05:14:13 2013 JST using RSA key ID 5DCF6AE7
gpg: Good signature from "FreeBSD Security Officer <security-officer@FreeBSD.org>"
gpg: WARNING: This key is not certified with a trusted signature!
gpg:          There is no indication that the signature belongs to the owner.
Primary key fingerprint: 1CF7 FF6F ADF5 CA9F BE1B  8CB2 ED67 ECD6 5DCF 6AE7

なんかWARNINGでてるけどまあいいでしょ。

パッチ適用

$ cd /usr/src
$ sudo patch < ~/somewhere/freebsd-update.patch
Hmm...  Looks like a unified diff to me...
The text leading up to this was:
--------------------------
|Index: usr.sbin/freebsd-update/freebsd-update.sh
|===================================================================
|--- usr.sbin/freebsd-update/freebsd-update.sh
|+++ usr.sbin/freebsd-update/freebsd-update.sh
--------------------------
Patching file usr.sbin/freebsd-update/freebsd-update.sh using Plan A...
Hunk #1 succeeded at 1200.
Hunk #2 succeeded at 2814.
Hunk #3 succeeded at 2852.
Hunk #4 succeeded at 2876.
done

freebsd-updateのコンパイルとインストール

$ cd /usr/src/usr.sbin/freebsd-update/
$ sudo make install -DWITHOUT_MAN
install -o root  -g wheel -m 555  freebsd-update.sh  /usr/sbin/freebsd-update
$

10.0-BETA1のみ以下を実行

$ sudo sed -i '' -e 's/%@/%~@/' /usr/sbin/freebsd-update

freebsd-updateの修正は以上で完了。
改めてfreebsd-updateを実行すればよい。

以上