Open9

[TIL] 3. Linux

wakakawakaka

カーネルが起動するまで

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

https://lpi.or.jp/lpic_all/linux/intro/intro05.shtml

wakakawakaka

システムボリュームのMBRはLinux OSのインストール過程で作成される。

  1. OSインストーラが起動
  2. ディスクを初期化し、先頭セクタにMBRを作成
  3. ブートストラップローダとパーティションテーブルをMBR領域にインストール
  4. OSがブートパーティションにインストールされ、/bootにマウントされる

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

wakakawakaka

親プロセスから子プロセスが生成される流れ

Linuxで親プロセスから子プロセスが生成される際には、fork関数execve関数が使用される。
fork関数で親プロセスとは別のメモリ領域を確保し、execve関数でその領域のプロセスを書き換えることで子プロセスが生成される。

  • fork関数:子プロセス用のメモリ領域を確保し、親プロセスのメモリをコピーする
  • execve関数:引数で指定した実行ファイルからプログラムを読み出し、現在のプロセスのメモリ領域を新しいプログラムのプロセスで上書きする

wakakawakaka

デバイスファイルを介してデバイスを操作する

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

wakakawakaka

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

wakakawakaka

パッケージとリポジトリとdnf

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

https://qiita.com/taro-hida/items/1cc86a1c713e835ffb41

wakakawakaka

カーネルパラメータとは

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/ 配下のファイルの設定値が最終的に反映される。

/etc/sysctl.conf
# 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.