dshimizu/blog/alpha

とりとめのないITブログ

FreeBSD 9.2-RELEASEをFreeBSD 10.0-RELEASEへアップグレード

はじめに

2014/1/20 FreeBSD 10-RELEASEが公開されました。10系の初リリースです。

さくらのVPSで使っているFreeBSD 9.2-RELEASEを10.0-RELEASEへアップグレードしてみましたので、その際に実施した手順を記載します。

FreeBSD 9.2-RELEASEを10.0-RELEASEへアップグレード

公式マニュアルの手順を元に、アップデートを実施します。

ただし、利用しているFreeBSDのパッチレベルによってはportupgradeコマンドの不具合でアップグレード処理を実行できませんのでパッチを適用する必要があります。

また、FreeBSD 10.0-RELEASEからデフォルトのバイナリパッケージ管理ツールが変更になったことで、メジャーバージョンアップ後のソフトウェアの更新が従来通りのやり方ではうまくいきませんでした。この点については以下に記載しているやり方が正しいのかわかりません。

実行環境

実行環境は以下となります。

プラットフォーム さくらのVPS 512
OS FreeBSD 9.2-RELEASE-p0 (amd64)
freebsd-updateの個別パッチの適用

セキュリティパッチの当たっていないFreeBSD 9.2-RELEASE-p0を利用しており、freebsd-updateコマンドに不具合があり、freebsd-updateコマンド実行時に以下のエラーが出てアップデートを実行できませんでした。


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

そのため、上記のErrata Noteの内容を参考にfreebsd-updateコマンドにパッチをあてます。
なお、該当の不具合が修正されているセキュリティパッチの適用されたFreeBSDであれば、この手順は不要です。

作業は全てrootで実施しますので、rootにスイッチします。


$ su -
FreeBSD-EN-13:04のパッチ適用

FreeBSD-EN-13:04のパッチを適用します。

パッチファイル設置用のディレクトリを作成します。


# mkdir /tmp/FreeBSD-EN-13:04

作業用ディレクトリに移動します。


# cd /tmp/FreeBSD-EN-13:04

パッチファイルをダウンロードします。


# 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 3756 kBps 00m00s

gpgコマンド(GnuPG)がある場合はPGPシグネチャファイルをダウンロードします。


# 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 1245 kBps 00m00s

gpgコマンド(GnuPG)がある場合はPGP署名を確認します。なければ飛ばしても構いません。


# gpg --verify freebsd-update.patch.asc

/usr/srcディレクトリに移動してます。


# cd /usr/src

ダウンロードしたパッチファイルを使って修正差分を適用します。


# patch < /tmp/FreeBSD-EN-13:04/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

/usr/src/usr.sbin/freebsd-updateディレクトリに移動します。


# cd /usr/src/usr.sbin/freebsd-update

freebsd-updateコマンドのリビルドを実施します。


# make install -DWITHOUT_MAN

install -o root -g wheel -m 555 freebsd-update.sh /usr/sbin/freebsd-update
FreeBSD-EN-13:05のパッチ適用

FreeBSD-EN-13:05のパッチを適用します。

パッチファイル設置用のディレクトリを作成します。


# mkdir /tmp/FreeBSD-EN-13:05

作業用ディレクトリに移動してます。


# cd /tmp/FreeBSD-EN-13:05

パッチファイルをダウンロードします。


# fetch http://security.FreeBSD.org/patches/EN-13:05/freebsd-update.patch

以下の通りにダウロードされます。


fetch: http://security.FreeBSD.org/patches/EN-13:05/freebsd-update.patch: size of remote file is not known
freebsd-update.patch 653 B 1521 kBps 00m00s

gpgコマンド(GunPG)がある場合はPGPシグネチャファイルをダウンロードします。


# fetch http://security.FreeBSD.org/patches/EN-13:05/freebsd-update.patch.asc

以下の通りにダウロードされます。


fetch: http://security.FreeBSD.org/patches/EN-13:05/freebsd-update.patch.asc: size of remote file is not known
freebsd-update.patch.asc 801 B 3007 kBps 00m00s

