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

## 17.2. FreeBSD Update

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

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

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

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

### 注記:

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

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

### 17.2.1. 設定ファイル

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

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

このパラメータは、FreeBSD のどの部分を最新に維持するかを設定します。 デフォルトでは、ベースシステム全体、 そしてカーネルをアップデートします。 `src/base` や `src/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(8) で確認してください。

    # 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` リストに属するファイルをアップデートします。

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

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

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

    # freebsd-update fetch
    # freebsd-update install

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

### 注記:

通常、ユーザはシステムを再起動する必要があります。 カーネルアップデートで再起動が必要かどうかを知るには、 `freebsd-version -k` と `uname -r` を実行してください。 これら 2 つのコマンドの結果が異なる場合には、 再起動が必要です。

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

    @daily                                  root    freebsd-update cron

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

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

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

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

`freebsd-update` ユーティリティが自動的にアップデートするカーネルは `GENERIC` のみです。 カスタムカーネルをインストールしている場合には、 `freebsd-update` によりインストールした後、 カーネルを再構築し、もう一度インストールする必要があります。 デフォルトのカーネルの名前は GENERIC です。 uname(1) コマンドを使ってインストールされているかどうかを確認できます。

### 注記:

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

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

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

### 17.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 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.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 つになる場合もあります。

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

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

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

もし、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` カーネルで再起動する必要はありません。

#### 17.2.3.2. メジャーバージョンアップグレード後の 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` カーネルを一時的に読み込んでいたのであれば、8章FreeBSD カーネルのコンフィグレーション に書かれている手順に従って、 新しいカスタムを構築し、インストールしてください。

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

### 17.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.conf` の `IDSIgnorePaths` オプションに追加してください。

戻る〓 | 上に戻る | 〓次へ
第17章 FreeBSD のアップデートとアップグレード〓 | ホーム | 〓17.3. ドキュメントのアップデート

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

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