LINUXの仕組みをパパッと知りたい!


LPICの試験や実際の仕事でLINUXについて知りたい、知る必要があるというという方はいると思います。
でもいざ調べても「コマンドや単語とか調べてみたけど、結局複雑でわかんないぞ?」となる人もいるのではないでしょうか(私はなりました)。
これはそんな方に向けて、手軽にLINUXの仕組みを知るための記事です!

LINUXの仕組みについて知るためには、ズバリLINUXの起動プロセスについて理解を深めることが効果的だと考えられます。なぜかというと、起動プロセスで関係するシステムはすなわちLINUXを動かしているシステムであり、LINUXを動かしてるということはLINUXの全てということになります。
例えば車の仕組みを知るために車のキーを回してエンジンがどのように起動されるか知ることで、車の動く仕組みについて理解が深まるみたいに、
LINUXのエンジンについて知ることで、LINUXのできることがわかることができるでしょう!

LINUXの位置づけ

まず数あるOSの中でのLINUXの位置づけについて触れますと、LINUXはUNIX系OSと呼ばれる種類のOSになります。LINUXのバージョンはディストリビュートと呼ばれるかたちで分岐しているのですが、このLINUXのカーネル(OSの元になるもの)がオープンソースとして広く公開されて、いろいろな人によってOSの開発がされました。その結果、Debian系とかUbuntu系とか、ファッション系統みたいのようにいろいろな分岐が生まれました。(この系統を
ざっくり分けると無料版と有料版の二つにわけられて、無課金だとCentOS、有料版だとRedHatが有名です)

Linuxの起動プロセス

まずは電源ボタンをつけてからコマンド入力ができるようになるまでの、Linuxの起動プロセスの流れが次の表です。

1. 電源投入
2. ファームウェアの起動
3. ファームウェアがブートローダを読み込む
4. ブートローダがカーネルとファイルシステムイメージ(initramfs)を読み込む
5. ブートローダがカーネルを実行
6. カーネルがファイルシステムイメージ(initramfs)を実行
7. カーネルがinit(またはsystemd)を起動、ルートファイルシステムをマウント
8. カーネルがinit(またはsystemd)を実行

1. 電源投入

電源を入れると端末に刻みこまれたファームウェアが立ち上がってきます。
有名なファームウェアだとBIOS(BootInput/OutputSystem)とUEFI(UnifiedExtendableFarmwareInterface)があり、各ファームウェアによって扱うブートローダの種類が変わってきます。

2. ブートローダの起動

ファームウェアはまずハードディスクの先頭に収められているブートローダを読み込んで、LINUXを立ち上げる準備を始めます。
この時にBIOSだとイメージファイルを生成して展開して、UEFIだと格納されてるEFIファイルを読み込んで起動します。
この時に起動されるのがGRUB2(GRandUnifiedBootloader)と呼ばれるものです。(2とついてるのは、二世代目だからです)

3. カーネルとルートファイルシステムの起動

ブートローダはLINUXのカーネル(vmlinuz)とファイルシステムイメージ(initramfs)を読み込みます。vmlinuzって変わった名前ですけど、頭文字はVirtualMachineのVMで、末尾がzなのは圧縮ファイルとのことでlinuxのxをzに変えたものらしいです。
ブートローダからカーネルの実行とファイルシステムイメージの展開が完了すると、ルートファイルシステムが使用可能になったとみて、
カーネルはユーザープロセスを起動します。

4. ユーザープロセスの起動

諸々の準備が終わったらカーネルは最後にユーザー自身のプロセス(intiまたはsystemd)を呼び出します。この時にランレベルまたはTargetに合わせた起動モードでLinuxを立ち上げます。
立ち上げ終わったら再度にユーザーの元に制御が戻って、Linuxを操作することができます。

細かい語句の説明

ファームウェア:ハード側からLinuxを立ち上げるシステム
ブートローダ:Linuxをたたき起こすやつ
カーネル:Linuxの種
initramfs:ファイルシステムの頂点、トップオブファイルシステム
ユーザープロセス:initとかsystemdで、ユーザーの操作自体
ランレベル:GUIかCGIか緊急モードかがレベル別で分けられてます

関連するファイル

Linuxの起動に関係するブートローダやカーネルの設定値は特定の場所に配置されてます。

◇ブートローダ(GRUB2:GRandUnifiedBootloader2)

 本体ファイル
  BIOS(Basic input/output system)の時はboot.imgとcore.img(※画像ファイルではない)
  ※起動時に生成されます
  UEFI(Unified Extended Firmware Interface)の時は
  /boot/efi/EFI/(端末のバージョン名:例centos等)/配下に
  shim.efiとgrubx64.efiが格納されてます
 設定ファイル
  /boot/grub/grub.cfg(※confではない)
 カーネルパラメータ
  /proc/cmdline
 カーネルの出力するログ
  /var/log/dmesg
 ランレベルの設定ファイル
  /etc/inittab(initの時)
  /etc/systemd/system/defalut.target(systemdの時)

InitとSystemdの違い

詳しくはこちらのサイトが参考になるのですが、大まかにいうとinitを成長させた上位互換のシステムがsystemdです。便利になって、責任感が増してます!
具体的な機能で言うと、init時代は単発でバラバラに管理されていたプロセスがユニット単位で管理されるようになります。
このプロセスがユニット単位で管理されるようになることで、各サービスを安定的に運用できるようになったのです。(起動や停止がしやすくなる)

参考

以下の本を参考に書いてます。プラスアルファで細かに見たい場合は手に取って辞書的な使い方をしてみてもいいと思います☺

Linux教科書 LPIC レベル1 スピードマスター問題集 Version5.0対応