Product SiteDocumentation Site

12.3. 自動インストール

巨大な IT サービスの管理者と同様に Falcot Corp の管理者もまた、新しいマシンへシステムを素早く (可能であれば自動的に) インストール (または再インストール) するツールを必要としています。
自動インストールの要求に応えるためのさまざまな解決策が存在します。一方では、SystemImager などの一般的なツールが存在します。こちらの解決策ではテンプレートマシンに基づくイメージを事前に準備し、そのイメージを目標のシステムで展開します。他方では、標準的な Debian インストーラが存在します。こちらの解決策ではインストール作業中に尋ねられる質問の回答を含めた設定ファイルを事前に準備し、この設定ファイルに基づいて目標のシステムを設定します。両者の折衷案として、FAI (Fully Automatic Installer) などのハイブリッドツールが存在します。こちらの解決策ではパッケージングシステムでシステムをインストールし、自分自身の機能を使って大規模な配備に特有のタスク (起動、パーティショニング、設定など) をこなします。
これらの解決策には、利点と欠点があります。たとえば SystemImager は特定のパッケージングシステムに依存しません。このことにより、複数の Linux ディストリビューションを使う数多くのマシン群を管理することが可能です。SystemImager には再インストール不要の更新システムが含まれていますが、この更新システムを信頼できるのは各マシンは個別に変更されないという仮定が満足される場合だけです。さらに言い換えれば、ユーザは自分のマシンにインストールされたソフトウェアを更新してはいけませんし、他のソフトウェアをインストールしてもいけません。同様に、セキュリティ更新も自動的に行ってはいけません。なぜなら、セキュリティ更新は SystemImager がメンテナンスする中央集権化された基準イメージによって提供されるからです。また SystemImager による解決策では、管理される側のマシンの種類が同じである必要があります。異種マシンを管理する場合、多くの異なるイメージをメンテナンスおよび管理する必要があります (i386 用のイメージを powerpc マシンに使うことはできません)。
逆に、debian-installer を使ってインストールを自動化する場合、マシンごとの違いに適合したシステムをインストールすることが可能です。具体的に言えば、インストーラは対応するリポジトリから適切なカーネルとソフトウェアパッケージを取得し、利用できるハードウェアを検出し、利用できる領域全体を活かしてハードディスク全体をパーティショニングし、対応する Debian システムをインストールし、適切なブートローダを設定します。しかしながら、標準的なインストーラは基本システムと事前に選択された「tasks」を含む標準的な Debian バージョンをインストールするだけです。さらに、パッケージングされていないアプリケーションを備えた特製のシステムをインストールできません。この特別な必要性を満足させるにはインストーラのカスタマイズが必要です。幸いなことに、インストーラはとてもモジュール化されており、カスタマイズに必要なほとんどの作業を自動化するツールが存在します。最も重要なツールは simple-CDD です (CDD は Custom Debian Derivative の頭字語です)。しかしながら simple-CDD が取り扱うことが可能なのは最初のインストールだけです。しかしこれは通常問題になりません。なぜなら、APT ツールのおかげでインストール後の更新作業は効果的に行うことが可能だからです。
ここでは FAI については大ざっぱな概要を説明し、(もはや Debian に含まれない) SystemImager については完全に省略し、Debian だけのシステムではより興味深い debian-installer と simple-CDD に特に注目します。

12.3.1. Fully Automatic Installer (FAI)

