如何在 Linux 上更改网卡的顺序 (eth1 eth0)

如何在 Linux 上更改网卡的顺序 (eth1  eth0)

有没有办法交换网络接口(以太网1<->以太网0)系统安装后。

我全新的 Debian 6.0 安装分配的 PCI 网卡为“以太网0“而主板集成网络设备为”以太网1“默认情况下。问题是我想使用集成设备作为默认值(以太网0)网络接口。

我已经编辑过:

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

交换名称,一切似乎都正常,网络正常工作,但程序仍在尝试使用 PCI 网卡(现在是“以太网1") 作为默认界面。例如伊夫托普现在尝试使用“以太网1“作为它使用的默认设备”以太网0” 交换之前。

这纯粹是一个软件问题,因为应用程序试图使用第一个找到的设备作为默认设备,尽管它们的接口命名,或者有什么方法可以通过配置操作系统来解决这个问题?


编辑:我写了一个小应用程序来打印 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


第二种方法(我认为更好):

我还发现了一种更优雅的方式(至少对于 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

然后运行'德普莫德-ae' 作为根

使用 ' 重新创建你的 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

更改应在下次启动后生效。

不过,无需重新启动;使用以下命令可以轻松切换设备(当然,以 root 用户身份):

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是一个薄包装器SIOCGIFCONF读写控制。根据网络驱动程序初始化的顺序以及每个驱动程序检测每个设备的顺序,以固定顺序返回接口。

如果您确实不想传递-iiftop类似的程序,您可以制作一个小包装器,对if_nameindex返回列表中的元素重新排序,使用LD_PRELOAD。我认为这比它的价值更麻烦。

答案4

如果它们有不同的驱动程序,至少在过去你可以将其放入其中一个模块配置文件中:

alias eth0 driver1
alias eth1 driver2

这是一些相当古老的知识,但可能会有所帮助。

相关内容