※現職でスキルアップ発表会等で作成していたものをQiitaに書き起こすシリーズ①
Linux起動時のおおまかな流れ
カーネルの読み込み
↓
CPUの初期化、各種ドライバの読み込み
↓
initプロセスの開始
カーネルの読み込み
-
カーネルの読み込みはブートローダを介して行われる
(grub等) -
新しくカーネルを入れ替える場合
- apt-getを使う、Kernel.orgからインストールする等してカーネルソースを取得
- make installすると、/boot下にカーネルイメージファイルが生成される
(このとき、必要でない機能の部分を組み込まずにモジュール化することによってカーネルのスリム化を図れる) - ブートローダにカーネルイメージを登録する
(新しいカーネルが上手く起動されなかった場合に備え、古いカーネルも登録しておくのが常套手段とされる)
具体例(Fedora)
※/boot/ymlinuz-*** がカーネルイメージファイル
/etc/grub2.cfg (同様にFedora)
CPUの初期化、各種ドライバの読み込み
-
起動に必要なドライバは以下のどちらかの手段で置かれている
①カーネルに組み込まれている
②initrdファイルに格納されている -
initrd(Initial RAM Disk)
初期化用の仮想RAMディスクファイル
※前頁の「grub2.cfg」でもカーネルイメージと同時に登録されている
何故わざわざドライバを「カーネル組込み」と「initrd」に分ける必要があったのか?
- Linuxは多機能化によるカーネルイメージの肥大化対策として機能をモジュール化している
- モジュール化の対象には各種ドライバも含まれているが、起動時に必要なドライバは起動時RAMに展開する必要があった
- カーネルが新しいH/Wに対応していなくても、その装置に対応したモジュールをinitrdに用意すれば、そのドライバがRAMディスク上に展開される
initプロセスの開始
-
init
カーネルが一番最初に実行するプログラム
/etc/inittabに従って、ホスト名やIPアドレスのセット、キーボードの設定などを行う。 -
inittab
initがどのスクリプトを呼び出すかが定義されていた
0~6のランレベル毎に初期化スクリプト/etc/rc3.d , /etc/rc5.d等が定義されている。
※現在はsystemdがinittabの代わりを務めている。
ランレベルに相当する概念 **.target により幅広い状態に対応した初期化スクリプトを実現している
/lib/systemd/system/rc-local.service (Fedora)
まとめ
- カーネル立ち上げ時に実行したい処理を挿入、あるいは削除する際はsystemd配下の処理を修正することで実現可能
- とはいえこの情報は2016年の頃のFedoraのものなので今のLinuxで通用するかは…?