Fully Automatic Installer はおそらく最も古い Debian 用の自動配備システムで、基準としての地位を確立しています。しかしその一方で FAI の高い柔軟性は FAI の複雑性によって成し遂げられています。
FAI には、配備情報を保存してネットワークから目標のマシンを起動することを可能にするために、サーバシステムが必要です。サーバシステムには、fai-server パッケージ (または fai-quickstart、これには、標準的な設定に必要な要素が含まれています) が必要です。
FAI は特殊なやり方で、インストールできるさまざまなプロファイルを定義します。FAI は基準となるインストール状態を単純に複製するのではありません。FAI は本格的なインストーラで、サーバに保存されているファイルとスクリプトを通じて完全に設定することが可能です。しかし、これらのファイルを保存するデフォルトの場所 /srv/fai/config/ は自動的に作成されません。このため管理者は対応するファイルと一緒にこれも作成する必要があります。ほとんどの場合、これらのファイルは例ファイルからカスタマイズされます。このファイルは fai-doc パッケージの文書の中 (より具体的に言えば /usr/share/doc/fai-doc/examples/simple/ ディレクトリの中) に含まれています。
プロファイルを定義したら、fai-setup コマンドを使って FAI のインストールを開始するために必要な要素を生成します。そしてこれはインストール中に使われる最小限のシステム (NFS-root) の準備と更新を行うことを意味します。別の方法として、fai-cd を使って専用の CD を生成することも可能です。
これらすべての設定ファイルを作成するには、FAI の動作方法を理解する必要があります。典型的なインストール作業は以下の順番で進みます。
  • ネットワークからカーネルを取得して起動します。
  • NFS でルートファイルシステムをマウントします。
  • インストール作業を制御する /usr/sbin/fai を実行します (/usr/sbin/fai が以降の各段階を初期化します)。
  • サーバから /fai/ に設定領域をコピーします。
  • fai-class を実行します。/fai/class/[0-9][0-9]* スクリプトが順番に実行され、インストールされるマシンに適用する「クラス」の名前が返されます。この情報は以降の各段階の基礎としての機能を果たします。これを使うことで、インストールおよび設定されるサービスを定義する際に幾らかの柔軟性を持たせることが可能です。
  • 対応するクラスに基づき、設定変数を取得します。
  • /fai/disk_config/class で定義された情報に基づいて、ディスクのパーティショニングとパーティションのフォーマットを行います。
  • 指定されたパーティションをマウントします。
  • 基本システムをインストールします。
  • fai-debconf を使って Debconf データベースを事前配布します。
  • APT で利用できるパッケージのリストを取得します。
  • /fai/package_config/class にリストされたパッケージをインストールします。
  • 設定後にスクリプト /fai/scripts/class/[0-9][0-9]* を実行します。
  • インストールログを記録し、パーティションをアンマウントし、再起動します。

12.3.2. Debian-Installer の事前設定

結局のところ、Debian システムをインストールする最良のツールは必然的に公式の Debian インストーラということになるでしょう。このため、当初から debian-installer は debconf の提供するインフラを活用して自動的に使えるように設計されています。debconf を使うことで、尋ねられる質問の数を減らしたり (隠された質問に対する回答はデフォルトが使われます)、質問に対する回答を個別に事前設定したりすることが可能です。このことにより、インストールを非対話的に進めることが可能です。質問に対する回答の事前設定機能は preseed として知られています。

12.3.2.1. preseed ファイルの利用

インストーラが preseed ファイルを取得することが可能な場所にはいくつかあります。
  • マシンを開始するために使われる initrd の中。この場合、インストールの最初から preseed を行い、すべての質問を回避することが可能です。preseed ファイルの名前は必ず preseed.cfg にして initrd のルートに保存しなければいけません。
  • 起動メディア (CD や USB メモリ) の中。メディアがマウントされた直後から preseed が始まります。これは言語とキーボードレイアウトに関する質問の直後を意味します。preseed/file 起動パラメータを使って preseed ファイルの場所を指定することが可能です (たとえば、インストールが CD-ROM から開始された場合は /cdrom/preseed.cfg、USB メモリから開始された場合は /hd-media/preseed.cfg などです)。
  • ネットワーク上。ネットワークが (自動的に) 設定された直後から preseed が始まります。対応する起動パラメータは preseed/url=http://server/preseed.cfg です。
一見すると、preseed ファイルを initrd の中に含めることが最もうまい解決策のように見えます。しかし、実際のところこれはほとんど行われません。なぜなら、インストーラの initrd を生成することはかなり複雑だからです。その他の 2 種類の解決策はよく使われます。なぜなら起動パラメータを使うことで、インストール作業の最初の質問の回答を他のやり方で事前指定することが可能だからです。インストールごとに起動パラメータを手作業で打ち込む手間を省くためによく使われる方法は isolinux (CD-ROM の場合) や syslinux (USB メモリの場合) の設定ファイルに起動パラメータを保存することです。

12.3.2.2. preseed ファイルの作成

preseed ファイルはプレーンテキストファイルで、各行に 1 つの Debconf 質問に対する回答が含まれます。行は空白 (スペースかタブ) で区切られた 4 種類のフィールドに分割されます。たとえば d-i mirror/suite string stable のようになります。
  • 最初のフィールドはこの質問の「所有者」です。インストーラに関する質問の場合「d-i」を使い、Debian パッケージからの質問の場合パッケージ名を使います。
  • 2 番目のフィールドは質問の識別子です。
  • 3 番目のフィールドは質問の種類です。
  • 4 番目以降のフィールドは質問に対する回答です。3 番目のフィールドの後ろに必ず 1 つの空白を含めなければいけない点に注意してください。さらに 1 つ以上の回答がある場合、続く空白文字は回答の一部として取り扱われます。
