Linuxのマニュアルページネットワークネームスペース(7)説明する:
ネットワーク名前空間は、ネットワーク関連のシステムリソース([...]、/sys/class/netディレクトリ、[...])を分離します。
しかし、単に別のネットワークネームスペースに切り替えても内容が変更されるわけではないようです/sys/class/net
(再現方法の詳細は下記参照)。私はちょうど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
みんな「root」ネットワークネームスペース(および「root」マウントネームスペース)に表示されるネットワークインターフェイス。
マウントネームスペースも入力してもrtkit-daemon
違いはありません。sudo nsenter -t $PID -n -m
これにより、ls /sys/class/net
ネットワーク名前空間に存在しないネットワークインターフェイスが引き続き表示されます。
「固定する」
多くの栄誉@danilakeeferLinuxカーネルの背後で何が起こるか説明してください。再インストールsysfs
しかし、正しいネットワーク名前空間を追加すると、次のようになります。正しいアイテム/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
。
答え1
私たちに見せてください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
マウントには1つあります。名前空間タグと関連付けられる。このラベルは sysfs のインストール中に設定されます。呼び出しプロセスのネットワーク名前空間によって異なります。。各sysfsエントリ(例:のエントリ/sys/class/net
)も名前空間タグがある可能性があります。と関連付けられる。
sysfs ディレクトリに移動すると、カーネルは次のようになります。sysfsマウントネームスペースラベル、項目を繰り返し、異なる名前空間タグを持つアイテムをフィルタリングします。。
したがって、反復結果は、現在のプロセス/sys/class/net
のネットワーク名前空間ではなく、マウントを開始したプロセスのネットワーク名前空間に依存するため、常に現在のネットワーク名前空間(すべてのプロセスに属する)にマウントする必要があります。名前空間を使用して正しい結果を確認してください。/sys
/sys