17.5. ソースを用いた FreeBSD のアップデート
戻る〓 | 第17章 FreeBSD のアップデートとアップグレード | 〓次へ

## 17.5. ソースを用いた FreeBSD のアップデート

ソースをコンパイルしてFreeBSD をアップデートする方法は、 バイナリを用いたアップデートに比べ、いくつもの利点があります。 特定のハードウェアをうまく利用するためのオプションを設定してコードを構築できます。 ベースシステムの特定の箇所の設定をデフォルトの設定から変更したり、 必要がない部分を完全に削除して構築することもできます。 システムを構築することによるアップデートは、 バイナリアップデートをインストールするだけのアップデートに比べ時間がかかりますが、 利用環境に合わせた FreeBSD を作成するような完全なカスタマイズが可能です。

### 17.5.1. クィックスタート

以下は FreeBSD をソースから構築してアップデートする典型的な方法についてのクイックリファレンスです。 その後の節では、各プロセスをより詳細に説明します。

- アップデートおよびビルド

      # svnlite update /usr/src
      check /usr/src/UPDATING
      # cd /usr/src
      # make -j4 buildworld
      # make -j4 kernel
      # shutdown -r now
      # cd /usr/src
      # make installworld
      # mergemaster -Ui
      # shutdown -r now

  | 最新版のソースを入手してください。 ソースの入手およびアップデートに関する情報については 「ソースコードのアップデート」 をご覧ください。
  | ソースの構築の前後で必要となる手動の作業について、 `/usr/src/UPDATING` を確認してください。
  | ソースが置かれているディレクトリに移動してください。
  | world (カーネルを除くすべて) をコンパイルしてください。
  | カーネルをコンパイルしてインストールしてください。 ここに書かれているコマンドは、`make buildkernel installkernel` と同じです。
  | 新しいカーネルを使うため、 システムを再起動してください。
  | ソースが置かれているディレクトリに移動してください。
  | world をインストールしてください。
  | `/etc/` に置かれている設定ファイルをアップデートしたりマージしてください。
  | 新しく構築された world およびカーネルを利用するため、 システムを再起動してください。

### 17.5.2. ソースを用いたアップデートのための準備

`/usr/src/UPDATING` を読んでください。 このファイルには、 アップデートの前後で必要となる手動の作業について書かれています。

### 17.5.3. ソースコードのアップデート

FreeBSD のソースコードは `/usr/src/` に置かれています。 このソースコードのアップデートには、 Subversion バージョン管理システムを利用する方法が推奨されています。まず、 ソースコードがバージョン管理下にあることを確認してください。

    # svnlite info /usr/src
    Path: /usr/src
    Working Copy Root Path: /usr/src
    ...

この結果は、`/usr/src/` がバージョン管理下にあり、svnlite(1) を使ってアップデートできることを示しています。

    # svnlite update /usr/src

このディレクトリをアップデートしていない期間が長いと、 アップデートのプロセスには時間がかかります。 このプロセスが終わると、ソースコードは最新となり、 次節以降で説明する構築のプロセスを実行できます。

### ソースコードの入手:

`'/usr/src' is not a working copy` という出力が出た場合には、 ファイルがなかったり、別な方法によりインストールされているので、 新しくソースコードをチェックアウトする必要があります。

表17.1 FreeBSD のバージョンおよびリポジトリパス

`uname -r` の出力 | リポジトリパス | 説明
--- | --- | ---
``X.Y`-RELEASE` | `base/releng/``X.Y` | このリリースバージョンに対する重大なセキュルティへの対応およびバグの修正パッチのみが適用されています。 このブランチは、ほとんどのユーザに推奨されます。
``X.Y`-STABLE` | `base/stable/``X` | リリースバージョンに対し、 そのブランチにおけるすべての開発の成果が反映されたものです。 STABLE は、 Applications Binary Interface (ABI) が変更されないことを意味しており、 このブランチの以前のバージョンでコンパイルされたソフトウェアは、 このバージョンでも実行できることを意味しています。 たとえば、FreeBSD 10.1 で実行するようにコンパイルされたソフトウェアは、 FreeBSD 10-STABLE においても実行できます。 STABLE ブランチは、 時期によってはユーザに影響するようなバグや非互換性を持つことがあります。 これらは通常すぐに修正されます。
``X`-CURRENT` | `base/head/` | リリースが行われていない最新の FreeBSD の開発バージョンです。 CURRENT ブランチは大きなバグや非互換があることもあるので、 高度な知識を持ったユーザのみ使用が推奨されます。

