LinuxインストールDVDの内部動作 - initrd, isolinux, vmlinuz, Anacondaなど-

普段何気なく使っているインストールDVDだが、裏では initrd、isolinux、vmlinuz、Anaconda など、様々なファイルやソフトウェアーが協調して動作している。

本稿では、LinuxインストールDVDの内部動作を追い、initrd、isolinux、vmlinuz、Anaconda などについて理解を深めることを目的とした。

コンテンツは下記のとおり。
  • インストールDVDの中身
  • 基本的なブートの仕組み
  • initrdについて
  • インストールDVDのディレクトリー構造
  • インストーラーが起動するまでの流れ
  • インストールされるシステムはどこにあるのか

インストールDVDの中身

インストールDVD = インストーラーではない。

インストーラーは、インストールDVDに含まれる一部のファイルであり、インストールプログラム(installation program)などと呼ばれる。
インストールプログラムは、インストールDVDに含まれるリソースを使いながら、実際のインストール作業を行うプログラムである。
例えば、FedoraやRed Hat系ディストリビューションでは、Anacondaという名前のインストールプログラムが使われている。

インストールプログラムは、インストールという特別な作業を行うことを除けば、普通のプログラムと変わらない。
例えば、Anacondaは、PythonとCで書かれたプログラムである。
よって、実行するにはOSが必要である。
つまり、新しくOSをインストールするために、(既存の)OSを起動(ブート)することになる。
インストールプログラムを実行するためにブートするOSは、起動に必要なリソースとともに、インストールDVDの中に入っている。

まとめると、インストールDVDは下記を含むメディアと言える。
  • インストールプログラム、及びインストールに必要なリソース
  • インストールプログラムを実行するために起動するOS、及び起動に必要なリソース

基本的なブートの仕組み

上に書いたように、インストールプログラムを実行するためには、インストールDVDの中に入っているOSを起動(ブート)することになる。
よって、インストールDVDの動作を理解するためには、ブートを理解する必要がある。

我々は普段、ハードディスクからブートすることが多いと思うが、インストールDVDからブートする流れは、ハードディスクとは異なっている。

とは言え、ハードディスクからブートする流れは基本となるので、以下に流れを簡単にまとめる。

マシンの電源を入れると、下記のソフトウェアーが順に呼び出される。

BIOS → ブートローダー → OS(カーネル)

下記に、各ソフトウェアーの動きを簡単に示す。

BIOS
  • PCを初期化
  • ブートローダーを呼び出す
ブートローダー
  • カーネルをロードする
カーネル
  • ルートファイルシステムをmountする
  • /sbin/initを実行する
ブートローダーとしては、grub, liloなどが有名である。
ブートローダーは、マスターブートレコード(MBR)に格納されている。
MBRはハードディスク上の特定の場所であり、BIOSが最初に読み込む仕様になっている。
この仕様により、BIOSはブートローダーを見つけることができる。

/sbin/initはシステムの初期化スクリプトを実行していき、ランレベルに応じて指定されたデーモンが起動する。

このあたりは、下記にわかりやすく説明されている。

「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典


Linuxがブートするまで

initrdについて

インストールDVDなど、CD-ROMからブートする場合は、initrdを使う。
ここでは、initrdの概要と、initrdを使った場合のブートの流れについて述べる。

initrdの概要

initrdは、カーネルが起動される前に、ブートローダーによってロードされるRAMディスクである。
後述するが、インストールDVDの中に入っている。

RAMディスクとは、メモリーをストレージとして扱う仕組みである。ディスクドライブをエミュレートするので、OSからはハードディスクなどと同じに見える。デバイスファイルとしては、/dev/initrdとなる。

カーネルが起動すると、カーネルはinitrdの中身を利用する。
カーネルがinitrdの中身を利用する動きは、下記の2段階に大別されるため、two-phase system boot-upと呼ばれている。
  1. initrdを、初期ルートファイルシステム(一時的なルートファイルシステム)としてmountする
  2. initrdの中にあるドライバーやモジュールを利用して、実際のルートファイルシステムをmountする
初期ルートファイルシステムは、initial root filesystem、initramfsなどと呼ばれる。
実際のルートファイルシステムは、real root filesystem、actual root file system、true root file systemなどと呼ばれる。
なお、後述するが、実際のルートファイルシステムもインストールDVDに含まれており、インストールDVDにおける実際のルートファイルシステムとは、インストールプログラムを実行する環境となるルートファイルシステムである。

