18.2. FreeBSD Update

寄稿: Rhodes Tom [FAMILY Given].
ベースとなったノートの提供: Percival Colin [FAMILY Given].

システム管理における重要な側面に、 すみやかにセキュリティパッチを適用し、 オペレーティングシステムを新しいリリースにアップグレードすることがあります。 FreeBSD には、これらの処理を行うために freebsd-update と呼ばれるユーティリティが用意されています。

このユーティリティを用いると、FreeBSD のセキュリティおよび eratta アップデートをバイナリによって行うことができます。 手動でパッチもしくは新しいカーネルをコンパイルし、 インストールする必要はありません。 バイナリアップデートは、 セキュリティチームがサポートしているすべてのアーキテクチャとリリースで利用できます。 http://www.FreeBSD.org/ja/security/ には、 サポートが行われているリリースや保守終了予定日の一覧があります。

このユーティリティは、マイナーリリースであったり、 他のリリースブランチへのアップグレードにも対応しています。 新しいリリースにアップデートする前に、 アップデートしようとしているリリースのアナウンスに目を通し、 重要な情報がないかどうかを確認してください。 リリースのアナウンスは http://www.FreeBSD.org/ja/releases/ で確認できます。

注記:

もし crontab の中に freebsd-update(8) の機能が含まれていたら、 オペレーティングシステムのアップグレード作業を終えるまでは無効にしてください。

この節では、freebsd-update で使われる設定ファイルの説明、 セキュリティパッチの適応方法のデモンストレーション、 オペレーティングシステムをアップグレードする際に考慮すべきことについて説明します。

18.2.1. 設定ファイル

freebsd-update のデフォルトの設定ファイルは、 そのままでも用いることができます。 /etc/freebsd-update.conf の設定をデフォルトからきめ細かく調整して、 アップデートプロセスを制御するユーザもいます。 このファイルのコメントにおいて利用可能なオプションが説明されていますが、 以下の項目については補足が必要でしょう。

# Components of the base system which should be kept updated.
Components world kernel

このパラメータは、FreeBSD のどの部分を最新に維持するかを設定します。 デフォルトでは、ベースシステム全体、 そしてカーネルをアップデートします。 src/basesrc/sys のように、個々の項目を指定することもできます。 この部分についてはデフォルトのままにしておき、 アップデートする項目をユーザがリストに加える形にするのがベストでしょう。 ソースコードとバイナリが同期していないと、 長い年月の間に悲惨な結果がもたらされる可能性があります。

# Paths which start with anything matching an entry in an IgnorePaths
# statement will be ignored.
IgnorePaths /boot/kernel/linker.hints

/bin/sbin 等の特定のディレクトリをアップデートで変更しないように、 これらのパスを追加してください。 このオプションは、ローカルの変更点を freebsd-update が上書きすることを防ぐ目的にも利用できます。

# Paths which start with anything matching an entry in an UpdateIfUnmodified
# statement will only be updated if the contents of the file have not been
# modified by the user (unless changes are merged; see below).
UpdateIfUnmodified /etc/ /var/ /root/ /.cshrc /.profile

このオプションは、指定したディレクトリにある設定ファイルを、 ローカルで変更されていない場合のみアップデートします。 ユーザがこれらのファイルを変更していると、 これらのファイルの自動アップデートは妨げられます。 他に、KeepModifiedMetadata という別のオプションが存在します。 このオプションは、freebsd-update がマージ中に変更点を保存するようにします。

# When upgrading to a new FreeBSD release, files which match MergeChanges
# will have any local changes merged into the version from the new release.
MergeChanges /etc/ /var/named/etc/ /boot/device.hints

freebsd-update がマージすべきファイルが存在するディレクトリの一覧です。 ファイルのマージのプロセスは、 mergemaster(8) と同様 diff(1) パッチの連続ですが、 選択肢は少なく、マージを承認するか、エディタを起動するか、 freebsd-update を中断するかどうかを選んでください。 もし、心配な点があれば、 /etc をバックアップしてからマージを承認してください。 mergemaster の詳細な情報については、 「設定ファイルの同期」 で確認してください。

