[TIL] 3. Linux

カーネルが起動するまで
- サーバ起動
- マザーボードのフラッシュROM上のプログラムであるBIOSが起動
- ブート順序に従って、優先度が最も高いデバイスを読み込む
- デバイスの先頭セクタであるMBRをメモリにロードし、ブートストラップローダを起動
- ブートフラグの立っているパーティションのPBRをメモリにロードし、IPLを起動
- 後続セクタのブートローダをメモリにロード/起動
- カーネルをメモリにロード/起動

システムボリュームのMBRはLinux OSのインストール過程で作成される。
- OSインストーラが起動
- ディスクを初期化し、先頭セクタにMBRを作成
- ブートストラップローダとパーティションテーブルをMBR領域にインストール
- OSがブートパーティションにインストールされ、/bootにマウントされる
データボリュームにおいては、ディスク初期化時にMBRが作成される。この段階ではMBR以外の領域は未割り当て領域として扱われるため、パーティションテーブルにはまだパーティションの情報は登録されていない。また、データボリュームのMBRにはブートストラップローダはインスト―ルされず、パーティションテーブルとシグネチャのみが格納される。

プログラムが実行されるまで

親プロセスから子プロセスが生成される流れ
Linuxで親プロセスから子プロセスが生成される際には、fork関数とexecve関数が使用される。
fork関数で親プロセスとは別のメモリ領域を確保し、execve関数でその領域のプロセスを書き換えることで子プロセスが生成される。
- fork関数:子プロセス用のメモリ領域を確保し、親プロセスのメモリをコピーする
- execve関数:引数で指定した実行ファイルからプログラムを読み出し、現在のプロセスのメモリ領域を新しいプログラムのプロセスで上書きする

デバイスファイルを介してデバイスを操作する
プロセスが /dev/sda1 や /dev/sdb2 などのデバイスファイルを操作すると、カーネルに存在するデバイスドライバが代わりにデバイスにアクセスする。

VMware環境では、VMware Toolsをインストールすることで準仮想化ドライバをゲストOSのカーネル上に導入する。これらのドライバがゲストOSのカーネル空間で動作することで、仮想化環境におけるパフォーマンスを最適化する。

パッケージとリポジトリとdnf
Linuxではソフトウェアをパッケージ(コンパイル済みのバイナリ+関連するファイル群)という単位で管理する。これらのパッケージは無数に存在するリポジトリに格納されており、適切なパッケージをダウンロード/インストールするためには、まずリポジトリをdnfを始めとするOSのパッケージ管理システムに登録する必要がある。

カーネルパラメータとは
OSの中核であるカーネルの挙動を制御するパラメータである。デフォルト値が定義されてはいるが、チューニングすることでリソースのさらなる有効活用が可能になる。
例)TCPキープアライブに関するカーネルパラメータ
$ sudo sysctl -a | grep keepalive
net.ipv4.tcp_keepalive_time = 7200
net.ipv4.tcp_keepalive_intvl = 75
net.ipv4.tcp_keepalive_proves = 9
設定変更する際には /etc/sysctl.d/ 配下に専用のconfファイルを新規作成して設定を記述していくことが一般的。/etc/sysctl.d/ 配下のconfファイルはメインファイルである /etc/sysctl.conf に書かれた設定をオーバーライドするので、/etc/sysctl.d/ 配下のファイルの設定値が最終的に反映される。
# Vendors settings live in /usr/lib/sysctl.d/.
# To override a whole file, create a new file with the same in
# /etc/sysctl.d/ and put new settings there. To override
# only specific settings, add a file with a lexically later
# name in /etc/sysctl.d/ and put new settings there.

LVMについて