Product SiteDocumentation Site

12.3. 自動インストール

巨大な IT サービスの管理者と同様に Falcot Corp の管理者もまた、新しいマシンへシステムを素早く (可能であれば自動的に) インストール (または再インストール) するツールを必要としています。
自動インストールの要求に応えるためのさまざまな解決策が存在します。一方では、SystemImager などの一般的なツールが存在します。こちらの解決策ではテンプレートマシンに基づくイメージを事前に準備し、そのイメージを目標のシステムで展開します。他方では、標準的な Debian インストーラが存在します。こちらの解決策ではインストール作業中に尋ねられる質問の回答を含めた設定ファイルを事前に準備し、この設定ファイルに基づいて目標のシステムを設定します。両者の折衷案として、FAI (Fully Automatic Installer) などのハイブリッドツールが存在します。こちらの解決策ではパッケージングシステムでシステムをインストールし、自分自身の機能を使って大規模な配備に特有のタスク (起動、パーティショニング、設定など) をこなします。
Each of these solutions has its pros and cons: SystemImager works independently from any particular packaging system, which allows it to manage large sets of machines using several distinct Linux distributions. It also includes an update system that doesn't require a reinstallation, but this update system can only be reliable if the machines are not modified independently; in other words, the user must not update any software on their own, or install any other software. Similarly, security updates must not be automated, because they have to go through the centralized reference image maintained by SystemImager. This solution also requires the target machines to be homogeneous, otherwise many different images would have to be kept and managed (an amd64 image won't fit on a powerpc machine, and so on).
On the other hand, an automated installation using debian-installer can adapt to the specifics of each machine: the installer will fetch the appropriate kernel and software packages from the relevant repositories, detect available hardware, partition the whole hard disk to take advantage of all the available space, install the corresponding Debian system, and set up an appropriate bootloader. However, the standard installer will only install standard Debian versions, with the base system and a set of pre-selected “tasks”; this precludes installing a particular system with non-packaged applications. Fulfilling this particular need requires customizing the installer… Fortunately, the installer is very modular, and there are tools to automate most of the work required for this customization, most importantly simple-cdd (CDD being an acronym for Custom Debian Derivative). Even this solution, however, only handles initial installations; this is usually not a problem since the APT tools allow efficient deployment of updates later on.
We will only give a rough overview of FAI, and skip SystemImager altogether (which is no longer in Debian, but available as a third-party package), in order to focus more intently on debian-installer and simple-cdd, which are more interesting in a Debian-only context.

12.3.1. Fully Automatic Installer (FAI)

Fully Automatic Installer はおそらく最も古い Debian 用の自動配備システムで、基準としての地位を確立しています。しかしその一方で FAI の高い柔軟性は FAI の複雑性によって成し遂げられています。
FAI には、配備情報を保存してネットワークから目標のマシンを起動することを可能にするために、サーバシステムが必要です。サーバシステムには、fai-server パッケージ (または fai-quickstart、これには、標準的な設定に必要な要素が含まれています) が必要です。
FAI uses a specific approach for defining the various installable profiles. Instead of simply duplicating a reference installation, FAI is a full-fledged installer, fully configurable via a set of files and scripts stored on the server; the default location /srv/fai/config/ according to /etc/fai/nfsroot.conf is not automatically created, so the administrator needs to create it along with the relevant files. Most of the times, these files will be customized from the example files available in the documentation for the fai-doc package, more particularly the /usr/share/doc/fai-doc/examples/simple/ directory.
Once the profiles are defined, the fai-setup command generates the elements required to start an FAI installation; this mostly means preparing or updating a minimal system (NFS-root) used during installation. An alternative is to generate a dedicated boot CD with fai-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 の事前設定

At the end of the day, the best tool to install Debian systems should logically be the official Debian installer. This is why, right from its inception, debian-installer has been designed for automated use, taking advantage of the infrastructure provided by debconf. The latter allows, on the one hand, to reduce the number of questions asked (hidden questions will use the provided default answer), and on the other hand, to provide the default answers separately, so that installation can be non-interactive. This last feature is known as preseeding.

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 などです)。
  • from the network; preseeding then only happens after the network is (automatically) configured; the relevant boot parameter is then preseed/url=http://server/preseed.cfg (HTTPS, FTPS, SFTP, etc. are not supported).
一見すると、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 パッケージからの質問の場合パッケージ名を使います。
  • the second field is an identifier for the question (the template name);
  • 3 番目のフィールドは質問の種類です。
  • 4 番目以降のフィールドは質問に対する回答です。3 番目のフィールドの後ろに必ず 1 つの空白を含めなければいけない点に注意してください。さらに 1 つ以上の回答がある場合、続く空白文字は回答の一部として取り扱われます。
preseed ファイルを書く最も簡単な方法はシステムを手作業でインストールする方法です。インストール完了後に debconf-get-selections --installer を実行してインストーラに関連する回答を取得します。debconf-get-selections を使えば、他のパッケージに関連する回答を取得することが可能です。しかしながら、最も明確な解決策は記載例と基準文書を参考にしながら手作業で preseed ファイルを書くことです。なぜなら、このような取り扱い方をすることで、デフォルト回答に対して上書きが必要な質問だけに回答を事前指定することが可能だからです。さらに priority=critical 起動パラメータ使うことで、Debconf が重要な質問だけを尋ね、他の質問にはデフォルトの回答を使うようにすることが可能です。
Pre-setting a value in a preseed file automatically instructs the Debian installer to not ask that question. This happens, because loading the preseed file does not just set the given value(s), but also marks each of the affected dialogs as “seen“ by the user. Thus it is possible to pre-set a question's value and still present the dialog to the user by resetting the “seen“ flag. Beware that order in this case matters and that the value has to be preseeded before setting the dialog to “unseen“ as shown in the following example:
d-i netcfg/hostname string worker
d-i netcfg/hostname seen false

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

