中級ではカーネル・プロセス・パーミッションの役割分担を見ました。上級では、その 境界の仕組み と、そこから なぜLinuxがコンテナの土台になるのか までを追います。
概要 — まず全体をつかむ
詳細 — 1段階ずつ追う
境界の関所=システムコール
ユーザー空間のアプリは、ハードを直接触れません。ファイルを開く・メモリを増やす・プロセスを作る——これらはすべて システムコール ※1 でカーネルに依頼します。
- アプリが
open()read()fork()のような 依頼 を出す - CPUが カーネルモード ※2 に切り替わり、カーネルが代わりに実行する
- 結果を持って ユーザーモード に戻る
この切り替えには小さなコストがあります。だから、細かい依頼を連発するより まとめて頼む 方が速い、という設計判断が生まれます。境界を「必ず通す」ことが安全の要であり、同時に性能の勘所でもあるのです。
登場人物メモ:
- ※1 システムコール — ユーザー空間からカーネルへ処理を依頼する境界の入口
- ※2 ユーザーモード/カーネルモード — CPUの特権レベル。カーネルだけがハードを操作できる
- ※3 root — すべての権限を持つ管理者。制限を受けない特別な存在
- ※4 namespace/cgroups — 見える範囲を分ける仕組みと・資源の使用量を制限する仕組み
やさしく言うと(中級)
Linuxの世界は、大きく 2つの空間 に分かれています。
- カーネル空間 — ハードウェアを直接管理する中心。CPU・メモリ・ディスクの割り当てはここが仕切る
- ユーザー空間 — アプリやシェル ※1 が動く場所。ハードを使いたいときは、自分で触らず カーネルにお願い する
なぜ分けるのか。アプリが直接ハードを触れると、1つのアプリの暴走が全体を壊しかねません。カーネルという管理役を必ず通す ことで、安全と安定を守っているのです。
アニメーション『ユーザー空間とカーネル空間(境界の関所)』を開く
橋渡し役が シェル ※1。あなたが打ったコマンドを受け取り、カーネルへの依頼に変えて実行してくれる「対話の窓口」です。
登場人物メモ:
- ※1 シェル — コマンドを受け付け、実行してくれる対話の窓口(bash など)
- ※2 プロセス — 実行中のプログラム1つ分。メモリや権限をひとまとまりで持つ
- ※3 ファイルシステム — データを木の形に整理してしまう仕組み
プロセスはどう生まれるか — fork と exec
Linuxのプロセス生成は、2段構えの発想が独特です。
- fork — 今のプロセスを まるごと複製 し、親子2つにする。中身は最初そっくり同じ
- exec — 子プロセスの中身を 別のプログラムに置き換える
- 親は子の終了を待ち受け、後始末をする
「複製してから中身を差し替える」。この単純な2部品の組み合わせだけで、シェルはあらゆるコマンドを起動できます。fork直後はメモリを実際にはコピーせず共有し、書き込む瞬間に初めて複製する(コピーオンライト)ので、複製は見た目ほど重くありません。
やさしく言うと(中級)
Linuxが動くとき、中では2つの考え方が働いています。
- プロセス ※2 — プログラムを起動すると「実行中の1つ分」=プロセスになる。それぞれが独立した箱を持ち、カーネルが順番に走らせる
- すべてをファイルとして扱う — Linuxは、書類だけでなく、機器(キーボードやディスク)まで「ファイル」として同じように扱う思想を持つ
- ディレクトリの木 — ファイルは根(ルート
/)から枝分かれする 1本の木 に整理される。フォルダ(ディレクトリ)の中にフォルダ、という入れ子
「機器もファイル」という割り切りのおかげで、同じ道具(コマンド)で書類も機器も扱えます。これがLinuxの見通しのよさの正体です。
数値パーミッションと最小権限
パーミッションは文字だけでなく 数値 でも表します。r=4 w=2 x=1 を足すだけです。
7= 4+2+1(読む・書く・実行 すべて)5= 4+0+1(読む・実行)755= 所有者7・グループ5・その他5
root ※3 はこの制限をすべて飛び越えられる管理者です。強力ですが、間違えば全体を壊せます。だから普段はrootを使わず、必要な権限だけを持つ のが鉄則(最小権限)。
もう1つの思想が 標準入出力とパイプ です。各コマンドは「入口(標準入力)から受け取り・出口(標準出力)へ流す」よう作られ、|(パイプ)で 出口を次の入口へつなぐ。小さな道具を数珠つなぎにして大きな仕事をする——これがUNIX由来の設計哲学です。
やさしく言うと(中級)
- 役割分担 — カーネルが管理・ユーザー空間が利用。境界を守るから安定する
- 最小限だけ許す — パーミッションは「必要な人に必要な分だけ」。むやみに全許可しない
- プロセスは隔離が基本 — それぞれ独立。1つが落ちても他へ波及しにくい
- 文字で操作できる強み — コマンドは記録・再実行しやすく、自動化に向く
なぜLinuxはコンテナの土台になるのか
ここまでの部品が、そのまま コンテナ の下地になります。
- namespace ※4 — プロセスから 見える範囲(他のプロセス・ネットワーク・ファイルの木)を分ける。同じマシンでも「自分の世界しか見えない」状態を作れる
- cgroups ※4 — CPUやメモリの 使える量を制限 する
つまりコンテナとは、新しいOSを積むのではなく、1つのLinuxカーネルの上で、プロセスを隔離して閉じ込めたもの。VMのようにOSをまるごと積まないから軽い——この身軽さの正体が、Linuxが元々持っていた隔離の下地です。詳しくは姉妹ユニット Docker へ。
⚠️ 深部の落とし穴
- システムコール連発で遅い — 境界越えのコストが積もる。まとめて頼む工夫が要る
- rootの乱用 — 何でもできる分、事故も全体に及ぶ。最小権限を徹底する
- fork爆弾 — 自分を無限に複製し、資源を食いつぶす。cgroupsで上限を設ける
- 隔離の穴 — namespaceの設定を誤ると、コンテナから外が見えてしまうことがある
やさしく言うと(中級)
- 権限エラー(Permission denied) — パーミッションが足りず、読めない・実行できない
- 全許可のやりすぎ — 面倒だからと誰でも書き込み可にすると、改ざんの入り口になる
- プロセスの暴走 — 1つのプロセスがメモリを食いつぶす。カーネルが監視・制限する
- 木の迷子 — ディレクトリの深い階層で、今どこにいるか分からなくなる
理解度チェック
そのまま解けます(成績は保存されません)。無料アカウントを作ると、学習の記録と進捗の山登りが始まります。
問1. システムコールの役割としてもっとも正しいのは?
問2. パーミッションを数値で 755 と書いたとき、正しい意味は?
問3. Linuxのプロセス生成に使う fork と exec の役割分担として正しいのは?
問4. 「普段はrootを使わず、必要な権限だけを持たせる」という原則の呼び方はどれ?
問5. namespace と cgroups の役割分担として正しいのは?
問6. シェルの `|`(パイプ)が行うこととして正しいのは?
問7. r=4・w=2・x=1を足す数値パーミッションで、「読む+実行」だけを許可する1桁の数字を答えてください。
問8. fork直後にメモリを実際にはコピーせず共有し、書き込む瞬間に初めて複製する方式を何と呼ぶか、カタカナで答えてください。