LinuxマシンのイーサネットおよびWi-Fiインターフェースの命名規則標準


13

LinuxマシンのイーサネットおよびWi-Fiインターフェース命名規則標準は何ですか?

LinuxマシンイーサネットおよびWi-Fiインターフェースとその現在のステータスのみを表示するツールを開発しています。

たとえば、以下は私のLinux(Ubuntu)マシンのネットワークインターフェース(物理および仮想)のリストです。

docker0enp0s25lowlp3s0

ツールを実行すると、次の結果が得られます。

enp0s25wlp3s0

すべてのイーサネットインターフェイスは常に文字で始まりe、Wi-Fiインターフェイスは常に文字で始まるというロジックでコードを記述しましたw

ロジックは正しいですか?そうでない場合、どのようにこれに対処できますか?



iwconfigWiFiインターフェイスを他のインターフェイスからどのようにフィルタリングするかを検討します。
パトリックメヴゼク

1
lshwのようなものを見ない理由はありますか?特にlshw -class network多分の中身を調べますか?それがすべてを探しcapabilities: ethernet physicalますか?おそらく他の機能もいくつか探していますか?
ゾレダチェ

@dirktによって提起されたフレームチャレンジに対処するためのより良い質問は、「Linux(またはmacOS、またはその他)でネットワークインターフェースのタイプを取得するにはどうすればよいですか」ということです。
ロジャーリップスコム

回答:


41

ネットワークインターフェースには任意の名前を付けることができるため、何をしても、(1)パターンと一致しない名前の「物理」ネットワークインターフェースがあるか、(2)パターンに一致する「物理」ネットワークインターフェイス。

それに加えて、もし私があなたのツールのユーザーであるなら、あなたのツールが私が望むものをすることを許さない瞬間に、私は「仮想」であるネットワークインターフェースを持っているので、私の設定では、物理的な」を使用して、私はあなたのアプリで大声で力強く呪いを開始し、二度とそれを使用しません。

物理および仮想ネットワークインターフェイスはすべて共通のAPIを共有しているため、Linuxが非常に柔軟になります。ユーザーをベビーシッターしようとせず、ユーザーから離してください。ユーザーは感謝します。


11
あなたは実際に質問に答えていません。質問の背景コンテキストに挑戦するために3段落を費やしました。フレームチャレンジの回答は重要なものであることは承知していますが、特にuser4556274 質問に対して簡潔な回答をしたため、これはそのようなケースの1つではありません。
マイクOunsworth

18
@MikeOunsworth:問題は、user4556274の答えが一般的なケースでは機能しないことです。インターフェース名が実際に予測可能なインターフェース名である場合にのみ機能します。シンプルなものip link set ... name ...は変更できます。そして、はい、自分で予測可能なインターフェイス名をリストすることもできます。元の質問に対する答えは、「そのようにしないでください」です。どうやってそれを行っても、うまくいかないからです。
-Dirkt

@ fpmurphy1いいえ、彼は予測可能なインターフェース名を意味すると思います。systemd、traditional(ethN)、会社の特定の慣習、または名前を予測可能にするその他の標準であるかどうかは関係ありません
-slebetman

12
@MikeOunsworthは:答えは非常に最初の段落の最初の文の非常に最初のサブ句である:「ネットワークインターフェースは自由に名前を付けることができます[...]」したがって、どのようなOPを約頼んでいることは不可能ですし、おそらく行うことができません。命名規則標準がなく、誰でも自分のインターフェイスに好きな名前を付けることができるため、命名規則標準に基づいてネットワークインターフェイスのタイプを検出することはできません。たとえば、古いLinuxルーターでは、背面に色付きのステッカーが貼られており、物理イーサネットインターフェイスの名前redは、、blueおよびgreenでした。
ヨルグWミッターグ

1
@JörgWMittag、もちろん、標準が使用されていることがわかっている場合は、標準に基づいてそれらを検出できます(最初に名前でその情報をエクスポートするものを期待しています)。私たちは知っているにsystemdは、ネットワークインターフェイスの命名のための標準を持っている、それは1が存在しないと言って何も使用ませんので、。
-ilkkachu

28

systemdの予測可能なインターフェイス名の場合、プレフィックスは次の場所にありますudev-builtin-net_id.c

* Two character prefixes based on the type of interface:
*   en — Ethernet
*   ib — InfiniBand
*   sl — serial line IP (slip)
*   wl — wlan
*   ww — wwan

したがって、従来ethXの命名スタイルと新しいsystemd命名の両方で、頭文字eは自動生成されたインターフェース名のイーサネットインターフェースである必要があります。すべての無線LANインタフェースで始まる必要がありワットで始まらないすべてのインターフェイスが、両方式で、wは無線LANになります。

