Skip to content

Instantly share code, notes, and snippets.

@261shimizu
Last active May 9, 2018 02:40
Show Gist options
  • Save 261shimizu/a0628499435427d4052970c6c923bf4a to your computer and use it in GitHub Desktop.
Save 261shimizu/a0628499435427d4052970c6c923bf4a to your computer and use it in GitHub Desktop.
LPIC勉強

Linuxブート時の流れ

LPIC Level2の勉強がてら自分用備忘録

流れ


起動

BIOSがMBR(マスタブートレコード)からブートローダ(GRUB等)読み込み

ブートローダがOS読み込み

カーネルがinitプロセス起動

initプロセスが各種サービス起動

BIOS


電源投入後、マザーボード上のROMにあるBIOSを読み込む
(電源投入後、0xfffffff0:Reset Vector番地=BIOSの住所から実行を開始するらしい)
BIOSはハードウェアの検出と初期化を行う=POST(PowerOnSelfTest)
その後BIOSは、ブートローダを探索する。

  • MBRの構成
  • ブートローダ(446B)
  • パーティションテーブル(64B)
  • Boot Signature(2B)

ディスク先頭セクタの末尾2バイトが、BootSignature(0x55 0xaa)であるかどうかによって、
ブートローダを検知し、そのセクタの内容を0x7c00番地にロードして実行を移すらしい。

ブートローダ


ブートローダは、OSをディスクからメモリに読み込み、起動するが、
ブートローダはMBRの容量の制限のため、段階的なプログラムになっており、以下の順で実行される。
※以下、GRUBの場合

ステージ1:ステージ2またはステージ1を実行する。
ステージ1.5:ディスク上のファイルシステムの解釈(MBRと最初のパーティションの間に存在するらしい。ファイルシステムを解釈しなければならないので、ファイルシステムごとにステージ1.5が存在する。ls -alh /boot/grub | grep stag1_5 するとわかるらしい)
ステージ2:GRUBの本体。ファイルシステムが既に解釈できるようになっているので、普通にファイルとして存在する。

ステージ2は、menu.lstを読み込み、OS一覧を表示する。
ユーザがOSを一つ選ぶと、そのOSのvmlinuz-○○(カーネルイメージ)及び、initramfs-○○.img(初期RAMディスクイメージ)をメモリに読み込む。
カーネルの先頭アドレスにジャンプして実行する。

カーネル


ブートローダから起動されたカーネルは、低レベルの初期化処理を実行し、カーネルの本体を自己解凍してメモリに読み込む。
カーネル本体の先頭アドレスにジャンプし、様々な初期化処理を実行。

その後、初期RAMディスクを展開して仮のルートファイルシステムとしてマウント。
初期RAMディスクは、正規のルートファイルシステムが存在するディスクをマウントするためのドライバや各種ユーティリティが含まれる。
(カーネルモジュールをインストールするためのinsmod等がある模様)

  • 初期RAMディスクとループバックマウント
    • まず、RAMディスクとは、メモリ上にファイルシステムを作成する機能の事。
    • 初期RAMディスクとは、正規のルートファイルシステムが使用できるようになる前にマウントされる食器ルートファイルシステム。実際のファイルシステムを使用可能にするためのモジュールのロードと、実際のルートファイルシステムの取得はこれによって行う事ができる。
    • 初期RAMディスクは、上記の内容を実行するためのディレクトリと実行可能ファイル(カーネルモジュールをインストールするためのinsmod等)が含まれる。デバイスドライバの話が出てくるのはこのため。デバイスドライバはカーネルモジュールとして存在することが多い。
    • 初期RAMディスクイメージは、実体はメモリ上に配置された情報であるが、これをあたかもファイルシステムの様に扱える様にするためのもの。
    • 初期RAMディスクイメージとカーネルイメージをブートローダがメモリ上へロードし、カーネルへ制御が渡されると初期RAMディスクイメージをファイルシステムとしてマウントする。この、ファイルをファイルシステムとしてマウントする機能を、ループバックマウントと言う。
    • 初期RAMディスクの形式として、initrdとinitramfsが存在(mkinitrd イメージ バージョン、mkinitramfs -o イメージ バージョンで作成。中身はlsinitrdやlsinitramfsで見れる。)
システム起動時に仮の環境としてまずメモリ上にファイルシステムを展開し、  
そこでカーネルを動作させてから本来のファイルシステムをルートにマウントし直す、といった段階的なブートを実現する機能。  
高度な機能を使うにはまずカーネルを動作させなければならないので、  
仮の環境でまずカーネルを動かして、それから本来の環境をブートさせようという発想

