Help us understand the problem. What is going on with this article?

Debian Installerの挙動について

More than 1 year has passed since last update.

この資料はDebian Installer internalsにあるRunning Debian Installerの章を翻訳または要約して、説明を付け加えたものです。

元資料はDebian"etch"時点(2006年?)の資料のようなので、最新のものとは差異があるかもしれません。
("stretch"インストール時のsyslogを見る限りでは大きな違いはないように思います)

Attribution

オリジナルの資料はGNU GPL v2の元、再配布や改変が許可されています。

Copyright © 2006 © Frans Pop fjp@debian.org
This article is free; you may redistribute it and/or modify it under the terms of version 2 of the GNU General Public License.

Debian Installerって?

Debian InstallerはDebian系ディストリビューションでOSのインストールに使われているプログラムです。
公式からOSのインストールイメージが配布されていますが、インストールイメージからマシンを起動した際に実行されるプログラムがDebian Installerです。

一方RedHat系OSではAnacondaというプログラムが使用されています。※ここでのAnacondaはPythonのディストリビューションの話ではありません。Pythonで書かれていますが。(紛らわしいですね)

インストール処理の概要

インストール処理は5つのステージで構成されています。

  1. ブートと初期化 : 追加コンポーネントをロードできるようにインストーラーをセットアップします
  2. 追加コンポーネントのロード : 全機能が動作するようにインストーラーを拡張します
  3. ネットワーク設定(ステージ1で行われていない場合)
  4. パーティショニング
  5. ターゲットシステムのインストール

最初の3ステップはインストール方法(CD-ROM/NETBOOT*1)によって大きく異なります。この3ステップで使用されるコンポーネント(udeb*2)はinitrd*3に含まれている必要があります。

下記テーブルは最初の3ステージに関連するコンポーネントをCD/DVDからブートした場合と、ネットワークからブートした場合に分けて記述しています。

ステージ CD/DVD ネットワークブート コメント
- initrd-preseed /preseed.cfgがある場合のみ
1 localechooser 言語/国/ロケール選択
1 kbd-chooser キーボード選択
1 cdrom-detect eth-detect ハードウェアの検出とセットアップ
1 netcfg ネットワーク設定
- file-preseed network-preseed ブートプロンプトで選択されている場合
2 choose-mirror ミラーの選択
2 load-cdrom (anna) download-installer (anna) 追加コンポーネントの取得と展開
3 eth-detect ハードウェアの検出とセットアップ
3 netcfg ネットワーク設定
3 choose-mirror ミラーの選択(ステージ4に必要な場合がある)

ステージ4と5で要求されるコンポーネントはインストール方法によらず同じです。

ステージ コメント
4 hw-detect 追加ハードウェアの検出
4 partman パーティションの作成, ファイルシステムの作成, マウントポイントの選択
5 tzsetup タイムゾーンの選択
5 clock-setup ハードウェアクロックをUTCかローカルタイムゾーンに設定する
5 user-setup ルートと通常ユーザーを作成する
5 base-installer ベースシステム(debootstrap*5)とカーネルのインストール
5 apt-setup ターゲットシステムにAPTの設定を行う(sources.list)
5 pkgsel 追加パッケージをインストールする(tasksel)
5 grub/lilo-installer; nobootloader ブートローダーのインストール
5 finish-install インストールの完了と再起動

NOTE

  1. NETBOOT PXELINUXを使ってインストーラーをネットワークブートした際のことを指していると思います
  2. udeb uはマイクロ(μ)を表しています。udebはDebianInstallerでのみ使用される小さなdebパッケージです。領域を無駄にしないようドキュメント等が省かれています。資料中のコンポーネントという用語はudebパッケージを指しているようです。Debian Installerは最小限のコンポーネントを初期RAMディスクに含めておき、その他必要なものを動的にロードするという挙動になるようです。
  3. initrd 初期RAMディスクはLinuxシステム起動の際に使用される一時的なファイルシステムで、通常はルートファイルシステムをマウントするために使用されます。ISOインストーラーに含まれるisolinux.cfgを参照するとルートファイルシステムが指定されていません。つまりDebianのインストーラーはメモリ上に展開された初期RAMディスク上で動作するプログラムということになります。ちなみにRedHat系OSは若干挙動が異なって、初期RAMディスクをメモリに展開した後でインストーラーに含まれる LiveOS/squashfs.img をルートファイルシステムとしてマウントする、という挙動になるようです。*4
  4. ISOLINUX ISOからシステムを起動するためのブートローダー。Syslinuxプロジェクトに含まれるコンポーネントの一つです。
  5. debootstrap Debian系OSのベースシステムをインストールするために使用されるプログラム。Debian Installerでベースシステムの作成に使用されるほか、chrootで動作するDebian環境を作成するためにも使用される。

インストーラーの起動/実行プロセス

インストーラーの起動プロセスは通常のシステム起動と似ています。ブートローダー(いつくかのケースではシステムのファームウェア)はKernelと初期RAMディスクをロードしてinitを開始します。ブートプロセスはBOOT_DEBUGパラメーターを追加することでデバッグすることが出来ます。