# Directory in which to store downloaded updates and temporary
# files used by FreeBSD Update.
# WorkDir /var/db/freebsd-update

ここではすべてのパッチや一次ファイルを置くディレクトリを指定しています。 バージョンをアップグレードするのであれば、 この場所には少なくともギガバイトの空き容量が必要です。

# When upgrading between releases, should the list of Components be
# read strictly (StrictComponents yes) or merely as a list of components
# which *might* be installed of which FreeBSD Update should figure out
# which actually are installed and upgrade those (StrictComponents no)?
# StrictComponents no

このオプションを yes に設定すると、 freebsd-updateComponents のリストが完全に正しいと判断し、 このリスト以外の変更点については取り扱いません。 freebsd-update は、効率的に Components リストに属するファイルをアップデートします。

18.2.2. セキュリティパッチの適用

FreeBSD のセキュリティパッチを適用する過程は簡単になり、 管理者は freebsd-update を使って、 システムを完全にパッチがあたった状態に保つ事ができるようになりました。 FreeBSD セキュリティ勧告の詳細については、 FreeBSD セキュリティ勧告 の節で説明されています。

以下のコマンドを実行すると、FreeBSD のセキュリティパッチがダウンロードされ、インストールされます。 最初のコマンドは、未対応のパッチがあるかどうかを調べます。 もし未対応のパッチがある場合には、 パッチが当てられた際に変更されるファイルのリストが作成されます。 2 番目のコマンドはパッチを適用します。

# freebsd-update fetch
# freebsd-update install

アップデートによってカーネルにパッチが当たった場合には、 パッチが当たったカーネルで起動するように、 システムを再起動する必要があります。 もし、実行中のバイナリにパッチが当てられた場合には、 パッチの当てられたバージョンのバイナリが使われるように、 影響のあるアプリケーションを再起動する必要があります。

毎日一度アップデートがないかどうかを自動的に確認するように設定するには、 以下のエントリを /etc/crobntab に追加してください。

@daily                                  root    freebsd-update cron

パッチが存在すると、 自動的にダウンロードされますが、適用はされません。 root宛てにメールで、 ダウンロードされたパッチを確認し、 freebsd-update install とともに手動でインストールする必要のあることが通知されます。

うまく行かなかった場合には、freebsd-update を以下のように実行すると、最後の変更までロールバックできます。

# freebsd-update rollback
Uninstalling updates... done.

カーネルまたはカーネルモジュールがアップデートされた場合には、 完了後にもう一度システムを再起動して、 影響のあったバイナリを再起動してください。

freebsd-update ユーティリティが自動的にアップデートするカーネルは GENERIC のみです。 カスタムカーネルがインストールされている場合には、 freebsd-update がインストールした後、 カーネルを再構築し、もう一度インストールする必要があります。 しかしながら、GENERIC カーネルが /boot/GENERIC に存在する場合には、 現在のシステムで実行されているカーネルでなくとも、 freebsd-update によりアップデートされます。

注記:

GENERIC カーネルを、 常に /boot/GENERIC に置いておいてください。 さまざまな問題を解決する際や、 バージョンをアップグレードする際に助けとなります。 GENERIC カーネルを用意する方法については、 「FreeBSD 9.X 以降のシステムにおけるカスタムカーネル」 または 「FreeBSD 8.X におけるカスタムカーネル」 を参照してください。

/etc/freebsd-update.conf のデフォルトの設定を変更しない限り、 freebsd-update は、 他の更新と共にカーネルソースをアップデートします。 新しいカスタムカーネルの再構築と再インストールは、 通常通り行うことができます。

freebsd-update は、 常にカーネルをアップデートするとは限りません。 freebsd-update install によってカーネルソースが変更されなかった場合には、 カスタムカーネルを再構築する必要はありません。 しかしながら freebsd-update は、 /usr/src/sys/conf/newvers.sh を常にアップデートします。 これは、現在のシステムのパッチレベルを uname -r-p で表示する時にこのファイルが参照されます。 そのため、何も変更されていない場合でも、 カスタムカーネルを再構築することにより、 uname がシステムの正確なパッチレベルを報告するようになります。 各システムにインストールされているアップデートをすばやく把握できるようになるので、 特に複数のシステムを管理するときに助けとなります。