gpgコマンド(GunPG)コマンドがある場合はPGP署名を確認します。なければ飛ばしても構いません。


# gpg --verify freebsd-update.patch.asc

/usr/srcディレクトリに移動します。


# cd /usr/src

ダウンロードしたパッチファイルを使って修正差分を適用します。


# patch < /tmp/FreeBSD-EN-13:05/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 (revision 257878)
|+++ usr.sbin/freebsd-update/freebsd-update.sh (revision 257879)
--------------------------
Patching file usr.sbin/freebsd-update/freebsd-update.sh using Plan A...
Reversed (or previously applied) patch detected! Assume -R? [y] y
Hunk #1 succeeded at 2884.
done

/usr/src/usr.sbin/freebsd-updateディレクトリに移動します。


# cd /usr/src/usr.sbin/freebsd-update

freebsd-updateコマンドのリビルドを実施します。


# make install -DWITHOUT_MAN

install -o root -g wheel -m 555 freebsd-update.sh /usr/sbin/freebsd-update
FreeBSDのメジャーバージョンアップ

freebsd-updateコマンドを使ってFreeBSD 10.0-RELEASEへのメジャーバージョンアップを実施します。

更新ファイルのダウンロード

10.0-RELEASEへアップデートするために必要なファイルを取得します。


# /usr/sbin/freebsd-update -r 10.0-RELEASE upgrade

更新対象となるファイルに対して、Does this look reasonable (y/n)?(変更に問題ないか?)といったことを聞かれるのでy(yes)と入力します。


Looking up update.FreeBSD.org mirrors... 5 mirrors found.
Fetching metadata signature for 9.2-RELEASE from update4.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

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

Does this look reasonable (y/n)? y

Fetching metadata signature for 10.0-RELEASE from update4.freebsd.org... done.
Fetching metadata index... done.
Inspecting system... done.
Fetching files from 9.2-RELEASE for merging... done.
Preparing to download files... done.
Fetching 38043 patches.....10....20....30....40....50....60....70....80....90....100....110....120....130....140....150....160....170....180....190....200....210....220....230....240....250....260..
・・・
・・・
・・・
....36060....36070....36080....36090....36100....36110....36120....36130....36140....36150....36160....36170....36180....36190....36200....36210....36220....36230....36240....36250....36260....36270....36280....36290....36300....36310....36320....36330....36340....36350....36360....36370....36380....36390....36400....36410....36420....36430....36440....36450.. done.
Applying patches... done.
Fetching 9673 files...
Attempting to automatically merge changes in files... done.

変更対象の設定ファイルが表示されます。同様にDoes this look reasonable (y/n)?(変更に問題ないか?)といったことを聞かれるのでy(yes)と入力します。


he following changes, which occurred between FreeBSD 9.2-RELEASE and
FreeBSD 10.0-RELEASE have been merged into /etc/group:
--- current version
+++ new version
@@ -1,6 +1,6 @@
-# $FreeBSD: release/9.2.0/etc/group 218046 2011-01-28 22:28:12Z pjd $
+# $FreeBSD: release/10.0.0/etc/group 256366 2013-10-12 06:08:18Z rpaulo $
#
wheel:*:0:root,shimizu,vps,zabbix
daemon:*:1:
kmem:*:2:
sys:*:3:
@@ -16,10 +16,11 @@
sshd:*:22:
smmsp:*:25:
mailnull:*:26:
guest:*:31:
bind:*:53:
+unbound:*:59:
proxy:*:62:
authpf:*:63:
_pflogd:*:64:
_dhcp:*:65:
uucp:*:66:
Does this look reasonable (y/n)? y
・・・
・・・
・・・
The following changes, which occurred between FreeBSD 9.2-RELEASE and
FreeBSD 10.0-RELEASE have been merged into /etc/ssh/sshd_config:
--- current version
+++ new version
@@ -1,7 +1,7 @@
-# $OpenBSD: sshd_config,v 1.89 2013/02/06 00:20:42 dtucker Exp $
-# $FreeBSD: release/9.2.0/crypto/openssh/sshd_config 252339 2013-06-28 09:55:00Z des $
+# $OpenBSD: sshd_config,v 1.90 2013/05/16 04:09:14 dtucker Exp $
+# $FreeBSD: release/10.0.0/crypto/openssh/sshd_config 258343 2013-11-19 11:47:30Z des $