なぜ、CD-ROMからOSを起動する場合は、initrdが必要なのだろうか?
実際のルートファイルシステムは、CDに収めるために圧縮されているので、mountする前にファイルシステムの種類を判別する必要がある。また、実際のルートファイルシステムをmountするために必要なモジュールを、mountする前に準備する必要がある。
このような前処理を実行するために、initrdが使われる。initrdには、最小限のシェル、実際のルートファイルシステムのmountに必要なカーネルモジュール、ブート時に任意の処理を行うスクリプトが含まれているので、最初にinitrdを一時的にmountし、その環境で、実際のルートファイルシステムのmountに必要な前処理を行う仕組みになっている。

なお、/linuxrc という実行可能なファイルが初期ルートファイルシステムに存在すれば、/linuxrc をroot権限で実行する仕様となっている。

このあたりの動きは、下記のドキュメントや、manページ(man initrd)に詳しい。

MakeALiveCD/DVD/BootableFlashFromHarddiskInstall
Anaconda/HowItWorks


initrdを使った場合のブートの流れ

initrdを使った場合、ブートは下記のように進む。
上述の「ハードディスクからOSを起動する仕組み」の流れに、initrdのロードや、initrdのmountが追加された形となっている。

BIOS
  • PCを初期化
  • ブートローダーを呼び出す
ブートローダー
  • カーネルをロードする
  • initrdをロードする
カーネル
  • initrdを一時的なルートファイルシステムとしてmountする
  • (一時的なルートファイルシステム上の)/sbin/initを実行する
  • 実際のルートファイルシステムをmountする
  • (実際のルートファイルシステム上の)/sbin/initを実行する
参考
Using the initial RAM disk (initrd)

インストールDVDのディレクトリー構造

ここからが本題である。

まずは、インストールDVDのディレクトリー構造について述べる。

CentOS 7を例として用い、実際のインストールDVDをmountして中身を確認した。

CentOSのプロジェクトページから、CentOS 7のインストールDVDのISOイメージファイルである、CentOS-7-x86_64-DVD-1810.isoをダウンロードした。

ISOイメージは、下記のコマンドでmountできる。(斜線の部分は、環境に応じて適宜変更すること)

# mount -t iso9660 -o loop path/to/image.iso /mnt/iso

下記は、CentOS-7-x86_64-DVD-1810.isoをmountし、treeコマンドでディレクトリー構造を一覧した結果である。
ファイル数が多いので、一部省略して記載している。

/mnt/iso
├── CentOS_BuildTag
├── EFI
├── EULA
├── GPL
├── LiveOS
│   └── squashfs.img
├── Packages
├── RPM-GPG-KEY-CentOS-7
├── RPM-GPG-KEY-CentOS-Testing-7
├── images
├── isolinux
│   ├── boot.cat
│   ├── initrd.img
│   ├── isolinux.bin
│   ├── isolinux.cfg
│   └── vmlinuz
└── repodata

下記の4つは、特に重要なファイルである。

isolinux/isolinux.bin
ブートローダー
isolinux/vmlinuz
カーネル
isolinux/initrd.img
initrd
LiveOS/squashfs.img
実際のルートファイルシステムを格納するイメージ

上述したブートローダー、カーネル、initrdなど、ブートの流れの登場人物となるソフトウェアーの実体が確認できる。
なお、isolinux.binは、ISOLINUXという、CD-ROMからのブートでよく使われるブートローダーである。

squashfs.imgについては、少々説明が必要である。
squashfs.imgは、SquashFSで圧縮されたイメージで、unsquashfsコマンドで解凍できる。
unsquashfsコマンドは、squashfs-toolsパッケージにあるので、使用する場合はsquashfs-toolsをyumでインストールする。

squashfs.imgをunsquashfsで解凍すると、squashfs-rootとして解凍される。
squashfs-rootの構造は下記の通り。

squashfs-root/
└── LiveOS
    └── rootfs.img

rootfs.imgが、上述した「実際のルートファイルシステム」となる。
つまり、initrdの後にrootfs.imgが実際のルートファイルシステムとしてmountされ、このルートファイルシステム環境で、インストールプログラムが実行されることになる。

なお、rootfs.imgは、mount -o loopでmountできる。
下記は、rootfs.imgをmountしたディレクトリーをlsした結果。
インストールプログラムを実行するルートファイルシステム環境なので、普通のLinuxのディレクトリー構造になっている。

bin   dev  firmware  lib64 mnt   proc run   sys  usr
boot  etc  lib      lost+found  modules  root sbin  tmp  var

