PK
パーネルカニック研究所
今日もどこかでkernel panic。
root@pk-lab:~#

Linux学習用おすすめ環境

連載ナビ

この連載は「Linuxを使えるようになる」ではなく、「Linuxがどう動いているのか」を理解するための実践シリーズです。

今回は Linuxを理解する 〜 LFSで学ぶLinux内部構造 〜 の Part 1 / 第5回として、仕組みのつながりを意識しながら学びます。

—

「ローカルVM・Docker・クラウドVM」の3層で使い分ける

Linuxの内部構造を学ぶための環境について、結論を先に示します。1つの環境で全部をこなそうとせず、役割の異なる3つの環境を使い分けるのが最も効率的です。

1. ローカルVM — 壊してもいい主戦場。LFSのビルドはここで行う

2. Dockerコンテナ — 数秒で起動できる比較・調査ツール

3. クラウドVM — 「外部からアクセスされるサーバー」の視点を得る場

選定基準はマシンスペックの高さではなく、「安全に失敗できるか」「疑問が湧いたとき数秒で検証できるか」です。

環境ごとに「得意なこと」がまったく違うから

なぜ3つも必要なのか。それぞれの仕組み上、できること・速さ・視点が異なるからです。

  • ローカルVM(前回構築したUTM環境):

OS全体を丸ごと仮想化しているので、パーティション操作・カーネルのビルドと入れ替え・ブートローダの設定など、システムを根本から触る操作ができます。壊れても複製から戻せるため、LFSの主戦場はここ一択です。弱点は起動に数十秒かかり、複数のディストリビューションを気軽に並べられないこと。

  • Dockerコンテナ:

コンテナはOS全体を起動せず、ホストのカーネルを共有してユーザー空間だけを切り替える仕組みです。だから起動は数秒、使い捨ても一瞬です。「UbuntuとAlpineで設定ファイルの場所はどう違う?」といった比較調査に最適です。逆に、カーネルはホストのものを使うため、カーネルのビルドやブートの学習には使えません。この「VMとの違い」自体が、前回学んだカーネル/ユーザー空間の分離の実例になっています。

  • クラウドVM(AWS、GCP、DigitalOceanなどの最小インスタンス):

ローカル環境では絶対に体験できない、グローバルIPを持ち、インターネットから攻撃も含めてアクセスされるという本番の視点が得られます。SSHの公開鍵設定、ファイアウォール、ポート開放の意味は、実際に外部公開して初めて実感が湧きます。ただし課金には注意が必要です。使い終わったインスタンスの停止・削除を徹底し、SSHは公開鍵認証にする、不要なポートは開けない、といった最低限の防御は必ず行ってください。

Nginxのビルドで3層が連携する場面

3層の使い分けを、実際にありそうなシナリオで見てみます。ローカルVMでNginxをソースからビルドしているとしましょう。

1. [ローカルVM] ./configure を実行すると PCRE library not found というエラーで停止した

2. [Docker] Mac側で docker run --rm -it ubuntu:24.04 bash を実行し、数秒で起動したクリーンなUbuntuの中で apt-cache search pcre を実行。libpcre3-dev のような開発用パッケージ(ヘッダファイル入り)が必要らしい、とあたりをつける。本命のVMを汚さずに調査できた

3. [ローカルVM] 開発用パッケージをインストールして再度 ./configure。ビルドが通り、Nginxが完成した

4. [クラウドVM] ビルドしたNginxを scp でクラウドVMへ転送し、ファイアウォールで80番ポートを開放して起動。手元のブラウザからクラウドVMのIPアドレスにアクセスすると「Welcome to nginx!」が表示された。自分のビルドしたバイナリが、実際のインターネット越しに動いた瞬間です

各層の得意分野(VM=本格作業、Docker=高速調査、クラウド=公開検証)がかみ合うと、1つの環境では行き詰まる問題を多角的に崩せます。

Dockerの手軽さは、実際に触ると一番よく分かります。Mac上で以下を実行してみてください(Docker Desktopが必要です)。


# UbuntuとAlpineを数秒ずつ起動して、中身を見比べる
docker run --rm ubuntu:24.04 cat /etc/os-release
docker run --rm alpine:3.20 cat /etc/os-release

# イメージサイズの差を確認(約10倍違うはず)
docker images ubuntu:24.04 alpine:3.20

完璧な環境より「継続できる」環境を

学習環境は、ローカルVM(主戦場)・Docker(高速調査)・クラウドVM(公開視点)の3層で使い分ける。それぞれ仕組みが違うからこそ、補い合える——これが今回の結論です。

とはいえ、最初から3つ揃える必要はありません。LFSに必須なのはローカルVMだけです。Dockerは疑問が湧いたときに、クラウドVMは公開して試したくなったときに追加すれば十分です。大切なのは、ストレスなく学習を継続できる構成にすることです。

これでPart 1の環境準備は完了です。次回からPart 2に入り、いよいよLinuxの内部構造そのもの——まずはディレクトリ構造の「なぜそこにあるのか」——を見ていきます。

図解テキスト


┌──────────────────┐  ┌──────────────────┐  ┌──────────────────┐
│    ローカルVM    │  │  Dockerコンテナ  │  │   クラウドVM     │
│    (UTMなど)     │  │ (Docker Desktop) │  │  (AWS/GCPなど)   │
├──────────────────┤  ├──────────────────┤  ├──────────────────┤
│ 役割:            │  │ 役割:            │  │ 役割:            │
│  主戦場・実験室  │  │  高速な比較・調査│  │  本番視点・公開  │
├──────────────────┤  ├──────────────────┤  ├──────────────────┤
│ 特徴:            │  │ 特徴:            │  │ 特徴:            │
│  何度でも壊せる  │  │  数秒で起動・破棄│  │  グローバルIP    │
│  カーネルも触れる│  │  カーネルは共有  │  │  課金に注意      │
└────────┬─────────┘  └────────┬─────────┘  └────────┬─────────┘
         │                     │                     │
         └─────────────────────┼─────────────────────┘
                               ▼
                     3層を連携させて使う

この回で実行するコマンド

Docker Desktopが入っていれば、Mac上でそのまま試せます。


docker run --rm ubuntu:24.04 cat /etc/os-release
docker run --rm alpine:3.20 cat /etc/os-release
docker images ubuntu:24.04 alpine:3.20

チェックポイント

  • 3つの環境それぞれの「得意なこと」を1つずつ言える
  • 「コンテナはカーネルをホストと共有する」の意味を説明できる
  • LFSの作業をどの環境で行うか答えられる