uname(1) を使って FreeBSD のバージョンを確認してください。

    # uname -r
    10.3-RELEASE

表17.1「FreeBSD のバージョンおよびリポジトリパス」 から分かるように、`10.3-RELEASE` のアップデートのためのソースコードのパスは、 `base/releng/10.3` です。 このパスは、ソースコードをチェックアウトする時に使います。

    # mv /usr/src /usr/src.bak
    # svnlite checkout https://svn.freebsd.org/base/releng/10.3 /usr/src

| この古いディレクトリを、 邪魔にならないように移動してください。 このディレクトリ以下に対して変更を行ってなければ、 削除しても構わないでしょう。
| リポジトリの URL に 表17.1「FreeBSD のバージョンおよびリポジトリパス」 に記載されているパスを追加します。 3 番目のパラメータには、 ローカルシステム上でソースコードが置かれるディレクトリを指定します。

### 17.5.4. ソースからの構築

まず最初に world (カーネルを除くオペレーティングシステムのすべて) をコンパイルします。 このステップを最初に実行するのは、 カーネルの構築を最新のツールを使って行うようにするためです。 このステップが終わったら、カーネルそのものを構築します。

    # cd /usr/src
    # make buildworld
    # make buildkernel

コンパイルされたコードは `/usr/obj` に書き出されます。

これは基本のステップです。 構築をコントロールする追加のオプションについては、 以下で説明します。

#### 17.5.4.1. クリーンビルドの実行

FreeBSD ビルドシステムのいくつかのバージョンは、 オブジェクトが一時的に置かれるディレクトリ `/usr/obj` に前回のコンパイルされたコードを残します。 これにより、変更されていないコードを再コンパイルせずにすむので、 その後の構築時間を短縮できます。 すべてを再構築するには、構築を開始する前に、 `cleanworld` を実行してください。

    # make cleanworld

#### 17.5.4.2. ジョブの数の設定

マルチコアプロセッサを搭載するシステムでは、 構築のためのジョブの数を増やすことで、 構築にかかる時間を短縮できます。 `sysctl hw.ncpu` を使って、 コアの数を確認してください。 ジョブの数がどのように構築の速さに影響するかを確実に知るには、 プロセッサにより異なりますし、FreeBSD のバージョンにより使用されるビルドシステムも変わるため、 実際に試してみるしか方法はありません。 試してみる最初のジョブの数の候補としては、 コアの数の半分から倍の数の間で検討してみてください。 ジョブの数は、`-j` を使って指定します。

例17.1 構築のジョブの数を増やす

以下は 4 つのジョブで world とカーネルを構築する例です。

    # make -j4 buildworld buildkernel

#### 17.5.4.3. カーネルのみを構築する

ソースコードが変更された場合には、 `buildworld` を完了しなければいけません。 その後、いつでも `buildkernel` でカーネルを構築できます。 カーネルだけを構築するには、以下のように実行してください。

    # cd /usr/src
    # make buildkernel

#### 17.5.4.4. カスタムカーネルの構築

FreeBSD 標準のカーネルは、 `GENERIC` と呼ばれる カーネルコンフィグレーションファイル に基づいています。 `GENERIC` カーネルには、 最も良く使われるデバイスドライバやオプションが含まれています。 しかしながら、 特定の目的に合わせてデバイスドライバやオプションを削除したり追加するためには、 カスタムカーネルを構築することが有用であったり、 必要となることがあります。

たとえば、極端に RAM が制限されているような小さな組み込みのコンピュータを開発しているユーザであれば、 必要のないデバイスドライバやオプションを削除することで、 カーネルを少しでも小さくできるでしょう。

カーネルのコンフィグレーションファイルは、 `/usr/src/sys/`arch`/conf/` に置かれています。ここで、 `arch` は `uname -m` の出力です。 ほとんどのコンピュータは `amd64` であり、 コンフィグレーションファイルが置かれているディレクトリは `/usr/src/sys/`amd64`/conf/` です。

