SEワンタンの独学備忘録

IT関連の独学した内容や資格試験に対する取り組みの備忘録

【LPIC101】Linuxのシステム起動の流れ LPICで学ぶLinux①

今更Linuxですか?今更Linuxです。

全体的な進度としては超ゆっくりになる予定。
平行で問題演習も行っている感じだとどうしても暗記しなければいけない部分もでてきますが、根本的な理解や体系的な学習によって暗記量は減らせると思います。


さんざん言われていることですが、Linuxの勉強は実際に環境を作ってコマンドを打ち込みながらやることを推奨です。
幸いにも最近では個人でもクラウドサーバを簡単に立てたり、超スペックのPCじゃなくてもホスト上に仮想マシンを構築することができるようになっているので勉強しようと思ったときの敷居は下がっているのではないかと思います。

Linuxをいじれる環境がすぐにない場合は参考まで。

www.wantanblog.com

www.wantanblog.com

www.wantanblog.com


LPICレベル1は特別難しいものではありませんが、全く触ったことがない人からしたらいろんな参考書がこの辺の内容から始まるのは正直結構きついのではないかと思います。

今回は多少Linuxを触ったことがあるぐらいの人(私)も弱いと思われる起動周り。

システムの起動

前提としてLinuxコンピュータが起動する際には以下の順序で処理が行われる。

f:id:wantanBlog:20200507222138p:plain

※但しシステムによって微妙に違いがある模様

BIOS

BIOSは正式名称Basic Input Output Systemという入出力基本システムのこと。

マザーボードに搭載されたフラッシュROMに書き込まれコンピュータを起動した際に最初に動作する。
HDDなどの最低限のデバイスを認識して起動デバイスの順位を決める。また、キーボードやハードディスクなどのハードウェアレベルでの制御を行う。

MBR(Master Boot Record)からブートローダを読み込み、制御をブートローダに渡す。

近年ではBIOSの後継であるUFFIの普及が進んでいる。

MBR 【 Master Boot Record 】 マスターブートレコード
MBRとは、ハードディスクなどのストレージ(外部記憶装置)の最も先頭にある、起動に必要なプログラムや情報を記録した小さな領域。コンピュータの起動時に最初に読み込まれる。
引用元:MBR(マスターブートレコード)とは - IT用語辞典 e-Words

ブートローダ

LinuxではGRUB(またはGRUB2)が該当する。
MBRは512バイトの容量で以下のような構成となっている。

ブートストラップローダ 446バイト
第1パーティション情報 16バイト
第2パーティション情報 16バイト
第3パーティション情報 16バイト
第4パーティション情報 16バイト
ブートシグニチャ 2バイト

ブートローダがカーネルと初期RAMディスクイメージをメモリにロードし、カーネルに制御を渡す。
パーティション情報にはパーティションの位置情報や起動情報が記録されている。

カーネル

カーネルではメモリの初期化やシステムクロックの設定を行い、メモリ上に展開された初期RAMディスクイメージを使用してルートファイルシステムをマウントする。
これによりハードディスク等のデバイスへアクセスできるようになる。

カーネルから最初のプロセスであるinitプロセスが実行される。

init/systemd

initプロセスは最初に起動されるプロセスで、PIDは1で起動される。
initプロセスは「/etc/inittab」の記述に基づき、自動起動すべきプロセスを立ち上げるなど、アプリレベルの初期化を行う。

最後にログインプロンプトを表示して起動処理を終了する。
詳細は後述します。

SysVinit

現在一般的に使用されているLinuxの起動システムはSysVinitとsystemdが使用されている。
まずは旧来のSysVinitから確認していく。

SysVinitの動作順序

SysVinitでは最初に起動されたプロセスであるinitにより、以下の通り読み進められていく。

1)/etc/inittabを読み込む
2)/etc/rc.sysinitスクリプトを実行する
3)/etc/rcスクリプトを実行する
4)/etc/rcスクリプトで/etc/rc(ランレベル).d ディレクトリ配下のスクリプトを実行する

ランレベルについては次で。

ランレベル

ランレベルという概念はLPICで学ぶまで全くしりませんでした。
ランレベルはSysVinitにて採用されている動作モードのことです。具体的に確認していきます。

ランレベル以下のように定義されています。

ランレベル 内容
0 システム停止
1(s/S) シングルユーザモード
2 マルチユーザモード
3 マルチユーザモード
4 マルチユーザモード
5 マルチユーザモード
6 システム再起動

ディストリビューションによってややブレがあるようなので、試験的には最低限システム停止と再起動及びシングルユーザモードの場合を押さえておけばいいのではないかと思います。

シングルユーザモードはその名の通り一人のユーザ、ルートユーザのみがログインできる動作モードで、通常の運用から考えると少し特殊な状態といえます。

ランレベルの基本コマンドは以下の通りです。

・ランレベルの確認

runlevel

出力例(Nは切り替えていないことを表す)

N 3

切り替えると以下のように変更前のランレベルが表示される。

3 2

・ランレベルの切り替え

ランレベルの切り替えには「init」コマンドまたは「telinit」コマンドを使用します。

init 2
telinit 2

■デフォルトランレベルの設定

デフォルトのランレベルは「/etc/inittab」に記述されています。
設定を変えるには当該ファイルの以下の部分の数字を変更します。

id:3:initdefault:

また、システムを再起動させずに即座に反映させるためには以下のコマンドを実行します。