init


(SysVinitの場合)

  1. /etc/inittab読み込み
  2. /etc/rc.sysinitスクリプト読み込み
  3. /etc/rcスクリプト実行
  4. /etc/rcスクリプトが/etc/rcランレベル.d/ディレクトリ以下のスクリプトを実行。

/etc/inittabでは、initdefault(=起動ランレベル)の指定や、
/etc/rc.sysinitスクリプトの読み込み(2.)、/etc/rcスクリプトの実行、
mingettyの起動などを行っている。

/etc/rc.sysinitは、hostnameやnetwork、mount、selinuxの設定等を行っている模様。

/etc/rcスクリプトは、/etc/rcランレベル.d/ディレクトリ以下のスクリプトを実行する。

/etc/rcランレベル.d/ディレクトリは、以下の例のように、K=停止、S=起動サービスが列挙されている。

[vagrant@localhost ~]$ ls -l /etc/rc3.d/
total 0
lrwxrwxrwx. 1 root root 19 Mar 29  2016 K10saslauthd -> ../init.d/saslauthd*
lrwxrwxrwx. 1 root root 13 Mar 29  2016 K60nfs -> ../init.d/nfs*
lrwxrwxrwx. 1 root root 20 Mar 29  2016 K69rpcsvcgssd -> ../init.d/rpcsvcgssd*
lrwxrwxrwx. 1 root root 21 Mar 29  2016 K87restorecond -> ../init.d/restorecond*
lrwxrwxrwx. 1 root root 20 Mar 29  2016 K89netconsole -> ../init.d/netconsole*
lrwxrwxrwx. 1 root root 15 Mar 29  2016 K89rdisc -> ../init.d/rdisc*
lrwxrwxrwx. 1 root root 22 Mar 29  2016 S02lvm2-monitor -> ../init.d/lvm2-monitor*
lrwxrwxrwx. 1 root root 19 Mar 29  2016 S08ip6tables -> ../init.d/ip6tables*
lrwxrwxrwx. 1 root root 18 Mar 29  2016 S08iptables -> ../init.d/iptables*
lrwxrwxrwx. 1 root root 17 Mar 29  2016 S10network -> ../init.d/network*
lrwxrwxrwx. 1 root root 16 Mar 29  2016 S11auditd -> ../init.d/auditd*
lrwxrwxrwx. 1 root root 17 Mar 29  2016 S12rsyslog -> ../init.d/rsyslog*
lrwxrwxrwx. 1 root root 17 Mar 29  2016 S13rpcbind -> ../init.d/rpcbind*
lrwxrwxrwx. 1 root root 17 Mar 29  2016 S14nfslock -> ../init.d/nfslock*
lrwxrwxrwx. 1 root root 19 Mar 29  2016 S15mdmonitor -> ../init.d/mdmonitor*
lrwxrwxrwx. 1 root root 17 Mar 29  2016 S19rpcgssd -> ../init.d/rpcgssd*
lrwxrwxrwx. 1 root root 26 Mar 29  2016 S25blk-availability -> ../init.d/blk-availability*
lrwxrwxrwx. 1 root root 15 Mar 29  2016 S25netfs -> ../init.d/netfs*
lrwxrwxrwx. 1 root root 19 Mar 29  2016 S26udev-post -> ../init.d/udev-post*
lrwxrwxrwx. 1 root root 17 Mar 29  2016 S30vboxadd -> ../init.d/vboxadd*
lrwxrwxrwx. 1 root root 21 Mar 29  2016 S30vboxadd-x11 -> ../init.d/vboxadd-x11*
lrwxrwxrwx. 1 root root 25 Mar 29  2016 S35vboxadd-service -> ../init.d/vboxadd-service*
lrwxrwxrwx. 1 root root 15 Mar 29  2016 S50kdump -> ../init.d/kdump*
lrwxrwxrwx. 1 root root 14 Mar 29  2016 S55sshd -> ../init.d/sshd*
lrwxrwxrwx. 1 root root 17 Mar 29  2016 S80postfix -> ../init.d/postfix*
lrwxrwxrwx. 1 root root 15 Mar 29  2016 S90crond -> ../init.d/crond*
lrwxrwxrwx. 1 root root 11 Mar 29  2016 S99local -> ../rc.local*
[vagrant@localhost ~]$
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment