LoginSignup
4
4

More than 3 years have passed since last update.

unshareコマンドで、Namespaceを作成してみる

Last updated at Posted at 2021-03-03

こんにちは。

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を実行すると、bashpsのみが表示され、プロセス空間が分離されていることがわかります。

# 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
4
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
4