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 の詳細な情報については、 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 fetch
# freebsd-update install

アップデートによってカーネルにパッチが当たった場合には、 パッチが当たったカーネルで起動するように、 システムを再起動する必要があります。 もしくは、システムにパッチが当てられ、 毎晩の cron(8) ジョブとして、freebsd-update を実行するように、 以下のエントリを /etc/crobntab に追加してください。

@daily                                  root    freebsd-update cron

このエントリは、毎日一度 freebsd-update を実行することを意味します。 cron と共に実行すると、 freebsd-update はアップデートが存在するときだけ確認します。 パッチが存在すると、 自動的にローカルディスクにダウンロードされますが、適用はされません。 ダウンロードされたパッチを確認し、手動でインストールする必要のあることが、 root 宛てにメールで通知されます。

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

# freebsd-update rollback

カーネルまたはカーネルモジュールがアップデートされた場合には、 完了後にシステムを再起動してください。 この作業によって、FreeBSD がバイナリをメモリに読み込みます。

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

注記:

GENERIC カーネルを、常に /boot/GENERIC に置いておくことは良い考えです。 さまざまな問題を解決する際や、 「メジャーおよびマイナーバージョンのアップグレード」 に説明されているように、 freebsd-update を用いてバージョンをアップグレードする際に助けとなります。

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

注記:

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

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

FreeBSD のマイナーバージョン間のアップグレード、 たとえば、FreeBSD 9.0 から FreeBSD 9.1 へのアップグレードは、 マイナーバージョン アップグレードと呼ばれます。 通常は、マイナーバージョンのアップグレードを行った後でも、 インストールされているアプリケーションは問題なく動きます。

メジャーバージョン アップグレードは、 FreeBSD 8.X から FreeBSD 9.X へのアップグレードといった、 FreeBSD のメジャーバージョンが変わるようなアップグレードのことです。 メジャーバージョンのアップグレードでは、 古いオブジェクトファイルやライブラリが削除され、 これらに依存する多くのサードパーティ製アプリケーションに影響を与える可能性があります。 インストールされているすべての ports を削除して再インストールするか、 メジャーアップグレード後、 ports-mgmt/portmaster といったユーティリティを使ってアップグレードすることが推奨されています。 インストールされているアプリケーションのブルートフォース的な再構築は、 以下のコマンドにより行うことができます。

# portmaster -af

このコマンドは、すべての ports を適切に再インストールしようとします。 BATCH 環境変数を yes に設定しておくと、 アップデートプロセスの途中の質問に対し yes と答えるようになるので、 ビルドプロセスでの手動操作を省略できます。

18.2.3.1. カスタムカーネルの取り扱い

カスタムカーネルを使用している場合には、アップグレードのプロセスは、 幾分複雑となります。 アップグレードの手順は FreeBSD のバージョンによって変わります。

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

GENERIC カーネルが /boot/GENERIC に置かれている必要があります。 もし GENERIC カーネルがシステムに存在しない場合には、 以下のどれかの方法で用意してください。

  • ただ一度だけカスタムカーネルを構築したのであれば、 /boot/kernel.oldGENERIC カーネルそのものです。 このディレクトリの名前を /boot/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.1.2. FreeBSD 9.X 以降のシステムにおけるカスタムカーネル
  • ただ一度だけカスタムカーネルを構築したのであれば、 /boot/kernel.oldGENERIC カーネルそのものです。 ただ単にこのディレクトリの名前を /boot/kernel へと変更してください。

  • コンピュータへの物理的なアクセスが可能であれば、 以下のコマンドで、インストールメディアから 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 コンフィグレーションファイルは、 とにかく変更してはいけません。 また、特別なオプションを指定しないで構築してください。

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

18.2.3.2. アップグレードを行う

freebsd-update によるメジャー、またはマイナーバージョンのアップデートでは、 リリースバージョンをターゲットにして実行します。 以下のコマンドは、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 つになる場合もあります。

18.2.3.3. メジャーバージョンアップグレード後の ports の再構築

メジャーバージョンアップグレードを行った後では、 すべてのサードパーティ製のソフトウェアを再構築し、 再インストールする必要があります。 この作業が必要なのは、インストールされているソフトウェアが、 アップグレードの際に削除されたライブラリに依存している可能性があるためです。 ports-mgmt/portupgrade は、このプロセスを自動化します。

# portmaster -af

この作業の終了後、最後にもう一度 freebsd-update を実行して、 すべてのアップグレードプロセスのやり残し作業を行い、 アップグレードのプロセスを完了してください。

# freebsd-update install

GENERIC カーネルを一時的に読み込んでいたのであれば、 ここで、通常の方法を用いて新しいカスタムを構築し、インストールしてください。

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

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

freebsd-update を用いて、 インストールされている FreeBSD の状態と、 正しく動作することが分かっている状態とを比較できます。 このオプションは、システムのユーティリティ、ライブラリ、 設定ファイルを評価します。 比較を行うには、以下のコマンドを実行してください。

# freebsd-update IDS >> outfile.ids

警告:

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

このコマンドを実行すると、システムは検査され、 リリースファイルの sha256(1) ハッシュ値と現在インストールされているファイルのハッシュ値がファイルの一覧と共に、指定した outfile.ids ファイルに送られます。

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

# 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> まで電子メールを (英語で) 送ってください。