すでにFreeBSDを導入している読者にとっては、インストールCD-ROMを用いたアップグレードや、ソースからコンパイルしてアップグレードするやり方は釈迦に説法であろう。一方最近のFreeBSDには、ちょうどWindows Updateのように、バイナリで簡単にアップデートできるfreebsd-updateという仕組みが整備されている。
この仕組みは本来、同じリリース内でセキュリティパッチレベルを上げるため(たとえば08年3月4日にFreeBSD 6.2-RELEASEでupdateを使ったところ、パッチレベル11にまで自動で上げてくれた)に用いられるものだが、6.3-RELEASEからは、「upgrade」オプションで異なるリリースに上がることが可能になった。6.3-RELEASEから7.0-RELEASEは、この新機能が本領を発揮するはじめての例、しかもメジャー番号の更新ということなので、「うまくいった」報告を出しておくことは有益なので報告する。
freebsd-updateによる7.0-RELEASEへのアップグレード
すでにFreeBSDをインストールしている読者ならば、FreeBSDの更新は頻繁に行っていることであろう。ただ、筆者も時間がないといった言い訳で、しばしば次のような手抜きアップグレードを行っていた。
- /etc, /boot/loader.conf、/root など、/(ルートパーティション)内で自分が手を加えたファイルを退避
- 古いFreeBSDの上に、CD-ROMから新しいFreeBSDを上書きインストール。その際disklabelのときに全てのパーティションを「M」(Mount point set)キーでもって単にマウントすることにする。
- とはいっても若干気持悪いので、disklabelのときに「T」(toggle newfs)でもって / だけはnewfsしてまっさらにする
- インストールが終わったら、退避しておいた/etcなどの設定ファイルを元に戻す。
- 戻すファイルの代表的なものは/etc/rc.conf、/etc/group(viを立ち上げてマージ)、/etc/master.passwd (vipw中で手動でマージ)、/etc/ssh/*key* (host keyがかわると面倒)、/etc/printcap、/etc/resolv.conf、/boot/loader.confなど
- パッケージは、暇があるときは全部自分で作り直す(俺的パッケージを作るための、RUN_DEPENDSをやたら指定した「Mitapkgs」というportsを個人的に持ってメンテナンスしている)が、暇が無いときはそのまま。
- 古いCライブラリ(たとえばFreeBSD 6なのに/lib/libc.so.5 =FreeBSD 5のlibc)も、そのまま。
以上のやり方は、簡便に実行できる点が魅力だが、たとえばライブラリにセキュリティの問題があるのに、それと知らずに古いパッケージとライブラリを使い続ける、といった類の脆弱性の危険がある。したがって、アップグレードのあるべき姿は、以下のような要求を満たすものであろう。
- 更新が必要なファイルは更新してくれ
- 自分で設定したファイルはそのまま、うまいことマージしてくれ
- 古いライブラリは消してくれること
FreeBSD 6.3-RELEASEでのfreebsd-updateは、上記3要求をすべてかなえてくれる便利なツールである。以下のようなアップグレードの手順を踏む場合
- 必要な差分を入手
- カーネルを入れ替え
- ライブラリ等新ファイルを追加
- (手動)パッケージの入れかえ
- 旧ライブラリファイルの削除
このうち1、2、3、5をfreebsd-updateが担当してくれる。
[手順0]6.3-RELEASEを用意する
今回記事を執筆するにあたり、FreeBSD 6.3-RELEASEが入っていたディスクと、6.2-RELEASEが入っていたディスクの2種類で試してみた。6.2-RELEASE版のfreebsd-updateには「upgrade」コマンドがなく、実行してもパッチレベルが上がるだけで、アップグレードはできなかった。そこで(いささか乱暴だが)先ほど紹介した「手抜きアップグレード」で6.3-RELEASEを上書きインストールするとfreebsd-updateで7.0-RELEASEにアップグレードできるようになった。
[手順1]差分の入手
まずrootとなり、以下を入力。
すると、自動的に近場のアップグレードサーバを探し、必要な差分を取得してくれる。
カーネルのコンフィグが違ったり、ソースが一部展開されていなかったりすると、「それでもいいですか」と親切にも尋ねてくれる。基本的には「y」と答えておいてよいだろう。
次に、6.3-RELEASEから7.0-RELEASEの間に行われた設定ファイル(/etc/)の変更を反映してよいか聞いてくる。
アップデートに際して削除される予定のファイル一覧が表示され、終了する。引き続き実際のインストールを行おう。
[手順2]カーネルの入れ替え
今度は以下を入力
で実際にカーネルの入れ換えが行われる。
と言われるとおり、OSを再起動する。
[手順3]ユーザランドのインストール
再起動で立ち上がった後、再びrootで
としてライブラリ等のインストールを行う。
一連の作業中、ここで出てきたメッセージは最も重要で、次回installを行った瞬間に古いライブラリは消えてしまい、古いライブラリに依存しているすべてのパッケージが動かなくなってしまう。実際、最初筆者はこのメッセージを無視したせいで、パッケージを新しくするための「portupgrade」コマンドまで動かなくなってしまい、復活に苦労した。言われることには素直に従うものだと反省。
[手順4]パッケージの入れ替え(手動)
反省して2回目の7.0-RELEASEへの移行を試すにあたって、正直にパッケージのアップグレードを行った(ちなみに、このように簡単に何度も繰り返してトライできるというのも、前回紹介した「完全バックアップ」で完全なバックアップを取っているからである)。ここで、ネット上では
- portsnapを使って今日の最新portsを用意した上で
- ネット上に7.0-RELEASE用のパッケージがあれば、それを使ってアップグレードする
方法が推奨されているようだが、筆者はそのやり方はそのままではお勧めしない。というのも、portsnapを使って今日の最新portsを用意すると、インストールしようとしているパッケージのバージョンは同じでも、それが依存しているライブラリのバージョンが最新portsの方で新しくなっていて、依存関係が微妙に狂う「バージョン依存の頭痛」に悩まされるからである。経験的にはバージョンの微妙な違いは実害は少なく、悩むのであれば完全にportsだけを使って入れてしまえばよい(実はこの頭痛が嫌なので、筆者は俺的Mitaportsでフルビルドを定期的に行っている)のだが、とくに時間がないときや、地球環境のためにはパッケージは魅力的である。
筆者がお勧めする入れ替え法は、次の手順である。
- FreeBSDのインストールCDから7.0-RELEASEのportsを展開した上で
- CD-ROMやネット上に7.0-RELEASE用のパッケージがあれば、それを使ってアップグレードする(その際ネットから取得したパッケージは/usr/ports/packages/All/に保存される)
- また、portsを使ってインストールするときにはついでにpackageも作る
以下、淡々とコマンドを紹介する。
- /etc/make.confの整備
/etc/make.confに以下の3行を追加する。
- 古いportsディレクトリの退避
- FreeBSD 7.0-RELEASEのdisc1をCD-ROMドライブに挿入
- 7.0-RELEASEのportsを展開
- portupgradeを実行
上記手順で、135個のパッケージに対して更新作業を夜12時に実行したところ、途中でデータベースファイル(/var/db/pkg/pkgdb.db)が壊れてしまったらしく、朝7時に起きたところエラーでportの更新がなされていなかった。/var/db/pkg/pkgdb.dbを削除してもう一度portupgradeを行ったところ、7時半に開始して8時半に無事終了することができた。(※注)
この状態で、よく使うアプリケーションを起動してみて、最低限それらは困らずに動作することを確かめておいた方がよい。
※注
本稿を作成するために、3度freebsd-upgradeを試したのだが、/var/db/pkg/pkgdb.dbが途中で壊れる不具合は毎回再現した。
というエラーである。エラーのログを読むと「ruby18-bdb-0.6.2」パッケージを更新した直後からデータベースが更新できなくなっているようだ。そういえば、標記パッケージはpkgdb.dbを作るために使っているのだから実はあたり前だとも言える。
回避方法としては、まず、
- portupgrade-2.3.1,2
- ruby-1.8.6.111_1,1
- ruby18-bdb-0.6.2
だけを手動でインストールしなおした後、
として、上記パッケージがインストールされている「証拠を隠滅」した上で、portupgrade -afP
を実行する。全てのパッケージ入れ換えが終了した後に、
としてportupgradeの「証拠を復活」させることができる。いかにも姑息なやり方であるが背に腹は替えられない。
また、メインマシンのLet's Note CF-W4でパッケージを総入れ替えすると、再起動するたびにマシンが固まってしまうという不具合もあったのだが、これについては筆者が使っているパッケージの組み合わせの問題ではないか? と想像している。実は6.2-R→6.3-Rのときにも同じ問題を経験していて、そのたびに「手抜きインストール」法で同じバージョンを上書きすることで問題なく動作しているので、深く原因を追求することなく今日に至っている。
[手順5]旧ライブラリファイルの削除
パッケージのアップデートが終了したら、旧いライブラリファイルを削除して差し支えない。
これでめでたく移行は終了である。
おわりに
筆者もfreebsd-updateによるバージョンアップ機能を初めて使ってみたが、パッケージの更新の手間さえ厭わなければ、「これまでのmake worldの苦労は何だったんだ」というくらいあっけなくアップグレードが完成する。今後はfreebsd-updateによるOSの更新がますます本流になりそうな予感である。このようにしてアップグレードした7.0-RELEASEを使い、いよいよ次回からOSの性能に迫っていくことにしたい。SMP、ファイルシステム、など期待の新機能や如何に。