web-dev-qa-db-ja.com

ネットワーク名前空間に切り替えても、/ sys / class / netは変更されませんか?

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 に対する多くの称賛。 sysfswhile中に再マウントすると、正しいネットワーク名前空間が結合され、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_で正しい結果が得られます。

4
TheDiveO

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

4
Danila Kiver