# This is the sshd server system-wide configuration file. See
# sshd_config(5) for more information.

# This sshd was compiled with PATH=/usr/bin:/bin:/usr/sbin:/sbin
@@ -31,10 +31,13 @@

# Lifetime and size of ephemeral version 1 server key
#KeyRegenerationInterval 1h
#ServerKeyBits 1024

+# Ciphers and keying
+#RekeyLimit default none
+
# Logging
# obsoletes QuietMode and FascistLogging
#SyslogFacility AUTH
#LogLevel INFO

@@ -114,11 +117,11 @@
#UseDNS yes
#PidFile /var/run/sshd.pid
#MaxStartups 10:30:100
#PermitTunnel no
#ChrootDirectory none
-#VersionAddendum FreeBSD-20130515
+#VersionAddendum FreeBSD-20131111

# no default banner path
#Banner none

# override default of no subsystems
Does this look reasonable (y/n)? y

The following files are affected by updates, but no changes have
been downloaded because the files have been modified locally:
/.cshrc
/root/.cshrc

10.0-RELEASEへのアップデートに伴って削除されるファイル一覧が表示されます。


The following files will be removed as part of updating to 10.0-RELEASE-p0:
/boot/kernel/atadisk.ko
/boot/kernel/atadisk.ko.symbols
/boot/kernel/atapicam.ko
/boot/kernel/atapicam.ko.symbols
/boot/kernel/atapicd.ko
/boot/kernel/atapicd.ko.symbols
/boot/kernel/atapifd.ko
/boot/kernel/atapifd.ko.symbols
/boot/kernel/atapist.ko
/boot/kernel/atapist.ko.symbols
/boot/kernel/ataraid.ko
/boot/kernel/ataraid.ko.symbols
/boot/kernel/coda.ko
・・・
・・・
・・・
/usr/src/usr.sbin/zic/Makefile.inc
/usr/src/usr.sbin/zic/README
/usr/src/usr.sbin/zic/zdump/Makefile
/usr/src/usr.sbin/zic/zic/Makefile
/usr/src/usr.sbin/zzz/Makefile
/usr/src/usr.sbin/zzz/zzz.8
/usr/src/usr.sbin/zzz/zzz.sh
/var/cache
/var/db/mergemaster.mtree
/var/empty
/var/yp/Makefile.dist
To install the downloaded upgrades, run "/usr/sbin/freebsd-update install".
カーネル/カーネルモジュール更新

更新ファイルはまだ反映されていないので、上記freebsd-updateコマンド実行後の最後のメッセージにある通りに、freebsd-update installコマンドを実行します。


# /usr/sbin/freebsd-update install

更新が反映(ディスクへ書き込み)されます。


Installing updates...
Kernel updates have been installed. Please reboot and run
"/usr/sbin/freebsd-update install" again to finish installing updates.

上記メッセージに表示されているとおり、OS再起動を実施すると新しいカーネル(10.0-RELEASE)で起動するはずです。


# shutdown -r now

起動後、rootへスイッチします。


# su -

OSバージョンが10.0-RELEASEとなっていることを確認します。


# uname -r
10.0-RELEASE
古いライブラリ/ファイル類の削除

再びfreebsd-updateコマンドを実行します。


# /usr/sbin/freebsd-update install

古い共有ライブラリとオブジェクトファイルを削除されます。


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.
ZFSファイルシステムとストレージプールの更新