追加のカーネルパラメーターやブートパラメータを指定することが可能です。これは未適合のハードウェアをサポートするために必要になる場合があります。

次のリストは起動ステップの概要を説明しています。

1 - /init(initramfs)もしくは/sbin/init(initrd): 初期環境をセットアップする(/proc, /dev; udevを実行する)

2 - busybox init: /etc/inittabが読み込まれる。inittabには次の内容が含まれる:

  • ::sysinit:/sbin/debian-installer-startup
  • ::respawn:/sbin/debian-installer
  • VT2 (busybox shell), VT3 (/var/log/messages), VT4 (/var/log/syslog)の初期化

3 - /sbin/debian-installer-startup

これは/lib/debian-installer-startup.d以下にあるスクリプトを実行したりソースとして読み込んだりする、モジュール実行者的なスクリプトです。実行される主な処理は

  • 必要ならdevfssysfsをマウントする
  • udev/hotplugを実行する
  • acpiモジュールをロードする
  • syslogを開始する
  • メモリをチェックして必要ならあらかじめ指定された制限に応じてlowmemモードを有効化する
  • 初期RAMディスクの中に存在するdebconfテンプレートを読み込む
  • ブートパラメーターを読み込んでdebconfパターン(<component>/<template>=<value>)を見つけ出し、debconfデータベースにセットする
  • 使用されているコンソールタイプを検出する
  • framebufferモジュールをロードする
  • インストーラーがrescueモードで実行されるべきかを検出する

4 - /sbin/debian-installer

これは/lib/debian-installer.d以下にあるソーススクリプトを実行する、モジュール実行者的なスクリプトです。実行される主な処理は

  • フレームバッファーデバイスが利用できるかどうか検出する
  • コンソールを初期化する(空にする, UTF-8)
  • どのdebconfフロントエンドが使用されるべきか検出する(text, newt, gtk)
  • main-menuを開始する(詳細は次のセクション)
  • システムを停止または再起動する(main-menuの終了後)

/lib/debian-installer(-startup).d以下のスクリプトはアーキテクチャに依存する場合があります。

Debian Installer Menu

コンポーネントmain-menuはインストールの残りの部分を実行します。このコンポーネントはメニューを動的に組み立てて、選択されたコンポーネントを実行します。メニューはdebconfのプライオリティが低または中の場合のみ表示されることに注意してください。プライオリティが高の場合もコンポーネントは存在していますが、ユーザーに表示することなく実行されます。

debconfのプライオリティは自動的に変更される場合があります。コンポーネントの実行が失敗した場合やユーザーが<Go Back>を選択してメニューに戻った場合、プライオリティは低く設定されます。このようなケースでは次のコンポーネントの実行に成功するとプライオリティは元の値に戻されます。

udebの重要な特徴の一つはpostinstスクリプトの実行が先送りされるということです。インストール時にはudebはファイルシステムへの展開のみ行われ、postinstスクリプトの実行はmain-menuによって行われます。実際にはあるコンポーネントが選択された際に実行されます。
言い換えればmain-menuはudebのコンフィギュレーションを行う責任を負っているとも表現できます。

メニューに含まれるコンポーネントは、dpkgステータスファイル(/var/lib/dpkg/status)にInstaller-Menu-Item行を含んでいる必要があります。メニュー内のコンポーネントの順序は第一にコンポーネントの依存性で決まります。メニューアイテムナンバーはコンポーネントの順番が依存性だけでは決定できない際に使用されます。

次のサンプルのように、Providesは事実上他のコンポーネントが依存する状態を定義するために使用出来ます。(choose-mirrorはnetcfgのProvides: configured-networkに依存しています)

Package: netcfg
Status: install ok installed
Version: 1.23
Provides: configured-network
Depends: libc6 (>= 2.3.5-1), libdebconfclient0, libdebian-installer4 (>= 0.37),
         dhcp-client-udeb | dhcp3-client-udeb | pump-udeb, libiw28-udeb,
         cdebconf-udeb, ethernet-card-detection
Description: Configure the network
Installer-Menu-Item: 18

Package: choose-mirror
Status: install ok unpacked
Version: 1.19
Depends: libc6 (>= 2.3.5-1), libdebconfclient0, libdebian-installer4 (>= 0.38),
         configured-network
Description: Choose mirror to install from
Installer-Menu-Item: 23

また、このサンプルはnetcfgの実行が成功し("installed")、かつchoose-mirrorは未処理である("unpacked")ことを示しています。

いくつかのコンポーネントはメニューに含まれていますが、既定では実行されません。これらのコンポーネントはfinish-installよりも大きなメニュー番号を持っています。例としてはdebconfのプライオリティを変えるもの、デバッグログの保存、CD-ROMの検査、インストールのキャンセルなどです。

追加の柔軟性を提供するフック

インストールの特定の段階で、コンポーネントはスクリプトの部品実行的な仕組みを提供しています。これにより、他のコンポーネントがスクリプトを所定のディレクトリに置いておくことで、postinstスクリプトがすでに実行されているか否かにかかわらず、インストールの特定の時点でコマンドを実行させることができます。

主なフックは:

/usr/lib/base-installer.d

  • base-installerによってdebootstrapの前に実行される

/usr/lib/post-base-installer.d

  • base-installerによってkernelの選択/インストールの直前に実行される

/usr/lib/finish-install.d

  • finish-installによって実行される

そのほか、特別な用途で使用される/usr/lib/apt-setup/generators, /lib/main-menu.d/lib/rescue.dがあります。

これら一般的なフックのほか、partmanは大きなフックのコレクションで構成されていて、すべてのスクリプトは機能拡張のためにフックとして配置されます。最も注目すべきフックはブートローダーがパーティショニングが要求を満たしているか検証するためのスクリプトを配置する/lib/partman/finish.dです。

特別なツール

インストーラーにはpostinstスクリプトやpreseedingスクリプトで使用される特別なコマンドが含まれています。

  • anna-install 追加の非標準d-iコンポーネント(udeb)をインストールするために使用される。このツールはannaがすでに実行されたかどうかチェックします。もしそうならばコンポーネントをすぐに展開し、そうでないならばannaが実行された際にインストールされるようスケジュールします。

  • apt-install 標準のパッケージ向けに(通常のaptと)同様の機能を提供し、ターゲットシステムにパッケージのインストールを行います。パッケージはbase-installerが実行済であれば即座にインストールされ、もしそうでなければ"extra"パッケージとしてbase-installerのpostinstスクリプトの終わり近くでインストールされるようスケジュールされます。

  • log-output コマンドを実行して出力(stdoutとstderrどちらかまたは両方)を/var/log/syslogに出力します。

  • in-target /targetディレクトリ*1にchrootしてコマンドを実行します。このコマンドはより要求の多いコマンドを実行できるようchroot環境をセットアップします。例えばprocsysfsをマウントしたりpolicy-rc.dを作成します。このコマンドは当然ベースシステムがインストールされた後でなければ使用できません。

NOTE

  1. /target インストーラーによって作成されたパーティションはこのディレクトリにマウントされます。

preseedingを使用したインストールの自動化

現在3つの方法でpreconfigurationがサポートされています。

  • initrd preseeding /preseed.cfgは初期RAMディスク内に存在している必要があります。このファイルはdebian-installer-startup処理で読み込まれます。
  • file preseeding preseed/fileブートパラメーターがある場合トリガーされます
  • network preseeding preseed/urlブートパラメーターがある場合トリガーされます

インストール方法によって利用できる設定が異なります。

preseedingの主要な目的はdebconfの質問に対して規定値を与えることです。ファイル/ネットワークpreseedingに対して、preconfigurationファイルが読み込まれる前の質問項目に対して規定値を与えても意味をなさないことに注意してください。

debconfの質問に規定値を与える一方で、preseedingはpreseed/early_commandpreseed/late_commandを使って異なるタイミングでスクリプトを実行することが出来ます。early_commandはpreconfigurationファイルが読み込まれた直後に実行されます(ファイル/ネットワークpreseedingのみ)。late_commandfinish-installコンポーネントの一部として実行されます。

これらのスクリプトで複雑な処理を行うことが出来ます。一つの例としてはターゲットシステムにパッケージを追加でインストールすることが出来ます(apt-installを使って)。*early_command *で追加のd-iコンポーネントをインストールしたり(anna-installで)、もし特定のタイミングで実行されるべきスクリプトがあるのであれば、フックとして所定のディレクトリに配置することもできます。

インストーラーのデバッグ

インストーラーの大部分はスクリプトなので、多くの問題はset -xを正しい位置にセットすることでかなり簡単にデバッグすることが出来ます。一番わかりやすい位置はデバッグしたいコンポーネントのpostinstスクリプトです。出力は/var/log/syslogで確認することが出来ます。ネットワークが開始された後であれば"Save debug logs"オプションを使って内部的なWebサーバーを起動することで簡単に出力を確認できます。

Cで書かれたコンポーネントのデバッグは少し大変です。オプションとしてはstrace udebを使用する方法(必要であればカスタムのイメージに追加する)や、ソースにデバッグコードが追加されたカスタムのコンポーネントを作成してそれを使用することです。

デバッグのためにコンポーネントが開始された際にコントロールを取得したいだろうと思います。インストーラーをinstall debconf/priority=mediumとともに起動するのは良い方法です。これによりコンポーネントが開始される前にメニューが表示されます。

インストーラーがmidiumプライオリティで開始されると、オプションコンポーネントopen-ssh-clientをロードすることが出来ます。このコンポーネントをロードすることでログファイルをscpなどで他のコンピューターにコピーすることが出来ます。udebやイメージを作り直すことなく新しいスクリプトやコマンドをテストする場合にも役に立つでしょう。netcatパッケージに含まれるncコマンドはデフォルトで利用可能です。

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away