18.2.3. メジャーおよびマイナーバージョンのアップグレードを行う

FreeBSD のマイナーバージョン間のアップグレード、 たとえば、FreeBSD 9.0 から FreeBSD 9.1 へのアップグレードは、 マイナーバージョン アップグレードと呼ばれます。 メジャーバージョン アップグレードは、 FreeBSD 9.X から FreeBSD 10.X へのアップグレードといった、 FreeBSD のメジャーバージョンが変わるようなアップグレードのことです。 どちらのアップグレードもリリース番号のターゲットを指定する事で、 freebsd-update によって行う事ができます。

注記:

カスタムカーネルを使っているシステムでは、 アップグレードを行う前に GENERIC カーネルが、 /boot/GENERIC に置かれている事を確認してください。 GENERIC カーネルを用意する方法については、 「FreeBSD 9.X 以降のシステムにおけるカスタムカーネル」 または 「FreeBSD 8.X におけるカスタムカーネル」 を参照してください。

以下のコマンドを実行すると、FreeBSD 9.0 のシステムを FreeBSD 9.1 にアップグレードします。

# freebsd-update -r 9.1-RELEASE upgrade

コマンドを実行すると、freebsd-update は設定ファイルと現在のシステムを評価し、 アップデートするために必要な情報を収集します。 画面には、どのコンポーネントが認識され、 どのコンポーネントが認識されていないといったリストが表示されます。 たとえば以下のように表示されます。

Looking up update.FreeBSD.org mirrors... 1 mirrors found.
Fetching metadata signature for 9.0-RELEASE from update1.FreeBSD.org... done.
Fetching metadata index... done.
Inspecting system... done.

The following components of FreeBSD seem to be installed:
kernel/smp src/base src/bin src/contrib src/crypto src/etc src/games
src/gnu src/include src/krb5 src/lib src/libexec src/release src/rescue
src/sbin src/secure src/share src/sys src/tools src/ubin src/usbin
world/base world/info world/lib32 world/manpages

The following components of FreeBSD do not seem to be installed:
kernel/generic world/catpages world/dict world/doc world/games
world/proflibs

Does this look reasonable (y/n)? y

ここで、freebsd-update はアップグレードに必要なすべてのファイルをダウンロードします。 何をインストールし、どのように進むかといった質問をされることもあります。

カスタムカーネルを使っていると、 上記のステップで以下のような警告が表示されます。

WARNING: This system is running a "MYKERNEL" kernel, which is not a
kernel configuration distributed as part of FreeBSD 9.0-RELEASE.
This kernel will not be updated: you MUST update the kernel manually
before running "/usr/sbin/freebsd-update install"

この時点ではこの警告を無視してもかまいません。 アップデートされた GENERIC カーネルは、 アップグレードプロセスの途中で利用されます。

すべてのパッチがローカルシステムへダウンロードされたら、 次にパッチが適用されます。 このプロセスには時間がかかります。 この時間はコンピュータの性能とワークロードに依存します。 その後、設定ファイルがマージされます。 このプロセスでは、ユーザはファイルをマージするか、 画面上にエディタを立ち上げて手動でマージするかを尋ねられます。 プロセスが進むごとに、成功したマージのすべての結果の情報がユーザに示されます。 マージに失敗したり、無視した場合には、プロセスが中断します。 ユーザによっては /etc のバックアップを取り、 master.passwdgroup のような重要なファイルを後で手動でマージする方もいます。

注記:

すべてのパッチは別のディレクトリでマージされており、 まだ、システムには反映されていません。 すべてのパッチが正しく適用され、 すべての設定ファイルがマージされてプロセスがスムーズに進んだら、 ユーザは以下のコマンドを用いて、 変更点をディスクに反映してください。

# freebsd-update install

パッチは最初にカーネルとカーネルモジュールに対して当てられます。 システムがカスタムカーネルを実行している場合には、 nextboot(8) を使って次回の再起動時のカーネルを、 アップデートされた /boot/GENERIC に設定してください。

# nextboot -k GENERIC

警告:

