こんにちは。
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