### ヒント:

`/usr/src` は、 削除されたり作り直されたりする可能性があるため、 カスタムカーネルのコンフィグレーションファイルは、 `/root` のような別のディレクトリで管理することが好ましいです。 カーネルコンフィグレーションファイルは、 `conf` ディレクトリにリンクします。 このディレクトリが削除されたり、上書きされた場合には、 カーネルコンフィグレーションファイルを新しいディレクトリにもう一度リンクしてください。

カスタムコンフィグレーションファイルは、 `GENERIC` コンフィグレーションファイルをコピーして作成できます。 たとえば、 ストレージサーバ用の `STORAGESERVER` という名前の新しいカスタムカーネルは、 以下のようにして作成できます。

    # cp /usr/src/sys/amd64/conf/GENERIC /root/STORAGESERVER
    # cd /usr/src/sys/amd64/conf
    # ln -s /root/STORAGESERVER .

その後 `/root/STORAGESERVER` を編集し、 config(5) で示されるデバイスやオプションを追加したり削除してください。

コマンドラインからカーネルコンフィグレーションファイルを `KERNCONF` に指定することで、 カスタムカーネルを構築できます。

    # make buildkernel KERNCONF=STORAGESERVER

### 17.5.5. コンパイルされたコードのインストール

`buildworld` および `buildkernel` が完了したら、 新しいカーネルと world をインストールしてください。

    # cd /usr/src
    # make installkernel
    # shutdown -r now
    # cd /usr/src
    # make installworld
    # shutdown -r now

カスタムカーネルを構築した場合は、 新しいカスタムカーネルを `KERNCONF` に設定して実行してください。

    # cd /usr/src
    # make installkernel KERNCONF=STORAGESERVER
    # shutdown -r now
    # cd /usr/src
    # make installworld
    # shutdown -r now

### 17.5.6. アップデートの完了

アップデートの完了までに、いくつかの最終作業が残されています。 デフォルトから変更した設定ファイルを新しいバージョンのファイルにマージし、 古くなったライブラリを見つけて削除した後に、 システムを再起動します。

#### 17.5.6.1. mergemaster(8) を用いた設定ファイルのマージ

mergemaster(8) を用いることで、 システムの設定ファイルに行われている変更を、 簡単にこれらのファイルの新しいバージョンにマージできます。

`-Ui` オプションを使って mergemaster(8) を実行すると、 ユーザが手を加えていないファイルのアップデートおよび新しく追加されたファイルのインストールを自動的に行います。

    # mergemaster -Ui

ファイルのマージを手動で行う必要がある時は、 ファイルの中で残す箇所の選択を対話的におこなうようなインタフェースが表示さます。 詳細については、mergemaster(8) をご覧ください。

#### 17.5.6.2. 使われなくなったファイルやライブラリの確認

アップデート後に、 使われなくなったファイルやディレクトリが残ることがあります。 これらのファイルは、

    # make check-old

で確認でき、以下のようにして削除できます。

    # make delete-old

同様に使われなくなったライブラリが残ることもあります。 これらのライブラリは、

    # make check-old-libs

で確認でき、以下のようにして削除できます。

    # make delete-old-libs

これらの古いライブラリを利用しているプログラムは、 ライブラリが削除されると動かなくなります。 これらのプログラムは、古いライブラリを削除した後に、 再構築もしくは置き換える必要があります。

### ヒント:

古いファイルとディレクトリのすべてを削除しても問題ないことを確認したら、 コマンドに `BATCH_DELETE_OLD_FILES` を設定することで、各ファイルを削除する際に y および Enter を押さなくても済むようにできます。以下はその例です。

    # make BATCH_DELETE_OLD_FILES=yes delete-old-libs

#### 17.5.6.3. アップデート後の再起動

コンピュータを再起動して、すべての変更を反映させることが、 アップデートの最後におこなう作業です。

    # shutdown -r now

戻る〓 | 上に戻る | 〓次へ
17.4. 開発ブランチを追いかける〓 | ホーム | 〓17.6. 複数のマシンで追いかける

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

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