preseed ファイルを保存する場所を知ることは誠に結構なことですが、場所がすべてではありません。なぜなら、起動パラメータを変更し preseed ファイルを追加するためには、いずれにせよインストール用の起動メディアを改造しなければいけないからです。
12.3.2.3.1. ネットワークからの起動
When a computer is booted from the network, the server sending the initialization elements also defines the boot parameters. Thus, the change needs to be made in the PXE configuration for the boot server; more specifically, in its /tftpboot/pxelinux.cfg/default configuration file. Setting up network boot is a prerequisite; see the Installation Guide for details.
12.3.2.3.2. 起動可能な USB メモリの準備
Once a bootable key has been prepared (see 第 4.1.2 節「USB メモリからの起動」), a few extra operations are needed. Assuming the key contents are available under /media/usbdisk/, copy the preseed file to /media/usbdisk/preseed.cfg.
If you have been using a hybrid ISO image to create the bootable USB stick, then you have to edit /media/usbdisk/boot/grub/grub.cfg (for the EFI boot screen):

例 12.2 boot/grub/grub.cfg file and preseeding parameters

menuentry --hotkey=i 'Install' {
    set background_color=black
    linux    /install.amd/vmlinuz preseed/file=/cdrom/preseed.cfg locale=en_US.UTF-8 keymap=us language=us country=US vga=788 --- quiet 
    initrd   /install.amd/initrd.gz
}
And you have to edit /media/usbdisk/isolinux/isolinux.cfg (for BIOS boot) or one of the files it utilizes - e.g. /media/usbdisk/isolinux/txt.cfg - to add required boot parameters:

例 12.3 isolinux/txt.cfg file and preseeding parameters

label install
        menu label ^Install
        kernel [...]
        append preseed/file=/cdrom/preseed.cfg locale=en_US.UTF-8 keymap=us language=us country=US vga=788 initrd=/install.amd/initrd.gz --- quiet
If you have been using the hd-media installer image for a custom USB stick, edit /media/usbdisk/syslinux.cfg and add the required boot parameters as shown in the example below:

例 12.4 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 を一読することを強く推奨します。
Having said that, debian-cd always operates in a similar way: an “image” directory with the exact contents of the CD-ROM is generated, then converted to an ISO file with a tool such as genisoimage, mkisofs or xorriso. The image directory is finalized after debian-cd's make image-trees step. At that point, we insert the preseed file into the appropriate directory (usually $TDIR/$CODENAME/CD1/, $TDIR and $CODENAME being parameters defined by the CONF.sh configuration file). The CD-ROM uses isolinux as its bootloader, and its configuration file must be adapted from what debian-cd generated, in order to insert the required boot parameters (the specific files are $TDIR/$CODENAME/CD1/isolinux/isolinux.cfg and $TDIR/$CODENAME/CD1/boot/grub/grub.cfg as shown above). Then the “normal” process can be resumed, and we can go on to generating the ISO image with make image CD=1 (or make images if several CD-ROMs are generated).

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

単純に preseed ファイルを使うだけでは、大規模な配備に要求されるすべてを満足させることはできません。preseed ファイルを使うことで、通常のインストール作業の最後にいくつかのスクリプトを実行することが可能とは言うものの、インストールするパッケージ群の選択にはまだ大きな制限があります (基本的に「tasks」を選択できるだけです)。それどころかより重要なこととして、preseed ファイルを使えば公式の Debian パッケージをインストールすることが可能ですが、自前で作成したパッケージをインストールすることは不可能です。
On the other hand, debian-cd is able to integrate external packages, and debian-installer can be extended by inserting new steps in the installation process. By combining these capabilities, it should be possible to create a customized installer that fulfills our needs; it should even be able to configure some services after unpacking the required packages. Fortunately, this is not a mere hypothesis, since this is exactly what simple-cdd does.
The purpose of this tool is to allow anyone to easily create a distribution derived from Debian, by selecting a subset of the available packages, preconfiguring them with Debconf, adding specific software, and executing custom scripts at the end of the installation process. This matches the “universal operating system” philosophy, since anyone can adapt it to their own needs.

12.3.3.1. プロファイルの作成

Simple-CDD は FAI における「クラス」の概念に対応する「プロファイル」を定義し、マシンは (インストール時に定義される) 複数のプロファイルを持つことが可能です。プロファイルは以下に挙げる profiles/profile.* ファイルを使って定義されます。
  • .description ファイル。プロファイルに関する 1 行の説明が含まれます。
  • .packages ファイル。プロファイルが選択された場合に自動的にインストールするパッケージがリストされています。
  • .downloads ファイル。インストールメディアに保存するがシステムにインストールしないパッケージがリストされています。
  • .preseed ファイル。(インストーラおよびパッケージの) Debconf 質問に関する preseed 情報が含まれます。
  • .postinst ファイル。インストール作業の最後に実行されるスクリプトが含まれます。
  • lastly, the .conf file allows changing some parameters based on the profiles to be included in an image.
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 イメージの生成

Once we have written a configuration file and defined our profiles, the remaining step is to invoke build-simple-cdd --conf simple-cdd.conf. After a few minutes, we get the required image in images/debian-11-amd64-CD-1.iso.