PID Namespace

PID Namespace はプロセスの PID を分離します。コンテナの中で ps コマンドを実行すると PID 1 のプロセスが存在していることが確認できます。
通常 Linux では重複した PID を持つプロセスを生成することはできませんが、Namespace が異なるため同じ PID を持っているかのように見えるプロセスを作ることができます。

unshare(1) では --pid フラグを用いることで PID Namespace を作成できます。

$ sudo unshare --pid --fork bash
root@docker:/home/ubuntu# ps aux
USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root           1  0.0  0.2 167632 11704 ?        Ss   12:47   0:02 /sbin/init
root           2  0.0  0.0      0     0 ?        S    12:47   0:00 [kthreadd]
root           3  0.0  0.0      0     0 ?        I<   12:47   0:00 [rcu_gp]
root           4  0.0  0.0      0     0 ?        I<   12:47   0:00 [rcu_par_gp]

ps コマンドを実行するとホスト側のプロセスも見えていますが、これは ps コマンドが /proc を見るからです。
例えば kill コマンドを送信すると「No such process」というエラーが出るため、PID Namespace の分離自体はできていることが確認できます。

# ホスト側で実行
ubuntu@docker:~$ sleep 100

# Namespace 内で実行
root@docker:/home/ubuntu# ps aux | grep sleep
ubuntu      1545  0.0  0.0   7228   592 pts/1    S+   13:34   0:00 sleep 100
root        1547  0.0  0.0   8160   732 pts/0    S+   13:34   0:00 grep --color=auto sleep
root@docker:/home/ubuntu# kill -9 1545
bash: kill: (1545) - No such process

では ps コマンドでホスト側のプロセスを見えなくするにはどうすればいいでしょうか。
PID Namespace で procfs を再マウントすればよいのですが、それだとホスト側に影響を与えてしまいます。
そこで Mount Namespace も分離することでホスト側に影響を与えずに新しくマウントすることができます。

Mount Namespace については後述するとして、 unshare(1) には --mount-proc オプションがあるため、これを利用します。
これにより Mount Namespace を使って procfs をマウントしてくれます。

ubuntu@docker:~$ sudo unshare --pid --fork --mount-proc bash
root@docker:/home/ubuntu# ps aux
USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root           1  0.0  0.0   8960  3876 pts/0    S    13:42   0:00 bash
root           8  0.0  0.0  10608  3256 pts/0    R+   13:42   0:00 ps aux

冒頭で「同じ PID を持っているかのように見える」と書きましたが、これは Namespace 内から見た話であり、ホスト側から見ると規約通り PID は重複していません。

root@docker:/home/ubuntu# sleep 100 &
[1] 10
root@docker:/home/ubuntu# ps aux
USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root           1  0.0  0.0   8960  3940 pts/0    S    13:42   0:00 bash
root          10  0.0  0.0   7228   592 pts/0    S    13:44   0:00 sleep 100
root          11  0.0  0.0  10608  3364 pts/0    R+   13:44   0:00 ps aux

# ホスト側で確認
ubuntu@docker:~$ ps aux | grep sleep
root        1656  0.0  0.0   7228   592 pts/0    S    13:44   0:00 sleep 100
ubuntu      1659  0.0  0.0   8160   736 pts/1    S+   13:44   0:00 grep --color=auto sleep

results matching ""

    No results matching ""