preseed ファイルを書く最も簡単な方法はシステムを手作業でインストールする方法です。インストール完了後に debconf-get-selections --installer を実行してインストーラに関連する回答を取得します。debconf-get-selections を使えば、他のパッケージに関連する回答を取得することが可能です。しかしながら、最も明確な解決策は記載例と基準文書を参考にしながら手作業で preseed ファイルを書くことです。なぜなら、このような取り扱い方をすることで、デフォルト回答に対して上書きが必要な質問だけに回答を事前指定することが可能だからです。さらに priority=critical 起動パラメータ使うことで、Debconf が重要な質問だけを尋ね、他の質問にはデフォルトの回答を使うようにすることが可能です。

12.3.2.3. カスタマイズされた起動メディアの作成

preseed ファイルを保存する場所を知ることは誠に結構なことですが、場所がすべてではありません。なぜなら、起動パラメータを変更し preseed ファイルを追加するためには、いずれにせよインストール用の起動メディアを改造しなければいけないからです。
12.3.2.3.1. ネットワークからの起動
コンピュータをネットワークから起動する場合、初期化要素を送信するサーバを使って起動パラメータを定義することも可能です。この場合、初期化要素の定義は起動サーバの PXE 設定の中で行う必要があります。より具体的に言えば /tftpboot/pxelinux.cfg/default 設定ファイルの中で設定します。そして、事前にネットワーク起動をセットアップすることが必要です。詳しくはインストールガイドをご覧ください。
12.3.2.3.2. 起動可能な USB メモリの準備
起動可能な USB メモリを用意した場合 (第 4.1.2 節「USB メモリからの起動」を参照してください)、以下に挙げるいくつかの追加的な操作が必要です。USB メモリの内容は /media/usbdisk/ で利用できるとします。
  • /media/usbdisk/preseed.cfg に preseed ファイルをコピーします
  • /media/usbdisk/syslinux.cfg を編集して、必要な起動パラメータを追加します (以下の例をご覧ください)。

例 12.2 syslinux.cfg ファイルと preseed パラメータ

default vmlinuz
append preseed/file=/hd-media/preseed.cfg locale=en_US.UTF-8 keymap=us language=us country=US vga=788 initrd=initrd.gz  --
12.3.2.3.3. CD-ROM イメージの作成
USB メモリは読み書きメディアなので、ファイルを追加したりいくつかのパラメータを変更することが簡単に可能です。CD-ROM の場合、この操作はさらに複雑になります。なぜなら、完全な ISO イメージを再生成する必要があるからです。debian-cd がこの作業を担当しますが、debian-cd ツールは少し使いにくいです。すなわち、debian-cd ツールを使うには、ローカルミラーと /usr/share/debian-cd/CONF.sh によって提供されるすべてのオプションについて理解する必要があります。そしてさらに、make を複数回実行する必要があります。このため、/usr/share/debian-cd/README を一読することを強く推奨します。
そうは言っても、debian-cd の挙動は大きく変わるものではありません。具体的に言えば CD-ROM の内容を展開した「image」ディレクトリが生成され、その後 genisoimagemkisofsxorriso などのツールを使って「image」ディレクトリを ISO ファイルに変換します。image ディレクトリは debian-cd の make image-trees 段階の後に仕上げられます。この時点で、preseed ファイルを適切なディレクトリ (通常 $TDIR/$CODENAME/CD1/ です、ここで $TDIR と $CODENAME は CONF.sh 設定ファイルによって定義されるパラメータです) に追加します。CD-ROM は isolinux をブートローダとして使います。必要な起動パラメータを追加するためには、isolinux の設定ファイル (ファイルは $TDIR/$CODENAME/boot1/isolinux/isolinux.cfg にあります) を debian-cd が生成した内容に適合させなければいけません。この後、「通常の」プロセスを再開し、make image CD=1 (または make images 複数の CD-ROM を生成する場合) を実行して ISO イメージを生成します。

12.3.3. Simple-CDD、一体型の解決策

