最終更新:2016-09-15 (木) 18:44:10 (2772d)
Linux/起動プロセス
Debian
- Debian の起動は、初期 RAM ファイルシステム (initramfs または 初期 RAM ディスク の意で、initrd と呼ばれることもあります。)を含めて 2 段階のプロセスを踏みます。
- まず、ブートローダがカーネルと initramfs をメモリに読み込み、実行制御をカーネルに渡します。
- 基本的な初期化が終了すると、カーネルが initramfs アーカイブを展開し、一時的なルートファイルシステムとしてマウントします。initramfs にはカーネルモジュールと、物理デバイス、または論理デバイスの初期化を必要とするユーザ空間プログラムが含まれています。本物のルートファイルシステムもここに含まれます。
- initramfsのinitスクリプトがモジュールをロードし、その他の初期化処理を行います。
- このステージの最後に、run-initがinitramfsをメモリから消去し、本物のルートファイルシステムをロードします。
- そして本物のルートファイルシステム上のLinux/sbin/initプログラムに制御を渡します。
おおまかな順序
ブートローダ
- カーネルイメージ(vmlinux)とinitrdイメージをメモリ上にロードし実行
vmlinux(init/main.c)
- 圧縮されたカーネルと自己展開ルーチン
- init/main.cのstart_kernel()が呼ばれる
- start_kernel -> rest_init -> kernel_init -> kernel_init_freeable
initramfs/init(initスクリプト)
Linux/sbin/init
順序
BIOS
ブートローダ (GRUB)
- カーネルイメージ(vmlinux)とinitrdイメージをメモリ上にロードし、カーネルを起動する際に initrdのメモリアドレスを渡す。ブートの最終段階で、カーネルはinitrdイメージの先頭数ブロックを読み込み、そのフォーマットを判断する。
- linux vmlinuz - vmlinuz(bzImage形式のLinuxカーネル)をメモリにロード
- initrd initrd.img - initrdイメージをメモリにロード(仮のルートファイルシステムとして起動直後のカーネルで利用される)
- bzImageに処理を渡す
Linuxカーネル (vmlinux) / initramfs
- 圧縮されたカーネルと自己展開ルーチン (zImage/bzImage)
- decompress_kernel?
- 展開後のカーネルのアドレスにジャンプ
- init/main.cのstart_kernel()が呼ばれる
- カーネルパラメータの読み込み
- デバイスドライバの初期化
- initrdイメージ(initramfs形式)を展開し、仮の/としてマウント
- 真のルートファイルシステムのマウント
- initramfsに含まれるinitramfs/init(initスクリプト) を実行
- Linux/sbin/initを呼び出す
initスクリプト
- run-initコマンドで真のルートファイルシステムのLinux/sbin/initを実行
start_kernel
- Linux/initが動作するまでの初期化処理を行う
- ...いろんな初期化処理
- init_IRQ?
- proc_root_init
- reset_init?
rest_init
- initプロセス(PID:1)を起動するためのカーネルスレッドとカーネルスレッドデーモン?(PID:2)を生成し、そのあとはスケジューラ呼び出し
- kernel_thread(kernel_init) - カーネルに組み込まれているモジュールの初期化やルートファイルシステムのマウントを行い、最後にinitを起動
- kernel_thread(kthreadd) - initとkthreadd以外のカーネルスレッドはすべてkthreaddによって生成される
kernel_init
- PCIバスやファイルシステム、ネットワーク、その他のデバイスドライバの初期化やルートファイルシステムの作成
- kernel_init_freeable
- do_basic_setup
- ramdisk_execute_command = "/init";
- load_default_modules
- run_init_process(ramdisk_execute_command) - initramfs/init
- ない場合
- try_to_run_init_process?(Linux/sbin/init)
Linuxのinitの種類
SysVinit
処理
- initの実行(/etc/inittabを読み込み)
- /etc/rc.d/rc.sysinitスクリプト実行
- ランレベルごとの各種サービス(デーモン)の起動
Upstart
- RHEL 6
- Fedora 9?~Fedora 14
- Ubuntu 9.10
systemd
カーネルイメージの形式
参考
- http://www.miraclelinux.com/technet/document/linux/training/1_1_1.html
- http://www.atmarkit.co.jp/flinux/rensai/theory10/theory10a.html
- http://park12.wakwak.com/~eslab/pcmemo/boot/boot5.html