このツールは、(あなたがコントロール内部の環境上だけではなく)任意の環境で動作するように持っている場合、ユーザーは、[のように任意の名前、とLinuxシステム上のインターフェイスの名前を変更することがありますwan0lan0lan1dmz0初期の手紙についての仮定を中断します] 。


7
そして、私たちの中には頑固なシステム化された廃棄物です。
クリリス

1
このソリューションはbiosdevname、イーサネットインターフェースにのような名前を付けることができるインターフェースの命名に使用するシステムでは機能しないことに注意してくださいp3p7。このメソッドは、新しいシステム化された予測可能な名前の前身であり、現在は一般的なディストリビューションで非推奨になっていますが、数年前にデフォルトであった場合にそれを選択したシステムがまだ多くあります。
TooTea

systemdは、便利に私のイーサネットインターフェイスの1つを「rename3」と呼びます。どっちがいいか、ため息:(
user1908704

1
@ user1908704:通常、これはudevが複数のインターフェースに同じ名前を付けるように指示されたことを意味します。(おそらく、/ etc / udev / rules.dに古い自動生成された「永続的な名前」ファイルがありますか?)とはいえ、v187では名前変更プロセスが完全にアトミック(成功またはロールバック)に修正さrename%uフォーマットは ' tは2012年以降ソースコードに存在していました。あなたのソフトウェアが6年遅れであることにため息をつきたいです。
user1686

1
@grawityこれはUbuntu 18.04です。特定のマザーボードには同じACPIエントリを持つ2つのNICがあり、両方ともeno1になっています。それは起こりえないため、そのうちの1つは「rename3」と呼ばれます。私は誰がレースに勝つかという論理を完全には解明していませんが、どんな変更でもコンテストを混乱させ、他の名前を変更する可能性があります3。
user1908704

9

命名規則では、LANインターフェースの名前eth0eth1、、、 ...であり、WLANインターフェースの名前wlan0は、、、wlan1...です。

表示されるのは、systemdが導入したいわゆる「予測可能な名前」です。実際には、それらは予測可能なものではなく、ハードウェアが変更されたときにも変更される可能性がありますが、これはまさに回避すべき問題です。

推測では、開始文字で十分かもしれません。一部のインターフェイス、特にWLANには、/sys/class/net/*/uevent次のヒントがあります。

DEVTYPE=wlan

残念ながら、DEVTYPELANインターフェイスにはそのようなものはありません。


2
ハードウェアの変更が予測可能なインターフェイス名が回避しようとしている問題ではない場合、デバイス名は変更されます。予測可能なインターフェイス名は、ハードウェアが変更されていない場合の名前の変更を回避します。これは、ハードウェアデバイスがランダムな順序で検出される場合の問題です。
ヨハンMyréen18年

@JohanMyréenそれは間違っています:「...ハードウェアが追加または削除されても、それら(インターフェース名)は固定されたままです」freedesktop.org/wiki/Software/systemd/…–
RalfFriedl

予測可能なインターフェイス名を導入する動機は、プロービングが決定論的ではなく、「名前「eth0」、「eth1」などの割り当てはもはや修正されておらず、1回のブートで「eth0」が次は「eth1」。予測可能な名前がハードウェアの変更に耐えることができる場合、それはボーナスですが、これはそれらの主な理由ではありませんでした。
ヨハンMyréen18年

1
いくつかは負けて勝ちます-いくつかのシナリオでは、変更されたハードウェアが確実に同じ「命名スロット」をクリックする場合は非常に望ましいです:)
rackandboneman

@JohanMyréenMACやその他のプロパティに基づいてインターフェイス名を割り当てるという古いスキームは、新しい名前の手間をかけずに、インターフェイスを追加する際により信頼性がありました。
-RalfFriedl

5

私の答えの1つの警告(他のほとんどにも適用されます):私はあなたのアプリケーションの目的を知りません。特定の問題のトラブルシューティングや、ネットワークの理解を深めるために二度と使用されない使い捨てアプリケーションである場合、インターフェイスの最初の文字に頼ることは、素早いオプションです。次の競合他社をWiresharkまたはtcpdumpに書き込む予定がある場合は、あらゆる種類のエッジケースに対応できるようにする必要があります。

また、作成中のアプリケーションがこれらの極端な範囲のどこかにある場合、ロジックを実装するためにどれだけ慎重に必要かを知ることができるのは、あなた(および顧客)だけです。

他の人たちは、いくつかの理由で名前が決して信頼できるものではないことをすでに指摘しています。究極の問題は、ソフトウェアでは非常に一般的なものです。既知/文書化された事実に依存するのではなく、前提をハードコーディングします。

言及されていない2番目の問題は、要件に関する仮定にも基づいています。リストするインターフェイスのリストは、常に「ハードウェアイーサネットインターフェイス」および「wifiインターフェイス」であるということです。

3番目の問題は、さらに別の仮定です。すべてのインターフェイスが、今考えられるカテゴリに分類されるということです。@ user4556274によると、Infinibandはどうですか?VPNのトンネルインターフェイスはどうですか?ブリッジドインターフェースはどうですか?物理インターフェースと論理インターフェースを組み合わせたブリッジインターフェースはどうですか?

しかし、探していることを達成するためのオプションがあるかもしれません。最初に、リストしたいインターフェースとそうでないインターフェースの特徴を正確に定義します。

ほとんどの場合、信頼できる特性の1つはルーティングテーブルです(ただし、これはインターフェイスが起動している間のみ機能するため、実際に探しているものではない場合があります)。

デフォルトルート(つまり、0.0.0.0へのルート)を持つインターフェースは、おそらく探しているものです。

これはまだより信頼性の高い仮定に基づいていることに注意してください:すべての送信トラフィックを仮想マシンまたはdockerコンテナー(ファイアウォールを実行しているコンテナーがある場合など)を経由するようにシステムを構成することが考えられます)。また、その逆も当てはまります。システム管理者は、デフォルトルートを削除することにより、外部のトラフィックをロックダウンする可能性があります。

別のオプションは、実際のハードウェアを調べて、使用するドライバーを確認することです。その後、特定の既知のドライバーを除外できます


4

結合またはチーム化されたインターフェースを明示的に除外していますか?ここでの私たちのデフォルトでは使用することですbond0か、team0当社のサーバーのための主要なインターフェイスのため。

ロジックを再考する必要があると思います。特定のシステムで定義されているすべてのネットワークインターフェイスを繰り返してみて、イーサネット、wifi、インバンド、シリアルなどに分割してから、魔法をかけてください。


3

ハードコーディングしたり、ハードウェア名にパターンを一致させたりしないでください。これはすべてのデバイスに適用されます。udevが提供するツールを使用して、デバイスのリストを決定し、適切なアクションを実行します。16.7 Persistent Device Namingを参照し、そのドキュメント全体、特に16.2と16.3を読み通してください。現在、udevはLinuxでのデバイス管理に推奨される方法であるため、udevはディストリビューションに依存せず、initシステムにも依存しないことに注意してください。

@ user4556274は、を参照するときの彼の答えでこのことを暗示していることに注意してudev-builtin-net-id.cくださいudev

PredictableNetworkInterfaceNamesの引用:

systemd 197では、さまざまなネーミングポリシーのネイティブサポートをsystemd / udevdに適切に追加し、biosdevnameに似たスキーム(一般的にはより強力で、カーネル内部デバイス識別スキームに近い)をデフォルトにしました。ネットワークインターフェースの次の異なる命名スキームが、udevによってネイティブにサポートされるようになりました。

  1. ファームウェア/ BIOSを組み込んだ名前は、オンボードデバイスのインデックス番号を提供しました(例:eno1)
  2. ファームウェア/ BIOSが組み込まれた名前は、PCI Expressホットプラグスロットインデックス番号を提供します(例:ens1)
  3. ハードウェアのコネクタの物理的/地理的位置を組み込んだ名前(例:enp2s0)
  4. インターフェースのMACアドレスを組み込んだ名前(例:enx78e7d1ea46da)クラシックで予測不可能なカーネル固有のethXネーミング(例:eth0)

デフォルトでは、systemd v197はポリシー1)に従ってインターフェイスに名前を付けます。1)ファームウェアからの情報が適用可能で利用可能な場合、2)にフォールバックします。 5)他のすべての場合。ポリシー4)はデフォルトでは使用されませんが、ユーザーが選択した場合に使用可能です。

この複合ポリシーは、最後の手段としてのみ適用されます。つまり、システムにbiosdevnameがインストールされている場合は、それが優先されます。ユーザーがカーネルデバイスの名前を変更するudevルールを追加した場合、これらも優先されます。また、通常、ディストリビューション固有の命名スキームが優先されます。


2

他の人が言ったように、名前に完全に依存することはできません。

私の場合は思わ無線のためにという/sys/class/net/<ifacename>/ことは無線インタフェースであれば、それに「無線」というディレクトリがあります。

# kbrandt @ kbrandtlx in /sys/class/net [9:47:43] C:130
$ ls
br-b293588ecdae  enp11s0  lo    veth6061cd8  virbr0-nic
docker0          enp12s0  ppp0  virbr0       wlp13s0

# kbrandt @ kbrandtlx in /sys/class/net [9:47:44] 
$ echo  /sys/class/net/*/wireless
/sys/class/net/wlp13s0/wireless
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.