APC 技術ブログ

株式会社エーピーコミュニケーションズの技術ブログです。

株式会社 エーピーコミュニケーションズの技術ブログです。

Linuxの名前空間機能

はじめに

こんにちは、株式会社エーピーコミュニケーションズ クラウド事業部の藤江です。
Linuxコンテナがどのように環境を分離しているのか疑問に思い調べたところ名前空間という機能で実現していることを知りました。 この名前空間に少し興味を持ったので調べた内容について記します。

調査内容

調査に用いた環境

ubuntu24.04 6.8.0-35-generic

検証方法

名前空間にはマウントポイント、ネットワーク等様々な種類があります。
今回はプロセスID名前空間を使って、プロセスの実行環境を分離してみます。

始めに端末からプロセスID名前空間を作成します。
unshareコマンドを実行すると異なる名前空間に所属するbashが起動します。

$ sudo unshare --fork --pid --mount-proc bash

以降に作成する別の名前空間の環境と差を明確にするために簡単な無限ループを実行しておきます。
この状態でプロセスの実行状態を確認してみます。
ホスト環境のプロセスが表示されず、名前空間内のプロセスのみが表示されることが分かります。

# python3 -c "while True: pass" &
# ps auxf
USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root           1  0.0  0.1   7604  4480 pts/0    S    07:39   0:00 bash
root          28 99.9  0.2  17956 10368 pts/0    R    07:56   2:06 python3 -c while True: pass
root          29  0.0  0.1  10884  4480 pts/0    R+   07:59   0:00 ps auxf

次に別の端末から別のプロセスID名前空間を作成します。

$ sudo unshare --fork --pid --mount-proc bash

この環境でもpsコマンドを実行して見るとホスト環境のプロセスと最初に作成した名前空間上のプロセスが表示されません。
つまり、最初に作成した名前空間と後に作成した名前空間でプロセスの管理が分離されていることが分かります。

# ps auxf
USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root           1  0.0  0.1   7604  4352 pts/3    S    07:29   0:00 bash
root          15  0.0  0.1  10884  4480 pts/3    R+   07:59   0:00 ps auxf

最後にホスト環境のプロセス実行状態を確認してみます。
lnnsを実行して名前空間の一覧を表示します。
先ほど作成した名前空間が作成されていることが確認できます。

# lsns
        NS TYPE   NPROCS   PID USER             COMMAND
## 省略
4026532649 mnt         2  2238 root             unshare --fork --pid --mount-proc bash
4026532655 pid         1  2239 root             └─bash
4026532651 mnt         2  2156 root             unshare --fork --pid --mount-proc bash
4026532652 pid         1  2157 root             └─bash

最後にpsコマンドを用いて実行プロセスの状態を見てみると、
先ほど作成した2つの名前空間で実行しているプロセスを確認することが出来ます。

$ ps auxf
USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
## 省略
# 
root        2236  0.0  0.1  16900  7296 pts/1    S+   07:39   0:00  |           \_ sudo unshare --fork --pid --mount-proc bash
root        2237  0.0  0.0  16900  2532 pts/0    Ss   07:39   0:00  |               \_ sudo unshare --fork --pid --mount-proc bash
root        2238  0.0  0.0   5692  1920 pts/0    S    07:39   0:00  |                   \_ unshare --fork --pid --mount-proc bash
root        2239  0.0  0.1   7604  4480 pts/0    S+   07:39   0:00  |                       \_ bash
root        2294 99.9  0.2  17956 10368 pts/0    R    07:56   0:48  |                           \_ python3 -c while True: pass
## 省略
root        2154  0.0  0.1  16732  7040 pts/2    S+   07:29   0:00  |           \_ sudo unshare --fork --pid --mount-proc bash
root        2155  0.0  0.0  16732  2472 pts/3    Ss   07:29   0:00  |               \_ sudo unshare --fork --pid --mount-proc bash
root        2156  0.0  0.0   5692  1920 pts/3    S    07:29   0:00  |                   \_ unshare --fork --pid --mount-proc bash
root        2157  0.0  0.1   7604  4352 pts/3    S+   07:29   0:00  |                       \_ bash

まとめ

Linuxコンテナは名前空間を使って動作環境を分離しています。
プロセスIDだけでなくネットワークやマウントポイント等、様々な機能を名前空間を用いて分離することでコンテナ環境を実現していることが分かりました。

参考