Linuxでネットワークカード(eth1 <-> eth0)の順序を変更する方法


20

システムのインストール後にネットワークインターフェースを交換する方法はありますか(eth1 <-> eth0)。

私の真新しいDebian 6.0のインストールでは、デフォルトでPCIネットワークカードを「eth0」、マザーボード統合ネットワークデバイスを「eth1」として割り当てました。問題は、デフォルト(eth0)ネットワークインターフェイスとして統合デバイスを使用することです。

私はすでに編集しました:

/etc/udev/rules.d/70-persistent-net.rules

名前を入れ替えるとすべてが問題ないように見え、ネットワークは動作していますが、プログラムはまだデフォルトのインターフェースとしてPCIネットワークカード(現在は「eth1」)を使用しようとしています。たとえば、iftopは、スワップの前に「eth0」を使用したため、デフォルトのデバイスとして「eth1」を使用しようとします。

これは、アプリケーションが最初に見つかったデバイスをインターフェイスの命名に関係なくデフォルトのデバイスとして使用しようとしているため、純粋にソフトウェアの問題ですか、またはOSを構成することでこれを修正する方法はありますか?


編集: iflistを印刷する小さなアプリを作成し、PCIデバイス(eth1)が「eth0」の前に表示されました。デバイスの順序を入れ替える方法のアイデア。


編集:私は同じ問題に関するスレッドを見つけ、彼らが示唆したすべてを試しましたが、名前を「仮想的に」交換することを除いて、どのソリューションも機能していません。


ただ注意してください、
etc / udev / rules.d / 70

回答:


18

私は最終的にこの問題の回避策を見つけたので、私は今、自分の質問に答えています。

ドライバーをアンロードしてから正しい順序でロードすることにより、デバイスの順序を変更できることがわかりました。

最初の方法(bruteforce):

したがって、最初に思いついた方法は、init.dスクリプトを使用してドライバーのリロードをブルートフォースするのが簡単でした。

以下のinitスクリプトはDebian 6.0用に調整されていますが、適切なinit.dスクリプトを使用するほぼすべてのディストリビューションで同じ原則が機能するはずです。

#!/bin/sh -e

### BEGIN INIT INFO
# Provides:          reorder-nics
# Required-Start:
# Required-Stop:
# Default-Start:     S
# Default-Stop:
# Short-Description: Reloads the nics in correct order
### END INIT INFO

#
# This script should reload the nic drivers in corrected order.
# Basically it just unloads and then loads the drivers in different order.
#

echo "Reloading NICs!"

# unload the drivers
modprobe -r driver_0        # eth0 nic interface
modprobe -r driver_1        # eth1 nic interface

# load the drivers in corrected order
modprobe driver_1
modprobe driver_0

#EOF

次に、スクリプトを適切なランレベルディレクトリに追加する必要があります。これはDebianで「update-rc.d」コマンドを使用して簡単に実行できます。例えば:update-rc.d reorder-nics start S


2番目の方法(より良いと思う):

また、少なくともエレガントな方法を見つけました(少なくともDebianおよびUbuntuシステムの場合)。

まず、カーネルがNICドライバーを自動的にロードしないことを確認します。これは、でブラックリストファイルを作成することで実行できます/etc/modprobe.d/。「disable-nics.conf」という名前のファイルを作成しました。のファイルに/etc/modprobe.d/.conf接尾辞が必要であることに注意してください。また、モジュールに名前を付け/etc/modprobe.d/blacklist.confても、カーネルによるモジュールの自動ロードには影響しないため、独自のファイルを作成する必要があります。

# Disable automatic loading of kernel driver modules
# Disable NIC drivers

blacklist driver_0     # eth0 by default
blacklist driver_1     # eth1 by default

次に、ルートとして「depmod -ae」を実行します

' update-initramfs -u 'を使用してinitrdを再作成します

最後に、正しい順序でドライバー名を/ etc / modulesファイルに追加します。

# /etc/modules: kernel modules to load at boot time.
#
# This file contains the names of kernel modules that should be loaded
# at boot time, one per line. Lines beginning with "#" are ignored.
# Parameters can be specified after the module name.

# drivers in wanted order
driver_1    # this one should be loaded as eth0
driver_0    # this one should be loaded as eth1

変更は、次回の起動後に有効になります。

ただし、再起動は必要ありません。次のコマンドでデバイスを切り替えるのは簡単です(もちろん、rootとして):

modprobe -r driver_0; modprobe -r driver_1; modprobe driver_1; modprobe driver_0

ソリューションの検索中に見つけた便利なリンク:


2
+1そのためには、間違いなく1つ以上の賛成票に値します。
バハマ

同様の問題があります:統合されたNICがあり、それから時々別のインターフェイスを作成するVPNプログラムを実行します。VPNインターフェースは常に優先されるように見えますが、その理由はわかりません。非常にまれな状況でのみ使用したい(それを使用するアプリケーションでVPNインターフェイスを指定する必要がある)。何か案は?^ _ ^とにかくすぐに新しい質問を投稿するでしょう。
限定

2

