UNSHARE

Section: User Commands (1)
Updated: February 2016
Index Return to Main Contents
 

名前

unshare - プログラムを親プロセスと同じ名前空間を共有せずに実行する。  

書式

unshare [options] [program [arguments]]  

説明

指定された名前空間を親プロセスと共有させず、指定した program を実行する。 program が指定されない場合、``${SHELL}'' (デフォルトは: /bin/sh) が実行される。

オプションとして /proc/pid/ns/type ファイルを ファイルシステムに bind マウントして、 nsenter(1) で名前空間に入れることで、program が終了した後でも、名前空間を永続化できる (PID 名前空間は例外であり、init プロセスをずっと動作させる必要がある)。 一度永続化した名前空間が必要なくなった場合、 umount(8) で永続化を解除できる。 より詳細は、のセクションを参照すること。

共有しない名前空間はオプションで指定できる。 共有しない名前空間は以下の通り:

マウント名前空間
ファイルシステムのマウントとアンマウントが、他のファイルシステムに 影響しない。 ただし、明示的に共有 (shared) とマークされているファイルシステムは除く (共有は mount --make-shared で行われる。 /proc/self/mountinfo または findmnt -o+PROPAGATIONshared フラグを参照すること)。 より詳細は、 mount_namespaces(7) と clone(2) の CLONE_NEWNS フラグの議論を参照すること。

unshare は util-linux バージョン 2.27 以降で、新たなマウント名前空間で伝搬 (propagation) を 自動的に private にして、新しい名前空間を共有しないようにする。 この機能はオプション --propagation unchanged で無効化できる。 private はカーネルのデフォルトである点に注意すること。

UTS 名前空間
ホスト名またはドメイン名の設定が、システムの他の部分に影響しない。 より詳細は、 namespaces(7) と clone(2) の CLONE_NEWUTS の議論を参照すること。
IPC 名前空間
POSIX メッセージキューと、System V メッセージキュー、 セマフォセット、共有メモリセグメントについて、プロセスは独立した 名前空間を持つ。 より詳細は、 namespaces(7) と clone(2) の CLONE_NEWIPC フラグの議論を参照すること。
ネットワーク名前空間
プロセスが独立した IPv4 と IPv6 スタック、IP ルーティングテーブル、 ファイアウォールルール、 /proc:/net/sys:/class:/net のディレクトリツリー、ソケットなどを持つ。 より詳細は、 namespaces(7) と clone(2) の CLONE_NEWNET フラグの議論を参照すること。
PID 名前空間
親プロセスとは別に、子プロセスがプロセスマッピングをするための PID セットを持つ。 より詳細は、 pid_namespaces(7) と clone(2) の CLONE_NEWPID フラグを参照すること。
コントロールグループ (cgroup) 名前空間
プロセスが /proc:/self:/cgroup の仮想化されたビューを持ち、 新しい cgroup マウントで名前空間の cgroup ルートがルートにされる。 より詳細は、 cgroup_namespaces(7) と clone(2) の CLONE_NEWCGROUP フラグの議論を参照すること。
ユーザー名前空間
プロセスが個別の UID、GID、ケーパビリティ (capabilities) のセットを持つ。 より詳細は、 user_namespaces(7) と clone(2) の CLONE_NEWUSER フラグの議論を参照すること。
 

オプション

