network namespaces(7) のLinuxマニュアルページには、次のように記載されています。
ネットワーク名前空間は、ネットワークに関連するシステムリソースの分離を提供します:[...]、/ sys/class/netディレクトリ、[...]。
ただし、別のネットワーク名前空間に切り替えるだけでは_/sys/class/net
_の内容は変更されないようです(再現方法については以下を参照してください)。 network名前空間へのsetns()
がすでに十分であると私がここで誤解しているだけですか?現在参加しているネットワーク名前空間に一致する正しい_/sys
_を取得するには、常に_/sys/class/net
_を再マウントする必要がありますか?または、ここで他に何か不足していますか?
* ubuntuシステムを使用して、rtkit-daemonのPIDを見つけ、デーモンのネットワーク名前空間を入力し、そのネットワークインターフェイスを表示して、_/sys/class/net
_を確認します。
_$ PID=`Sudo lsns -t net -n -o PID,COMMAND | grep rtkit-daemon | cut -d ' ' -f 2`
$ Sudo nsenter -t $PID -n
# ip link show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
# ls /sys/class/net
docker0 enp3s0 lo lxcbr0 ...
_
_ip link show
_はlo
のみを正しく表示しますが、_/sys/class/net
_は「ルート」ネットワーク名前空間に表示されるallネットワークインターフェイスを表示します(そして「ルート」マウント名前空間)。
_rtkit-daemon
_の場合も、マウントネームスペースを入力しても違いはありません。_Sudo nsenter -t $PID -n -m
_を入力しても、_ls /sys/class/net
_を使用しても、ネットワークネームスペースにないネットワークインターフェースが表示されます。
Linuxカーネルの舞台裏で実際に何が行われているのかを説明する @ Danila Kiver に対する多くの称賛。 sysfs
while中に再マウントすると、正しいネットワーク名前空間が結合され、correctエントリが表示されます_/sys/class/net
_:
_$ PID=`Sudo lsns -t net -n -o PID,COMMAND | grep rtkit-daemon | cut -d ' ' -f 2`
$ Sudo nsenter -t $PID -n
# MNT=`mktemp -d`
# mount -t sysfs none $MNT
# ls $MNT/class/net/
lo
# umount $MNT
# rmdir $MNT
# exit
_
したがって、これにより_/sys/class/net
_で正しい結果が得られます。
man 5 sysfs
を見てみましょう:
/sys/class/net
Each of the entries in this directory is a symbolic link representing
one of the real or virtual networking devices that are visible in
the network namespace of the process that is accessing the directory.
したがって、このマンページによれば、ls /sys/class/net
の出力はls
プロセスのネットワーク名前空間に依存する必要があります。しかし...実際の動作は、このマンページで説明されているようには見えません。 それがどのように機能するかについての素晴らしいカーネルのドキュメントがあります 。
各sysfs
マウントには 名前空間タグ が関連付けられています。このタグは、sysfsがマウントされたときに設定され、 呼び出しプロセスのネットワーク名前空間に依存 です。各sysfsエントリ(例:/sys/class/net
のエントリ) 名前空間タグがある場合があります 関連付けられています。
Sysfsディレクトリを反復処理すると、カーネルは sysfsマウントの名前空間タグ を取得し、次にエントリを反復処理します 異なる名前空間タグを持つものを除外 。
したがって、/sys/class/net
の反復処理の結果は、現在のプロセスのネットワーク名前空間ではなく、/sys
マウントを開始したプロセスのネットワーク名前空間に依存することがわかります。したがって、常にマウントする必要があります。正しい結果を確認するには、現在のネットワーク名前空間(この名前空間に属する任意のプロセスから)の/sys
。