単純に preseed ファイルを使うだけでは、大規模な配備に要求されるすべてを満足させることはできません。preseed ファイルを使うことで、通常のインストール作業の最後にいくつかのスクリプトを実行することが可能とは言うものの、インストールするパッケージ群の選択にはまだ大きな制限があります (基本的に「tasks」を選択できるだけです)。それどころかより重要なこととして、preseed ファイルを使えば公式の Debian パッケージをインストールすることが可能ですが、自前で作成したパッケージをインストールすることは不可能です。
逆に、debian-cd を使えば外部パッケージを組み込むことが可能で、debian-installer を使えばインストール作業に新しい段階を挿入するように拡張することが可能です。これらの機能を組み合わせることで、自分の要求を完全に満足するカスタマイズされたインストーラを作成することが可能です。さらにこの方針を取ることで、必要なパッケージを展開した後、いくつかのサービスを設定することが可能です。幸いなことに、この方針は単なる仮説というわけではありません。なぜなら、これこそが Simple-CDD (simple-cdd パッケージに含まれます) のやっていることだからです。
Simple-CDD の目的とは、利用できるパッケージの一部を選択したり、Debconf を使ってパッケージを事前設定したり、特定のソフトウェアを追加したり、インストール作業の最後にカスタムスクリプトを実行することで、誰でも簡単に Debian の派生ディストリビューションを作成することです。これは「ユニバーサルオペレーティングシステム」の原理に一致します。なぜなら、このことにより誰でも自分自身の要求にオペレーティングシステムを適合させることが可能だからです。

12.3.3.1. プロファイルの作成

Simple-CDD は FAI における「クラス」の概念に対応する「プロファイル」を定義し、マシンは (インストール時に定義される) 複数のプロファイルを持つことが可能です。プロファイルは以下に挙げる profiles/profile.* ファイルを使って定義されます。
  • .description ファイル。プロファイルに関する 1 行の説明が含まれます。
  • .packages ファイル。プロファイルが選択された場合に自動的にインストールするパッケージがリストされています。
  • .downloads ファイル。インストールメディアに保存するがシステムにインストールしないパッケージがリストされています。
  • .preseed ファイル。(インストーラおよびパッケージの) Debconf 質問に関する preseed 情報が含まれます。
  • .postinst ファイル。インストール作業の最後に実行されるスクリプトが含まれます。
  • .conf ファイル。イメージに保存されるプロファイルに基づいていくつかの Simple-CDD パラメータを修正することが可能です。
default プロファイルは特別な役割を担います。なぜなら default プロファイルは常に選択されるからです。そして default プロファイルには、Simple-CDD を動作させるために最低限必要な要素が含まれています。通常 default プロファイルの中でカスタマイズが必要なのは simple-cdd/profiles preseed パラメータだけです。なぜなら、これを使うことで Simple-CDD によって追加されたインストールするプロファイルの選択に関する質問を避けることが可能だからです。
コマンドは profiles ディレクトリの親ディレクトリから実行する必要がある点に注意してください。

12.3.3.2. build-simple-cdd の設定と利用

Simple-CDD を完全に動作させるには多くのパラメータが必要です。通常、パラメータは設定ファイルの中にまとめられ、この設定ファイルを build-simple-cdd--conf オプションに指定します。しかし、パラメータは専用パラメータを build-simple-cdd に渡すことでも指定することも可能です。以下では、パラメータの使い方と build-simple-cdd の挙動を大ざっぱに説明しています。
  • profiles パラメータは生成する CD-ROM イメージに含めるプロファイルをリストします。
  • Simple-CDD は要求されるパッケージのリストに基づいて、server で指定されているサーバから適切なファイルをダウンロードし、(後に debian-cd に渡される) ローカルミラーにまとめます。
  • また local_packages で指定されたカスタムパッケージがこのローカルミラーの中に統合されます。
  • この後、組み込むパッケージのリストを使って debian-cd が実行されます (実行場所は debian_cd_dir 変数を使って設定されたデフォルト位置です)。
  • debian-cd が debian_cd_dir で指定したディレクトリを用意した後、Simple-CDD はいくつかの変更をこのディレクトリに加えます。
    • プロファイルを含むファイルが simple-cdd サブディレクトリに追加されます (CD-ROM に追加されます)。
    • all_extras パラメータで指定された他のファイルがディレクトリに追加されます。
    • 起動パラメータが調整され、preseed が有効化されます。言語と国に関する質問を避けるには、これらの情報を languagecountry 変数に保存します。
  • この後、debian-cd が最終的な ISO イメージを生成します。

12.3.3.3. ISO イメージの生成

設定ファイルの記述と自分のプロファイルの定義が完了したら、build-simple-cdd --conf simple-cdd.conf を実行します。数分後、要求されたイメージが images/debian-8.0-amd64-CD-1.iso に完成します。