init q
ランレベルごとのスクリプト

SysVinitの動作順序でも記述した通り、起動時のランレベルによって実行するスクリプトは異なり「/etc」に配置されています。

・ランレベルごとのスクリプト

lrwxrwxrwx.  1 root root     10 May 20 21:47 rc0.d -> rc.d/rc0.d
lrwxrwxrwx.  1 root root     10 May 20 21:47 rc1.d -> rc.d/rc1.d
lrwxrwxrwx.  1 root root     10 May 20 21:47 rc2.d -> rc.d/rc2.d
lrwxrwxrwx.  1 root root     10 May 20 21:47 rc3.d -> rc.d/rc3.d
lrwxrwxrwx.  1 root root     10 May 20 21:47 rc4.d -> rc.d/rc4.d
lrwxrwxrwx.  1 root root     10 May 20 21:47 rc5.d -> rc.d/rc5.d
lrwxrwxrwx.  1 root root     10 May 20 21:47 rc6.d -> rc.d/rc6.d

ディレクトリ内には以下ようなスクリプトファイルが格納されています。

・rc.d/rc3.d内のファイル抜粋

lrwxrwxrwx. 1 root root 16 May 20 21:43 K10psacct -> ../init.d/psacct
lrwxrwxrwx. 1 root root 17 May 20 21:43 S01sysstat -> ../init.d/sysstat

ここで試験的に押さえるべきはスクリプトのファイル名。
先頭のKはkill、Sがstartを表しておりサービスの起動停止を行うファイルであることが分かります。
数字は優先順位を表しており、小さいものが先に実行されます。
そのあとはサービス名でどのファイルがなんのサービスに該当するかまでは覚えなくてもいいのではないかと思っています。

また、/etc/rc(ランレベル).d に存在するのは全てシンボリックリンクであり、実態は「/etc/init.d/」に存在するという点です。
そのためランレベルごとの設定をいじりたい場合には、基本的にはシンボリックリンクを削除と作成によって設定します。

参考:Linux起動の仕組みを理解しよう[rcスクリプト編]:Windowsユーザーに教えるLinuxの常識(最終回) - @IT

systemd

私にとってはこちらの方が一般的でした。
まぁLinuxを使用することはあっても起動の仕組みを気にしたことはありませんでしたが。

systemdの基本

systemdにおいては、initプロセスの代わりにsystemdプロセスが起動して各種サービスを管理する。
systemdは次のようなプロセスになっている。

root         1  0.0  0.8  54396  5104 ?        Ss   Jun03   0:35 /usr/lib/systemd/systemd --system --deserialize 16

また、systemdをはじめとしたデーモンにより各種サービスが管理される。

プロセス 説明
systemd メインプロセス
systemd-journald ジャーナル管理プロセス
systemd-logind ログイン処理管理プロセス
systemd-networkd ネットワーク管理プロセス
systemd-timesyncd システムクロック管理プロセス
systemd-resolved 名前解決プロセス
systemd-udevd デバイス検知プロセス

■Unit
systemdで扱う処理はUnitという単位で管理します。Unitには各機能ごとに拡張子が割り当てられており、拡張子を見ることでどういった機能のためのUnitかが判別できるようになっています。

Unitの種類 説明
service 各種サービスを起動
device 各種デバイス
mount ファイルシステムをマウントする
swap スワップ領域を有効化する
target 複数のUnitをグループ化する
timer 指定した日時や間隔で処理を実行する

後述しますが/lib/systemd/systemに格納されています。

・例

systemd-logind.service

このUnitよりsystemdではサービスの起動が並列で行われるためSysVinitと比較したとき起動時間の短縮になっています。

systemdの起動順序

システム起動時には「/etc/systemd/system/default.target」が最初に実行されます。

[wantan@nestedvm-centos7 system]$ ls -l default.target
lrwxrwxrwx. 1 root root 37 May 20 21:45 default.target -> /lib/systemd/system/multi-user.target

実態は「/lib/systemd/system/」に格納されており、デフォルトの起動モードを変えるには「/lib/systemd/system/」から任意のターゲットのシンボリックリンクを作成しなおします。

SysVinitのランレベルとは以下のように対応しています。

ランレベル ターゲット
0 poweroff.target
1 rescue.target
2,3,4 multi-user.target
5 graphical.target
6 reboot.target

/etc/systemd/system/にはランレベルに対応したシンボリックリンクも用意されています。

lrwxrwxrwx. 1 root root   15 May 20 21:47 runlevel0.target -> poweroff.target
lrwxrwxrwx. 1 root root   13 May 20 21:47 runlevel1.target -> rescue.target
lrwxrwxrwx. 1 root root   17 May 20 21:47 runlevel2.target -> multi-user.target
lrwxrwxrwx. 1 root root   17 May 20 21:47 runlevel3.target -> multi-user.target
lrwxrwxrwx. 1 root root   17 May 20 21:47 runlevel4.target -> multi-user.target
lrwxrwxrwx. 1 root root   16 May 20 21:47 runlevel5.target -> graphical.target
lrwxrwxrwx. 1 root root   13 May 20 21:47 runlevel6.target -> reboot.target


気になることがあったら適用に追記していく予定。
Linuxに関しては↓↓こちら読んでるだけでも非常にためになります。

参考:LinuCイージス:LinuC Web教科書

ーーーーーーーーーーーーーーーーー

・次回(第二回)

www.wantanblog.com