あなたは使用することができますnetdev=与えられたインタフェース、例えばに与えられたIRQをリンクするためにカーネルに指示する(あなたはgrubのカーネルにそれを渡す必要が)カーネルコマンドラインパラメータを:netdev=irq=2,name=eth0


1
grubの設定変更でボックスを起動しましたが、まだ取得中です 多くのアプリでデフォルトのデバイスとしてeth1を使用しています。ネットワーク情報のdmesgを確認しましたが、統合NICにはifname:としてまだ「eth1」がありますforcedeth 0000:00:04.0: ifname eth1, PHY OUI 0x57d @ 1, addr 40:40:00:40:40:40。これはそれほど深刻な問題ではありませんが、統合されているのは1 GBのカードであり、デフォルトのデバイスである必要があるため、実際にギアを研磨します。
アタバスカディック

1
現在、nameifを使用してネットワークインターフェイス名を変更しようとしましたが、udevと同じように見えます。「実際の」NIC順序に変更はありません。PCI NICの物理的な場所も変更しようとしましたが、それも助けにはなりませんでした。統合されたNICにはIRQ 22があり、PCI NICにはIRQ 17があるため、カーネルはIRQでそれらを順序付けているように見え、ユーザーはその事実を決して変更できません。新鮮なアイデアはありますか?
アタバスカディック

1

影響を受ける各プログラムの構成ファイルに移動し、「eth1」を「eth0」に変更する必要があるでしょう。このようなプログラムのデフォルトは、インストールされたとき、または現在検出されているNICで最初に実行されたときにセットアップされます。

Linuxをルーターとして使用していますが、スクリプトを使用するとこの問題が発生しました。私は今と呼ばれる素敵なスクリプトフラグメント持ってnetconf、私はNICの名前を使用する必要がある時はいつでも他のスクリプトの中にそのIソースを、このファイルには、私にそれらを指定するための中央の場所を提供します(つまりLAN_IFACE=eth0WAN_IFACE=eth1など)


2
多くのプログラムが<net / if.h>ヘッダーのif_nameindex()関数に依存しているように見えます。彼らは最初に見つけたデバイスを使用するだけで、インターフェース名を完全に無視します。私はそれがそのように行われている理由を見ることができます。名前をソートするよりも最初に見つかったデバイスを使用する方がはるかに簡単です。
アタバスカディック

1

などのアプリケーションでデフォルトで使用されるインターフェースを変更することはできませんiftop。Cライブラリ関数if_nameindexを呼び出し、デフォルトで返された配列の最初の要素を使用します。GNU libcのif_nameindexLinux上のはSIOCGIFCONFioctlの薄いラッパーです。これにより、ネットワークドライバーが初期化された順序と各ドライバーが各デバイスを検出した順序に基づいて、固定された順序でインターフェイスが返されます。

あなたが本当に合格する必要がしたくない場合-iにはiftop、同様のプログラムを、あなたは周りの小さなラッパーを作ることができif_nameindexて、それを並べ替える返されたリストの要素をLD_PRELOAD。私はそれが価値があるよりもはるかに多くのトラブルと呼ぶでしょう。


私は「問題」をif_nameindex機能に特定することもできました。おそらく今のところそのままにしておきます。幸いなことに、いくつかのアプリは実際にインターフェース名をチェックします。一方、一部のアプリにはデフォルトの構成オプションさえないため、-iオプションを使用するだけです。カーネルの読み込みオプションnetdev=irq=22,name=eth0が機能しないのはなぜだろうと思っていましたか?カーネルの起動時にNICの順序を変更することは可能だと思いました。
アタバスカディック

カーネルソース(for_each_netdevマクロ)をざっと見てみると、ドライバーがロードされた順に(おおよそ)インターフェイスが列挙されています。インターフェイスはおそらく異なるドライバーを使用するため、ドライバーを希望の順序でロードするように調整する必要があります。カーネルのアップグレード全体で微調整を機能させたい場合は特に、これは難しいと思われます。
ジル 'SO-悪であるのをやめる'

1

それらが異なるドライバーを持っている場合、少なくともその日は、モジュール構成ファイルのいずれかに入れることができました。

alias eth0 driver1
alias eth1 driver2

それはかなり古い知識ですが、役に立つかもしれません。


-1

「ifrename」パッケージを見てください。これにより、/ etc / iftabファイルで設定されたインターフェイス、ドライバー、割り込みなどのMACアドレスなどのさまざまな情報に基づいて、インターフェイス名を変更できます。

manページからのいくつかの例:

   # This is a comment
   eth2      mac 08:00:09:DE:82:0E
   eth3      driver wavelan interrupt 15 baseaddress 0x390
   eth4      driver pcnet32 businfo 0000:02:05.0
   air*      mac 00:07:0E:* arp 1
   myvpn     SYSFS{address} 00:10:83:* SYSFS{type} 1
   bcm*      SYSFS{device} 0000:03:00.0 SYSFS{device/driver} bcm43xx
   bcm*      SYSFS{..} 0000:03:00.0 SYSFS{../driver} bcm43xx

U&Lへようこそ、単なるヒントではなく、完全な答えを提供できますか?「manページがあります...」のような投稿をしないでください。
アルケマール
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.