利用可能なZFSファイルシステムとストレージプールのバージョンはFreeBSDのバージョンによって異なります。
FreeBSDのアップグレードによってZFSファイルシステムとストレージプールのバージョンはアップグレードされますが、現在動作しているZFSファイルシステムとストレージプールは古いバージョンのままで動作し続けますので、最新バージョンの機能を利用できるように、現在動作しているZFSファイルシステムとストレージプールに対して以下のコマンドを実行してアップグレードを実行します。
※9.2-RELEASEと10.0-RELEASEでZFSファイルシステムとストレージプールのバージョンに違いはありませんが追加機能等が反映されているかわかりませんので念のため実行しています。


# zpool upgrade -a

# zfs upgrade -a
パッケージの更新

最後にパッケージの更新を実施します。

まず、最新portsを取得し、/usr以下へ展開します。

既存portsを移動させます。


# mv /usr/ports /usr/ports.bak

最新portsを取得します。


# wget http://ftp.jaist.ac.jp/pub/FreeBSD/ports/ports/ports.tar.gz -P /tmp

/usr以下へ展開します。


# tar -zxvf /tmp/ports.tar.gz -C /usr/

これまではportmasterコマンドを実行すればアップデートできてましたが、FreeBSD 10.0-RELEASEでこれを実行してもアップデートされませんでした。


# portmaster -af

FreeBSD 10.0-RELEASEからはデフォルトのパッケージ管理システムが従来のpkg_*からpkgngへと変更になったためかと思い、pkgngを利用するためには従来のパッケージ管理データベースをpkgng形式のフォーマットへ変換する必要する必要があるとのことでしたので、pkgng形式への変更を試みました。

pkgng

pkgngFreeBSD 10.0-RELEASE以降デフォルトとなるパッケージ管理システムです。

pkgコマンドがインストールされていない場合、pkgコマンドを実行するとブートストラップユーティリティによって自動でインストール処理が実行されます(FreeBSD 9.1 以降)。


# pkg

pkgng形式を利用する以前からインストールされているパッケージ/アプリケーションがある場合はpkg2ngコマンドを実行してフォーマットを変更するようにメッセージが出ます。


The package management tool is not yet installed on your system.
Do you want to fetch and install it now? [y/N]: y
Bootstrapping pkg please wait
Installing pkg-1.2.5... done
If you are upgrading from the old package format, first run:

$ pkg2ng
・・・

pkg2ngコマンドを実行し、パッケージ管理データベースを新しいフォーマットへ変換します。


# pkg2ng

pkg2ngコマンド実行後、/var/db/pkgディレクトリにpkgngのSQLiteデータベースが作成されます。


# ls -lt /var/db/pkg | head -n 5
total 43802
-rw-r--r-- 1 root wheel 8911872 1月 22 10:42 local.sqlite
drwxr-xr-x 2 root wheel 3 1月 22 01:02 gettext-0.18.3.1
drwxr-xr-x 2 root wheel 3 1月 22 01:02 gmake-3.82_1
drwxr-xr-x 2 root wheel 3 1月 22 01:02 libxml2-2.8.0_3

pkg infoコマンドを実行すると、pkgng形式になったパッケージ一覧が表示されます。


# pkg info

最新のバイナリパッケージへアップデートします。


# pkg upgrade -f

ここで、パッケージの依存関係でconflictが発生したりするので、適宜パッケージを削除/インストールして調整しなければならないと思います。
また、細かいコンパイルオプションが必要なものはportsからインストールし直す必要があります。

依存関係が解決できたら、再度最新のバイナリパッケージへアップデートを試みます。


# pkg upgrade -f

おわりに

以上で、FreeBSD 9.2-RELEASEから10.0-RELEASEへの更新が完了しました。
個人的には新しいパッケージ管理システムpkgngがportspkg_*コマンドより手軽な感じが良いなと思いました。
パッケージソフトウェアのアップデートのやり方が上記のような形で正しいのかはわかっていませんが、問題なく動作しているようです。 10-RELEASEのインストーラからインストール時にファイルシステムZFSを選択できるようになったのも嬉しいです。

参考