今更Linuxですか?今更Linuxです。
全体的な進度としては超ゆっくりになる予定。
平行で問題演習も行っている感じだとどうしても暗記しなければいけない部分もでてきますが、根本的な理解や体系的な学習によって暗記量は減らせると思います。
さんざん言われていることですが、Linuxの勉強は実際に環境を作ってコマンドを打ち込みながらやることを推奨です。
幸いにも最近では個人でもクラウドサーバを簡単に立てたり、超スペックのPCじゃなくてもホスト上に仮想マシンを構築することができるようになっているので勉強しようと思ったときの敷居は下がっているのではないかと思います。
Linuxをいじれる環境がすぐにない場合は参考まで。
LPICレベル1は特別難しいものではありませんが、全く触ったことがない人からしたらいろんな参考書がこの辺の内容から始まるのは正直結構きついのではないかと思います。
今回は多少Linuxを触ったことがあるぐらいの人(私)も弱いと思われる起動周り。
システムの起動
前提としてLinuxコンピュータが起動する際には以下の順序で処理が行われる。
※但しシステムによって微妙に違いがある模様
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に関しては↓↓こちら読んでるだけでも非常にためになります。
ーーーーーーーーーーーーーーーーー
・次回(第二回)