GENERIC カーネルで再起動する前に、 カーネルにシステムが適切に起動するために必要なすべてのドライバが含まれていること、 もしアップデートしているコンピュータがリモートでアクセスしているのであれば、 ネットワーク接続に必要なすべてのドライバも含まれていることを確認してください。 特に、これまで実行しているカスタムカーネルが、 カーネルモジュールとして提供されているビルドインの機能を含んでいるのであれば、 これらのモジュールを一時的に /boot/loader.conf の機能を用いて、 GENERIC に読み込んでください。 アップグレードプロセスが終わるまでは、 重要ではないサービスを無効にするとともに、 必要のないディスクやネットワークのマウントなども避けることが推奨されています。

アップデートされたカーネルでコンピュータを再起動してください。

# shutdown -r now

システムがオンラインに戻ったら、以下のコマンドを使って freebsd-update を再び実行してください。 アップデートプロセスの状態は保存されているので、 freebsd-update を実行すると、 最初からではなく、次のステップに進み、 古い共有ライブラリとオブジェクトファイルを削除します。

# freebsd-update install

注記:

使用しているライブラリのバージョン番号の付けられ方によって、 3 つのインストールフェーズが 2 つになる場合もあります。

アップグレードはこれで終了です。 もしメジャーアップグレードを行った場合には、 「メジャーバージョンアップグレード後の package のアップグレード」 で説明されているようにすべての ports および package を再構築してください。

18.2.3.1. FreeBSD 9.X 以降のシステムにおけるカスタムカーネル

freebsd-update を使う前に、 GENERIC カーネルが /boot/GENERIC に置かれていることを確認してください。 ただ一度だけカスタムカーネルを構築したのであれば、 /boot/kernel.oldGENERIC カーネルそのものです。 このディレクトリの名前を /boot/kernel へと変更してください。

もし、2 回以上カスタムカーネルを構築した後であったり、 カスタムカーネルを構築した回数がわからなければ、 現在のオペレーティングシステムのバージョンの GENERIC カーネルを入手してください。 コンピュータへの物理的なアクセスが可能であれば、 インストールメディアから GENERIC カーネルをインストールできます。

# mount /cdrom
# cd /cdrom/usr/freebsd-dist
# tar -C/ -xvf kernel.txz boot/kernel/kernel

別な方法としては、 GENERIC カーネルをソースから再構築して、 インストールしてください。

# cd /usr/src
# make kernel __MAKE_CONF=/dev/null SRCCONF=/dev/null

freebsd-update がこのカーネルを GENERIC カーネルとして認識するために、 GENERIC コンフィグレーションファイルは、 とにかく変更してはいけません。 また、特別なオプションを指定しないで構築してください。

freebsd-update は、 /boot/GENERIC が存在する事だけを必要とするので、 GENERIC カーネルで再起動する必要はありません。

18.2.3.2. FreeBSD 8.X におけるカスタムカーネル

FreeBSD 8.X システムでは、GENERIC カーネルを入手する方法や構築の方法が少し異なります。

コンピュータへの物理的なアクセスが可能であれば、 以下のコマンドを実行することで、 インストールメディアから GENERIC カーネルをインストールできます。

# mount /cdrom
# cd /cdrom/X.Y-RELEASE/kernels
# ./install.sh GENERIC

ここで X.Y-RELEASE をリリース番号に置き換えてください。 GENERIC カーネルは、 デフォルトで /boot/GENERIC にインストールされます。

または、GENERIC カーネルをソースから再構築してください。

# cd /usr/src
# env DESTDIR=/boot/GENERIC make kernel __MAKE_CONF=/dev/null SRCCONF=/dev/null
# mv /boot/GENERIC/boot/kernel/* /boot/GENERIC
# rm -rf /boot/GENERIC/boot

freebsd-update が、このカーネルを GENERIC カーネルとして扱うように、 GENERIC コンフィグレーションファイルは、 とにかく変更してはいけません。 また、特別なオプションを指定しないで構築してください。

GENERIC カーネルで再起動する必要はありません。

18.2.3.3. メジャーバージョンアップグレード後の package のアップグレード