-i, --ipc[=file]
IPC 名前空間を共有しない。 file が指定された場合、永続化された名前空間が bind マウントにより作成される。
-m, --mount[=file]
マウント名前空間を共有しない。 file が指定された場合、永続化された名前空間が bind マウントにより作成される。 file は伝搬フラグを private に設定したファイルシステムに 置かれる必要がある点に注意すること。 現在の設定が分からない場合は、コマンド findmnt -o+PROPAGATION を使うこと。 以下の例も参照すること。
-n, --net[=file]
ネットワーク名前空間を共有しない。 file が指定された場合、永続化された名前空間が bind マウントにより作成される。
-p, --pid[=file]
PID 名前空間を共有しない。 file が指定された場合、永続化された名前空間が bind マウントにより作成される。 --fork--mount-proc オプションも参照すること。
-u, --uts[=file]
UTS 名前空間を共有しない。 file が指定された場合、永続化された名前空間が bind マウントにより作成される。
-U, --user[=file]
ユーザー名前空間を共有しない。 file が指定された場合、永続化された名前空間が bind マウントにより作成される。
-C, --cgroup[=file]
cgroup 名前空間を共有しない。 file が指定された場合、永続化された名前空間が bind マウントにより作成される。
-f, --fork
指定された program を、直接実行するのではなく、 unshare の子プロセスとして fork する。 これは新しい PID 名前空間を作成する際に役立つ。
--kill-child[=signame]
unshare が終了する時に、fork した子プロセスに signame を送る。 --pid と組み合わせることにより、unshare 以下のプロセスツリー全体を、 簡単に確実に kill することができる。 signame が指定されない場合、デフォルトは SIGKILL である。 このオプションは --fork を暗黙のうちに指定する。
--mount-proc[=mountpoint]
プログラムを実行する直前に、proc ファイルシステムを mountpoint (デフォルトは /proc) にマウントする。 これは新しい PID 名前空間を作成するのに役立つ。 これは暗黙のうちに新しいマウント名前空間を作成する。 そうしなければ、/proc マウントはシステム上の既存のプログラムの実行に失敗する。 新しい proc システムは、(MS_PRIVATE|MS_REC で) 明示的に private としてマウントされる。
-r, --map-root-user
現在の実効 (effective) ユーザー ID とグループ ID を、 新しく作られた名前空間のスーパーユーザーの UID と GID にマッピングした後で、 プログラムを実行する。 これにより、非特権で実行されている場合でも、 新しく作られた名前空間のいろいろな側面を管理するのに必要な ケーパビリティ (capabilities) を簡単に取得できる (これには、ネットワーク名前空間でのインタフェースの設定や、 マウント名前空間でのファイルシステムのマウントなどがある)。 これは単なる便利機能に過ぎず、複数の範囲の UID と GID をマッピングするといった、 より洗練された使い方はサポートしていない。 このオプションは、--setgroups=deny を暗黙のうちに指定する。
--propagation private|shared|slave|unchanged
新しいマウント名前空間のマウント伝搬フラグを再帰的に設定する。 デフォルトでは伝搬を private に設定する。 この機能は引き数 unchanged で無効化できる。 このオプションは、マウント名前空間 (--mount) が指定されない場合、 黙って無視される。
--setgroups allow|deny
ユーザー名前空間で setgroups(2) システムコールを許可または拒否する。

setgroups(2) を呼び出すには、呼び出しプロセスは少なくとも CAP_SETGID 権限を持たなければならない。 しかし、Linux 3.19 以降ではさらに厳しい制限が適用される: GID マップ (/proc/pid/gid_map) が設定された後でのみ、 カーネルは、 setgroups(2) の呼び出しを許可する。 (allow, デフォルトで) setgroups(2) が有効化されると、GID マップは root による書き込みが可能なる。 (deny で) setgroups(2) が永続的に無効化されると、GID マップは非特権プロセスによる書き込みが可能になる。

-R,--root=dir
ルートディレクトリを dir に設定し、コマンドを実行する。
-w,--wd=dir
ワーキングディレクトリを dir に変更する。
-S,--setuid uid
名前空間全体で使われるユーザー ID を設定する。
-G,--setgid gid
名前空間全体で使われるグループ ID を設定し、補助 (supplementary) グループを削除する。
-V, --version
バージョン情報を表示して、終了する。
-h, --help
ヘルプを表示して、終了する。
 

注意

ユーザー名前空間で root として proc と sysfs ファイルシステムをマウントすることは 制限されなければならない。 これにより、特権のあるユーザーが見えなくした機微なファイルを、 特権の少ないユーザーがアクセスできないようにできる。 端的にいうと、proc と sysfs は可能な限り閉じて bind マウントしなければならない。  

# unshare --fork --pid --mount-proc readlink /proc/self
1
PID 名前空間を作成し、新しくマウントされた procfs インスタンスで PID 1 であることを保証する。
$ unshare --map-root-user --user sh -c whoami
root
ユーザー名前空間を作成し、その名前空間で非特権ユーザーを root ユーザーとする。
# touch /root/uts-ns
# unshare --uts=/root/uts-ns hostname FOO # nsenter --uts=/root/uts-ns hostname FOO # umount /root/uts-ns
永続的な UTS 名前空間を作成し、ホスト名を変更する。 そして、nsenter で名前空間に入る。 名前空間は bind 参照をアンマウントすることで破棄される。
# mount --bind /root/namespaces /root/namespaces
# mount --make-private /root/namespaces # touch /root/namespaces/mnt # unshare --mount=/root/namespaces/mnt
bind マウント /root/namespaces/mnt で参照される 永続的なマウント名前空間を作成する。 この例は汎用性の高いやり方を示しており、 bind マウントが共有ファイルシステム上に作成される。
# unshare -pf --kill-child -- bash -c (sleep 999 &) && sleep 1000 &
# pid=$! # kill $pid
program のサブプロセスを確実に kill する。 unshare が kill されると、それ以下のプロセスも kill される。 そうしないと、program の子プロセスは孤立して (orphaned)、PID 1 が親にされる。

 

関連項目

clone(2), unshare(2), namespaces(7), mount(8)  

著者

Mikhail Gusarov
Karel Zak  

入手方法

unshare コマンドは util-linux パッケージの一部であり、 https://www.kernel.org/pub/linux/utils/util-linux/ から入手できる。


 

Index

名前
書式
説明
オプション
注意
関連項目
著者
入手方法

This document was created by man2html, using the manual pages.
Time: 15:56:16 GMT, April 14, 2020