参考
LiveOS image

インストーラーが起動するまでの流れ

以上を踏まえ、インストールプログラムが起動するまでの流れを下記に示す。
なお、括弧内のファイル名やプログラム名は、CentOS 7のもの。

  1. BIOSによりPCが初期化される
  2. ブートローダー(ISOLINUX, isolinux.bin)が呼び出される
  3. ISOLINUXが、カーネル(vmlinuz)をロードする
  4. ISOLINUXが、initrd(initrd.img)をロードする
  5. initrdが、一時的なルートファイルシステムとしてmountされる
  6. 実際のルートファイルシステム(rootfs.img)がmountされる
  7. インストールプログラム(Anaconda)が実行される

インストールプログラムが実行されると、見慣れたインストール画面が表示されることになる。
なお、カーネルは、DVDからブートする方法の詳細は知らない。initrdに対応し、/sbin/initを実行しているだけである。

参考
Anaconda/Introduction
How does the CentOS installation work from the inside?
A Detailed Look at the InstallRoot Process
Mastering Red Hat Linux 9

ところで、ハードディスクからブートする場合は、MBRをBIOSが最初に読み込む仕様だったが、DVDからブートする場合は、BIOSはどうやってブートローダー(ISOLINUX)を見つけているのだろうか?
これは、CD-ROMからブートするための規格であるEl Toritoに従って、インストールDVDやISOLINUXが作られているからである。
El Toritoでは、BIOS が CD-ROM を読み取ってブート手順を実行できるようにする方法が規定されている。
ブート・レコード・ボリューム (Boot Record Volume)と呼ばれる領域が、BIOS に対して ISO イメージの起動方法を指示し、ブート・カタログ (Booting Catalog) の場所を保持している。
ブート・カタログは、利用可能なブートイメージ(boot images)をリストしている。

参考
El-Torito
ブート可能な IBM Power サーバーの ISO イメージの検出

インストールされるシステムはどこにあるのか

インストールプログラムが起動するまでの流れについては、上述した。
では、インストールプログラムによりインストールされるシステムは、どこにあるのだろうか?
結論としては、インストールされるシステムは、インストールプログラムを実行するために起動されたOSのファイルシステム(rootfs.img)にmountされている。
このことは、インストール中に仮想コンソールで確認できる。

インストールプログラムのGUIが起動したら、下記のキーで仮想コンソールを操作できる。
仮想コンソールでは、インストールプログラムを実行するために起動されたOSのファイルシステムを覗ける。

Ctrl + Alt + F2 → 仮想コンソールに映る
Ctrl + Alt + F6 → GUIに戻る
Macだと、
control +  option + fn + F2 → 仮想コンソールに映る
control +  option + fn + F6 → GUIに戻る

下記は、仮想コンソールでのls結果。

インストールされるファイルシステムは、/mnt/sysimageにmountされている。
確かめたければ、インストールが完了後、再起動する前に、/mnt/sysimage以下にファイルを作成してみればよい。
再起動し、インストールされたOSが起動すると、再起動する前に作成したファイルの存在が確認できるはずである。

インストールDVDは、/run/install/repoにmountされている。
これにより、インストールDVDの中のrpmを、新規にインストールされるOSにコピーするなどが可能。

ちなみに、Kickstartの「インストール後のスクリプト」(%postセクション)は、インストールされるファイルシステムである/mnt/sysimageにchrootした環境で実行される。
これにより、systemctlコマンドが効かないなど、いくつか制限がかかる。
--nochrootオプションにより、chroot環境外、すなわち、インストールプログラムを実行するために起動されたOSのファイルシステムの環境で、コマンドを実行することが可能となる。

参考
Kickstart Installations


以上に述べたように、インストール中には、様々なファイルシステムがmountされることになる。
理解の助けとなるよう、下図に整理した。
インストールDVDは、新しくOSをインストールするためのメディアなので、最も重要なのは、図中の真ん中下の、real root file system (which runs Anaconda) である。
このルートファイルシステム環境でインストールプログラムが実行されるので、インストールDVD中の各ファイル、ソフトウェアーは、このファイルシステムを構築するために協調して動くわけである。






コメント

このブログの人気の投稿

PowerShell 6で、Shift_JISのCSVをImport-Csvで読み込んだら文字化けした

Windowsで、特定のユーザーに特定のサービスの再起動を許可する

PowerShellでイベントログを取得する時、「指定した選択条件に一致するイベントが見つかりませんでした。」が煩わしいのでcatchする