一般的に、マイナーバージョンアップグレードの後では、 インストールされているアプリケーションは、問題なく動作するでしょう。 メジャーバージョンが異なるとアプリケーションバイナリーインタフェース (ABI) が異なるため、 サードパーティ製のアプリケーションの多くは動作しなくなるでしょう。 メジャーバージョンアップグレード後には、 インストールされているすべての packages, ports をアップグレードする必要があります。 package は、pkg upgrade を使ってアップグレードできます。 インストールされている ports をアップグレードする場合には、 ports-mgmt/portmaster といったユーティリティを使ってください。

すべての package の強制的なアップグレードでは、 バージョン番号が上がらない package に対しても、 リポジトリから最新のバージョンで、インストールされている package を置き換えます。 FreeBSD のメージャーバージョンが変わるようなアップグレードでは、 ABI のバージョンも変わるため、 このようなアップグレードが必要になります。 強制的なアップグレードを行うには、以下のように実行してください。

# pkg-static upgrade -f

インストールされているすべてのアプリケーションを再構築するには、 以下のコマンドを実行してください。

# portmaster -af

このコマンドを実行すると、 設定を変更するオプションを持つアプリケーションは、 設定変更のスクリーンを表示し、 ユーザからの指示待ちの状態で停止します。 この振る舞いをやめ、デフォルトのオプションを使用するには、 上記のコマンドに -G を含めてください。

ソフトウェアのアップグレードが終わったら、最後にもう一度 freebsd-update を実行して、 すべてのアップグレードプロセスのやり残し作業を行い、 アップグレードのプロセスを完了してください。

# freebsd-update install

GENERIC カーネルを一時的に読み込んでいたのであれば、9章FreeBSD カーネルのコンフィグレーション に書かれている手順に従って、 新しいカスタムを構築し、インストールしてください。

コンピュータを再起動し、新しい FreeBSD を立ち上げてください。 これでアップグレードのプロセスは完了です。

18.2.4. システムの状態の比較

freebsd-update を用いて、 インストールされている FreeBSD の状態と、 正しく動作することが分かっている状態とを比較できます。 このコマンドは、現在のシステムのユーティリティ、ライブラリ、 設定ファイルを評価するので、 組み込みの侵入検知システム (IDS) として使うことができます。

警告:

このコマンドは、security/snort のような本当の IDS の置き換えになるものではありません。 freebsd-update はデータをディスクに保存するので、 不正な変更が行われる可能性があります。 kern.securelevel と、 freebsd-update のデータを使用しないときに、 読み取りのみの許可属性に設定されているファイルシステムに置くことで、 不正な変更の可能性を低くできますが、 よりよい解決方法は、 DVD または安全に保存されている外部 USB ディスクのような安全なディスクとシステムを比較することです。 組み込まれているユーティリティを用いた、別の方法による IDS 機能については、 FreeBSD バイナリによる検出 の節をご覧ください。

比較を行うには、 結果の出力先のファイル名を指定してください。

# freebsd-update IDS >> outfile.ids

システムは検査され、リリースファイルの SHA256 ハッシュ値と現在インストールされているファイルのハッシュ値がファイルの一覧と共に、 指定した出力先のファイルに送られます。

これらの行は極めて長いのですが、出力形式は簡単にすぐに解析できます。 たとえば、これらのリリースで異なっているすべてのファイルを知りたいのであれば、 以下のコマンドを実行してください。

# cat outfile.ids | awk '{ print $1 }' | more
/etc/master.passwd
/etc/motd
/etc/passwd
/etc/pf.conf

上の表示例では出力は切り捨てられており、 実際にはもっと多くのファイルが存在します。 これらのファイルには、運用中に変更されるファイルがあります。 たとえば、/etc/passwd はユーザがシステムに追加されると変更されます。 また、カーネルモジュールは、 freebsd-update によりアップデートされるため、変更されます。 このような特別なファイルやディレクトリを除外するには、 それらを /etc/freebsd-update.confIDSIgnorePaths オプションに追加してください。

本文書、および他の文書は ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/ からダウンロードできます。

FreeBSD に関する質問がある場合には、 ドキュメント を読んだ上で <questions@FreeBSD.org> まで (英語で) 連絡してください。

本文書に関する質問については、 <doc@FreeBSD.org> まで電子メールを (英語で) 送ってください。