MENU

Linux Namespacesとは|コンテナ分離の基盤技術

Linux Namespaces アイキャッチ
Linux Namespaces

Linux Namespaces(ネームスペース)は、Linuxカーネルが提供するプロセスごとの「見える世界」を分離する仕組みです。プロセスID、ネットワーク、マウントポイント、ホスト名、ユーザーID、プロセス間通信などの資源を、グローバルに共有する代わりに名前空間単位で独立させることで、同じカーネル上で動作しながらも互いに干渉しない隔離環境を構築できます。cgroupsと組み合わさることで、現代のコンテナ技術(Docker、containerd、LXC、Podman、Kubernetes)の根幹を成しており、軽量仮想化の中心的役割を果たしています。

目次

この記事の目次

  1. 代表的な3種類のNamespaceとその役割
  2. Namespace作成と利用の基本フロー
  3. Namespacesを扱う際の重要な留意点
  4. Namespacesと従来の仮想化技術の違い
  5. まとめ

代表的な3種類のNamespaceとその役割

代表的な3種類のNamespaceとその役割

Linux Namespacesには複数の種類があり、それぞれ異なる種類のリソースを分離します。PID Namespaceは新しい名前空間内でプロセスID空間を独立させ、その中の最初のプロセスはPID 1として振る舞います。これによりコンテナ内部からは外側のプロセスが見えず、ps コマンドで表示されるプロセス一覧もコンテナ固有のものに限定されます。

Network Namespaceは、ネットワークインターフェース、ルーティングテーブル、iptablesルール、ソケットなどを名前空間ごとに分離します。vethペアやbridge、macvlanを組み合わせることで、各コンテナに独立した仮想ネットワークを与えられるため、ポート競合を気にせず複数アプリケーションを同居させられます。Mount Namespaceは/etc/fstabや任意のmount/umount操作を名前空間内に閉じ込め、コンテナごとに独自のファイルシステムビューを構築可能にします。これらの組み合わせがコンテナ実行の前提条件となっています。

Namespace作成と利用の基本フロー

Namespace作成と利用の基本フロー

新しいNamespaceを作るには、システムコールレベルでは clone(2) に CLONE_NEWPID/CLONE_NEWNET 等のフラグを渡してプロセスを生成するか、すでに動作中のプロセスから unshare(2) を呼び出して切り離します。コマンドラインからは unshare コマンドが便利で、例えば unshare -p -f --mount-proc bash と実行すれば、新しいPID Namespace内でbashを起動し、/proc も新しくマウントし直した状態で動作させられます。

後から既存のNamespaceに参加するには nsenter コマンドを使用します。例えば nsenter -t -n bash で対象プロセスのNetwork Namespaceに入り、そのコンテナ内部のip aやip routeを直接確認できます。これはコンテナのネットワークトラブルシュート時に強力な武器となります。各Namespaceは /proc//ns 配下のシンボリックリンクで識別され、同じターゲットを指していれば同一名前空間であることを意味します。コンテナランタイムは内部的にこれら一連の仕組みを駆使してコンテナを生成しています。

Namespacesを扱う際の重要な留意点

Namespacesを扱う際の重要な留意点

Namespacesを設計に取り入れる際に最初に整理したいのは、何を分離したいかという要件です。プロセス可視性だけ分けたい場合はPIDのみ、ネットワーク疎通を切りたい場合はNetworkのみ、ファイルシステムレイアウトを変えたい場合はMountというように、要件に応じて必要なNamespaceだけを選択して組み合わせます。すべてを安易に分離するとデバッグが困難になることもあるため、目的意識を持って選定することが肝要です。

実運用での落とし穴も多数存在します。PID Namespace内のPID 1は通常のシグナル既定動作を持たず、自身でSIGTERM等を捕捉しないとgracefulに停止しません。コンテナイメージのENTRYPOINTにtini等のミニinitを挟むのはこの問題への対処です。User Namespaceを利用すれば、コンテナ内ではrootとして動作するプロセスを、ホスト上では非rootユーザーにマッピングして権限を縮減できます。Mount Namespaceではpropagation(shared/slave/private)の設定により、ホスト側のマウント変更がコンテナに伝播するかどうかが変わり、設計ミスはセキュリティ事故にも直結するため慎重な検証が必須です。

Namespacesと従来の仮想化技術の違い

Namespacesと従来の仮想化技術の違い

KVMやVMwareに代表される従来型のハイパーバイザー型仮想化は、各仮想マシンに独立したカーネルとデバイスエミュレーションを提供します。これにより異なるOSを同居させたり、極めて強い隔離境界を確保できる反面、メモリやストレージのオーバーヘッドが大きく、起動にも秒〜分単位の時間が必要です。本格的なマルチテナントや異種OS環境では今も主役を担っています。

対してLinux Namespacesは、ホストOSのカーネルを共有しつつ「見える資源」だけを分離するアプローチです。起動はミリ秒オーダーで完了し、メモリ消費もプロセス1個分に毛が生えた程度に収まります。一方でカーネルを共有する以上、カーネル脆弱性の影響はNamespace境界を越え得るため、信頼境界が明確に異なる用途(例:完全に第三者のコードを実行する)にはgVisor、Firecracker、Kata Containersなど追加の隔離機構を組み合わせるのが現代の常套手段となっています。Namespacesは万能ではなく、用途に応じた使い分けが重要です。

まとめ

Linux Namespacesは、cgroupsと並んで現代コンテナ技術の根幹を支えるカーネル機能です。PID、Network、Mount、User、UTS、IPC、Cgroupといった多様な名前空間を組み合わせることで、軽量ながら実用的な分離環境を構築できます。コンテナランタイムが内部で自動利用するため日常的に意識する機会は少ないものの、トラブルシュートやセキュリティ設計の場面では深い理解が大きな武器になります。Linuxエンジニアにとって押さえておくべき基盤知識です。

※本記事はIT用語辞典の手書きドラフトです。公開前に最新情報・出典を確認のうえ加筆修正してください。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

コメント

コメントする

目次