こんにちは。
Dockerの仕組みを学習して、__コンテナはNamespaceなどのLinuxの機能で出来ている__事が判明し、Namespaceを自分で作成できることがわかったので試してみました。
今回は__プロセス__の分離と、__ホスト名__の分離を行いました。
$ unshare コマンドでNamespaceを作成してみる
筆者はCentOS7環境で行っています。
プロセスの分離(PID, Mount)
まず$ps ax
で通常のNamespaceのプロセスを表示します。
たくさん表示されます。
$ ps ax
PID TTY STAT TIME COMMAND
1 ? Ss 0:01 /usr/lib/systemd/systemd --switched-root --system --d
2 ? S 0:00 [kthreadd]
3 ? S 0:00 [kworker/0:0]
4 ? S< 0:00 [kworker/0:0H]
5 ? S 0:00 [kworker/u4:0]
~~~
2195 pts/0 R+ 0:00 ps ax
Namespaceを作成するために以下のコマンドを実行します。
$ sudo unshare --pid --mount-proc --fork /bin/bash
-
--pid
は、PID Namespaceを分離します。 -
--mount-proc
は、/proc
ディレクトリをマウントする設定で、これを指定しないと__親のpid名前空間__の情報を出力してしまいます。
/proc
ディレクトリは、システムの状態などが保管されている特殊なディレクトリで、これらはメモリ上に保存される__仮想ファイル__と呼ばれるものです。 -
--fork
は指定されたプログラムを直接実行するのではなく、unshare
の子プロセスとしてフォークします。
PID Namespaceを作成する際は、これらがセットで用いられるのが一般的のようです。
新たなNamespaceで$ps ax
を実行すると、bash
とps
のみが表示され、__プロセス空間が分離__されていることがわかります。
# ps ax
PID TTY STAT TIME COMMAND
1 pts/0 S 0:00 /bin/bash
14 pts/0 R+ 0:00 ps ax
確認ができたので、$exit
で元の名前空間に戻ります。
# exit
exit
ホスト名の分離(UTS)
今度はホスト名の分離をします。
ホスト名は__UTS Namespace__で管理されています。
$hostname
で現在のホスト名を確認します。
$ hostname
localhost.localdomain
以下のコマンドでUTS Namespace
を分離します。
$ sudo unshare -u /bin/bash
-
-u
はUTS Namespaceを分離します。
以下のコマンドで__ホスト名__をnewhost
に変更します。
# hostname newhost
再度$hostname
を実行し、ホスト名が__変更された__ことを確認します。
# hostname
newhost
$exit
で__元のNamespace__に戻ります。
# exit
exit
最後にもう一度$hostname
を実行し、__元のNamespace__では__ホスト名が変更されていない__事が確認できます。
$ hostname
localhost.localdomain