新しいネットワーク名前空間を作成するときのデフォルトのカーネルパラメータは何ですか?作成時にこれをオーバーライドする方法はありますか?
私は彼らが親プロセスによって継承されたと思います。共有解除の使用例:
> /sbin/sysctl -a --pattern 'net.ipv4.conf.all.forwarding'
net.ipv4.conf.all.forwarding = 1
> unshare -n
> /sbin/sysctl -a --pattern 'net.ipv4.conf.all.forwarding'
net.ipv4.conf.all.forwarding = 1
答え1
私の考えでは、あなたの推測が正しいと思います。親名前空間から継承されました。これは、プロセスがfork()
システムコールを使用して自分自身を複製し、必要な変更を適用する方法と似ています。レプリケーションを通じて、一般的なシステムコールを使用します。 (現在のプログラムをまったく別のプログラムに置き換えることを含むexec()
. fork()
+をexec()
シェルとして使用して別のプログラムを実行しますが、この魔法は通常ユーザーには見えません。)
デフォルトのシステムコールのオプションはunshare
それを変更しません。したがって、あなたの質問に対する答えは「いいえ」と言いたいと思います。
http://man7.org/linux/man-pages/man2/unshare.2.html
ああ…まったくたとえ話ではありません!オプションフラグを見る:
CLONE_NEWNET
(Linux 2.6.24以降)このフラグはCLONE_NEWNETフラグと同じ効果を持ちます
clone(2)
。呼び出しプロセスが既存のプロセスと共有されていない新しいネットワーク名前空間に移動するように、ネットワーク名前空間の共有を無効にします。 CLONE_NEWNET を使用するには、CAP_SYS_ADMIN 機能が必要です。
clone()
基本的に意味はfork()
。
バージョン2.3.3以降、NPTLスレッドの実装の一部として提供されているglibc fork()ラッパーは、カーネルのfork()システムコールを呼び出すのではなく、同じ効果を提供するフラグを使用してclone(2)を呼び出します。伝統的なシステムコール。 (fork()呼び出しは、SIGCHLDフラグを指定するclone(2)呼び出しと同じです。)