Linux Namespaces (PID/Net/Mount/UTS/IPC/User/Cgroup)(リナックスネームスペース)
Linux カーネルのプロセス分離機構。7種類 (Mount/PID/Network/UTS/IPC/User/Cgroup) で資源を別空間に隔離、コンテナ技術 (Docker/LXC/Podman) の基盤。
概要
Linux Namespaces はLinux カーネルのプロセス分離機構で、特定のプロセスツリーだけを別の「名前空間」(Mount / Network / PID 等) に隔離する仕組み。2002年Linux 2.4.19 でMount namespace 初導入・Linux 3.8 (2013) でUser namespace 完了し計7種類が揃う。cgroups (資源制限) と共にコンテナ技術 (Docker / LXC / Podman / Kubernetes) の二大基盤技術。
7 種類のNamespace
| 種類 | 略 | 隔離対象 | 導入Linux |
|---|---|---|---|
| Mount | mnt | マウントポイント | 2.4.19 (2002) |
| UTS | uts | ホスト名 / ドメイン名 | 2.6.19 (2006) |
| IPC | ipc | SysV IPC / POSIX message queue | 2.6.19 (2006) |
| PID | pid | プロセスID | 2.6.24 (2008) |
| Network | net | ネットワーク (IF / routing / firewall) | 2.6.29 (2009) |
| User | user | ユーザID / グループID | 3.8 (2013) |
| Cgroup | cgroup | cgroup ルートビュー | 4.6 (2016) |
| Time | time | ブート時刻 / monotonic clock | 5.6 (2020) |
主要namespace の効果
Mount namespace
各 namespace で独立した /proc / /sys / /tmp 等のマウントツリーを持つ。Docker コンテナが自前のファイルシステム (overlayfs / volume) を見るのに不可欠。
PID namespace
PID 1 から始まる独立プロセス空間。コンテナ内で ps 実行すると親OS のプロセスは見えず、コンテナ内プロセスのみ。
Network namespace
独立したNIC / IP / Routing Table / iptables / sysctl。Docker bridge / veth pair でコンテナにIP割当、host とは別空間。
User namespace
UID / GID リマッピング・コンテナ内 root (UID 0) が外部では非特権ユーザ。Rootless Docker / Podman の基盤。
unshare コマンド
# 新しい namespace 作成 + コマンド実行
unshare --pid --fork --mount-proc /bin/bash
# → 別の PID namespace に入り、ps が新空間のみ表示
unshare --net --uts /bin/bash
# → 別Network / Hostname 空間
Docker 内部での利用
# Docker run 内部で
docker run -it ubuntu bash
# 内部的に:
# clone(CLONE_NEWPID | CLONE_NEWNET | CLONE_NEWNS | CLONE_NEWIPC | CLONE_NEWUTS | CLONE_NEWUSER, ...)
# → 全namespace 隔離 + cgroup 制限 + overlayfs マウント
/proc/[pid]/ns/
各プロセスの namespace への symlink。bind mount で永続化可能:
ls -l /proc/$$/ns/
# cgroup -> 'cgroup:[4026531835]'
# ipc -> 'ipc:[4026531839]'
# mnt -> 'mnt:[4026531841]'
# net -> 'net:[4026531840]'
# pid -> 'pid:[4026531836]'
# user -> 'user:[4026531837]'
# uts -> 'uts:[4026531838]'
関連用語との違い
- vs chroot: 軽量 (chroot Mount のみ) / 多次元 (Namespaces)
- vs Solaris Zones / FreeBSD jails: 類似コンセプト
- vs cgroups: 隔離 (Namespaces) / 資源制限 (cgroups)
- vs Hypervisor (KVM): プロセス分離 / VM分離
FAQ
Q1: 一般ユーザに影響? A: 直接設定機会少ないが、Docker / Snap / Flatpak / Firejail 等で間接利用。User namespace 経由でrootless 動作可能。
Q2: Rootless Docker? A: User namespace で非rootユーザがUID 0 (コンテナ内 root) になれる仕組み。Podman 標準・Docker 20.10+ オプション。
Q3: Time namespace の用途? A: コンテナ毎に独立した時刻システム (CLOCK_BOOTTIME / CLOCK_MONOTONIC)。チェックポイント / マイグレーションで時刻整合性確保。