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

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

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

私の新しいDebian 6.0のインストールでは、イーサネット0「そしてマザーボード統合ネットワークデバイスは」イーサネット1「基本的に、問題は統合デバイスを基本として使用したいということです(イーサネット0)ネットワークインターフェース。

私が編集した内容:

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

名前を変更すると、すべてが大丈夫だと思われ、ネットワークは機能しますが、プログラムはまだPCIネットワークカードを使用しようとしています(現在は「イーサネット1") をデフォルトインターフェイスとして使用します。たとえば、iftop今「」を試してみてください。イーサネット1「基本機器として使用」イーサネット0「交換前。

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


編集する:私はiflistとPCIデバイスを印刷するための小さなアプリケーションを書いています(イーサネット1)以前に登場しました。」イーサネット0デバイスの順序を変更する方法のアイデア。


編集する:私が一つ見つけたワイヤー同じ問題について彼らが提案したすべてを試しましたが、「ダミー」交換名を除いて、どのソリューションも機能しませんでした。

答え1

ついにこの問題に対する解決策を見つけたので、今私の質問に答えています。

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

最初の方法(無差別代入クラッキング):

だから私が思いついた最初の方法は、単に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の「」を使って簡単に行うことができます。更新-rc.dコマンドです。たとえば、次のようになります。update-rc.d reorder-nics start S


2番目の方法(私の意見ではより良い):

私は(少なくともDebianとUbuntuシステムでは)もっとエレガントな方法を見つけました。

まず、カーネルがネットワークカードドライバを自動的にロードしないことを確認してください。これは、以下からブラックリストファイルを生成することによって実行できます。/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

次に ' を実行します。デフモード'ルート

' を使用して initrd を再生成します。アップデート-initramfs -u'

最後に、ドライバ名を正しい順序で追加します。/etc/モジュール文書。

# /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

ソリューションの検索中にいくつかの便利なリンクが見つかりました。

答え2

netdev=カーネルコマンドライン引数(grubのカーネルに渡す必要がある)を使用して、指定されたirqを特定のインタフェースに接続するようにカーネルに指示できます。たとえば、次のようになります。netdev=irq=2,name=eth0

答え3

iftopから呼び出されるCライブラリ関数は変更できません。if_nameindexそして基本的に配列の最初の要素を返します。if_nameindexLinuxのGNU libcは薄いラッパーです。SIOCGIFCONFI/W制御。インターフェイスは、ネットワークドライバが初期化される順序と、各ドライバが各デバイスを検出する順序に基づいて固定順序で返されます。

同様のプログラム-iに渡したくない場合は、次のようにして返されたリストの要素を並べ替える小さなラッパーを作成できます。iftopif_nameindexLD_PRELOAD。私の考えでは、これが価値あるよりも大きな問題だと思います。

答え4

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

alias eth0 driver1
alias eth1 driver2

これはかなり古い知識ですが、役に立ちます。

関連情報