LinuxインストールDVDの内部動作 - initrd, isolinux, vmlinuz, Anacondaなど-
普段何気なく使っているインストールDVDだが、裏では initrd、isolinux、vmlinuz、Anaconda など、様々なファイルやソフトウェアーが協調して動作している。
本稿では、LinuxインストールDVDの内部動作を追い、initrd、isolinux、vmlinuz、Anaconda などについて理解を深めることを目的とした。
コンテンツは下記のとおり。
インストーラーは、インストールDVDに含まれる一部のファイルであり、インストールプログラム(installation program)などと呼ばれる。
インストールプログラムは、インストールDVDに含まれるリソースを使いながら、実際のインストール作業を行うプログラムである。
例えば、FedoraやRed Hat系ディストリビューションでは、Anacondaという名前のインストールプログラムが使われている。
インストールプログラムは、インストールという特別な作業を行うことを除けば、普通のプログラムと変わらない。
例えば、Anacondaは、PythonとCで書かれたプログラムである。
よって、実行するにはOSが必要である。
つまり、新しくOSをインストールするために、(既存の)OSを起動(ブート)することになる。
インストールプログラムを実行するためにブートするOSは、起動に必要なリソースとともに、インストールDVDの中に入っている。
まとめると、インストールDVDは下記を含むメディアと言える。
よって、インストールDVDの動作を理解するためには、ブートを理解する必要がある。
我々は普段、ハードディスクからブートすることが多いと思うが、インストールDVDからブートする流れは、ハードディスクとは異なっている。
とは言え、ハードディスクからブートする流れは基本となるので、以下に流れを簡単にまとめる。
マシンの電源を入れると、下記のソフトウェアーが順に呼び出される。
BIOS → ブートローダー → OS(カーネル)
ブートローダーとしては、grub, liloなどが有名である。
ブートローダーは、マスターブートレコード(MBR)に格納されている。
MBRはハードディスク上の特定の場所であり、BIOSが最初に読み込む仕様になっている。
この仕様により、BIOSはブートローダーを見つけることができる。
/sbin/initはシステムの初期化スクリプトを実行していき、ランレベルに応じて指定されたデーモンが起動する。
このあたりは、下記にわかりやすく説明されている。
「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典
Linuxがブートするまで
ここでは、initrdの概要と、initrdを使った場合のブートの流れについて述べる。
後述するが、インストールDVDの中に入っている。
RAMディスクとは、メモリーをストレージとして扱う仕組みである。ディスクドライブをエミュレートするので、OSからはハードディスクなどと同じに見える。デバイスファイルとしては、/dev/initrdとなる。
カーネルが起動すると、カーネルはinitrdの中身を利用する。
カーネルがinitrdの中身を利用する動きは、下記の2段階に大別されるため、two-phase system boot-upと呼ばれている。
なお、/linuxrc という実行可能なファイルが初期ルートファイルシステムに存在すれば、/linuxrc をroot権限で実行する仕様となっている。
このあたりの動きは、下記のドキュメントや、manページ(man initrd)に詳しい。
MakeALiveCD/DVD/BootableFlashFromHarddiskInstall
Anaconda/HowItWorks
上述の「ハードディスクからOSを起動する仕組み」の流れに、initrdのロードや、initrdのmountが追加された形となっている。
BIOS
カーネル
Using the initial RAM disk (initrd)
まずは、インストール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つは、特に重要なファイルである。
上述したブートローダー、カーネル、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のもの。
参考
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に戻る
ちなみに、Kickstartの「インストール後のスクリプト」(%postセクション)は、インストールされるファイルシステムである/mnt/sysimageにchrootした環境で実行される。
これにより、systemctlコマンドが効かないなど、いくつか制限がかかる。
--nochrootオプションにより、chroot環境外、すなわち、インストールプログラムを実行するために起動されたOSのファイルシステムの環境で、コマンドを実行することが可能となる。
参考
Kickstart Installations
以上に述べたように、インストール中には、様々なファイルシステムがmountされることになる。
理解の助けとなるよう、下図に整理した。
インストールDVDは、新しくOSをインストールするためのメディアなので、最も重要なのは、図中の真ん中下の、real root file system (which runs Anaconda) である。
このルートファイルシステム環境でインストールプログラムが実行されるので、インストールDVD中の各ファイル、ソフトウェアーは、このファイルシステムを構築するために協調して動くわけである。
本稿では、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を実行する
ブートローダーは、マスターブートレコード(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と呼ばれている。
- initrdを、初期ルートファイルシステム(一時的なルートファイルシステム)としてmountする
- initrdの中にあるドライバーやモジュールを利用して、実際のルートファイルシステムをmountする
初期ルートファイルシステムは、initial root filesystem、initramfsなどと呼ばれる。
実際のルートファイルシステムは、real root filesystem、actual root file system、true root file systemなどと呼ばれる。
なお、後述するが、実際のルートファイルシステムもインストールDVDに含まれており、インストールDVDにおける実際のルートファイルシステムとは、インストールプログラムを実行する環境となるルートファイルシステムである。
なお、後述するが、実際のルートファイルシステムもインストール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のもの。
- BIOSによりPCが初期化される
- ブートローダー(ISOLINUX, isolinux.bin)が呼び出される
- ISOLINUXが、カーネル(vmlinuz)をロードする
- ISOLINUXが、initrd(initrd.img)をロードする
- initrdが、一時的なルートファイルシステムとしてmountされる
- 実際のルートファイルシステム(rootfs.img)がmountされる
- インストールプログラム(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にコピーするなどが可能。
これにより、systemctlコマンドが効かないなど、いくつか制限がかかる。
--nochrootオプションにより、chroot環境外、すなわち、インストールプログラムを実行するために起動されたOSのファイルシステムの環境で、コマンドを実行することが可能となる。
参考
Kickstart Installations
以上に述べたように、インストール中には、様々なファイルシステムがmountされることになる。
理解の助けとなるよう、下図に整理した。
インストールDVDは、新しくOSをインストールするためのメディアなので、最も重要なのは、図中の真ん中下の、real root file system (which runs Anaconda) である。
このルートファイルシステム環境でインストールプログラムが実行されるので、インストールDVD中の各ファイル、ソフトウェアーは、このファイルシステムを構築するために協調して動くわけである。
コメント
コメントを投稿