web-dev-qa-db-ja.com

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

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

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

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

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

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

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


edit:iflistを出力する小さなアプリを書いて、PCIデバイス(eth1)が "eth0 "。デバイスの順序を入れ替える方法。


edit:同じ問題について thread が見つかり、提案されたすべてを試しましたが、解決策はどれも機能していません名前を「事実上」交換するため。

20
Athabaska Dick

この問題の回避策をようやく見つけたので、今は自分の質問に答えています。

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

最初の方法(ブルートフォース):

したがって、私が思いついた最初の方法は、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'をrootとして実行します

'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

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

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

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

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

18
Athabaska Dick

netdev=カーネルコマンドラインパラメータ(これをgrubのカーネルに渡す必要があります)は、指定されたirqを指定されたインターフェイスにリンクするようにカーネルに指示します。例:netdev=irq=2,name=eth0

2

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

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

1
LawrenceC

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

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

ドライバーが異なる場合は、少なくともその日にモジュール構成ファイルの1つに入れることができます。

alias eth0 driver1
alias eth1 driver2

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

1