18.2. FreeBSD Update
戻る | 第18章 FreeBSD のアップデートとアップグレード | 次へ

## 18.2. FreeBSD Update

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

セキュリティパッチを適用することは、コンピュータソフトウェア、 特にオペレーティングシステムを管理する上で重要な役割を果たします。 しかしながら、FreeBSD においては、 このプロセスは簡単なものではありませんでした。 ソースコードにパッチを当て、コードからバイナリを再構築し、 バイナリを再びインストールする必要がありました。

現在の FreeBSD では `freebsd-update` と呼ばれるユーティリティが追加され、状況は変わりました。 このユーティリティは 2 つの機能を持っています。 第一に、FreeBSD ベースシステムのビルドやインストールを行うことなく、 バイナリによってセキュリティおよび eratta アップデートできます。 第二に、このユーティリティはマイナーおよびメジャーリリースのアップグレードに対応しています。

### 注記:

バイナリアップデートは、 セキュリティチームがサポートしているすべてのアーキテクチャとリリースで利用できます。 新しいリリースにアップデートする前に、 アップデートしようとしているリリースのアナウンスに目を通し、 重要な情報がないかどうかを確認してください。 リリースのアナウンスは http://www.FreeBSD.org/ja/releases/ で確認できます。

もし `crontab` の中に freebsd-update(8) の機能が含まれていたら、 以下の作業を行うまでは無効にしておいてください。

### 18.2.1. 設定ファイル

`/etc/freebsd-update.conf` の設定をデフォルトからきめ細かく調整して、 アップデートプロセスを制御するユーザもいます。 この作業は良く文書化されていますが、 以下の項目については説明が必要でしょう。

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

このパラメータは、FreeBSD のどの部分を最新に維持するかを設定します。 デフォルトではソースコード、ベースシステム全体、そしてカーネルをアップデートします。 Components に設定できる項目は、インストール時に選択できるものと同じです。 たとえば、ここで `world/games` を追加すると、 game にパッチが当たるようになります。 `src/bin` を追加すると、 `src/bin` ソースコードのアップデートを許可します。

この部分についてはデフォルトのままにしておき、 アップデートする項目をユーザがリストに加える形にするのがベストでしょう。 ソースコードとバイナリが同期していないと、 悲惨な結果をもたらす可能性があります。

# Paths which start with anything matching an entry in an IgnorePaths # statement will be ignored. IgnorePaths

`/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/

`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-update` は `Components` のリストが完全に正しいと判断し、 このリスト以外の変更点については取り扱いません。 `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.old` は `GENERIC` カーネルそのものです。 このディレクトリの名前を `/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.old` は `GENERIC` カーネルそのものです。 ただ単にこのディレクトリの名前を `/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.passwd` や `group` のような重要なファイルを後で手動でマージする方もいます。

### 注記:

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

`#` `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 -f`

この作業の終了後、最後にもう一度 `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.conf` の `IDSIgnorePaths` オプションに追加してください。

以前に議論した方法とは別に、 このシステムを入念なアップグレード方法の一部として用いることができます。

戻る | 上に戻る | 次へ
第18章 FreeBSD のアップデートとアップグレード | ホーム | 18.3. Portsnap: Ports Collection アップデートツール

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

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