Как изменить порядок сетевых карт (eth1 <-> eth0) в Linux

20

Есть ли способ поменять местами сетевые интерфейсы ( eth1 <-> eth0 ) после установки системы.

Мой новый Debian 6.0 установил назначенную сетевую карту PCI как « eth0 », а интегрированное сетевое устройство материнских плат как « eth1 » по умолчанию. Проблема в том, что я хочу использовать встроенное устройство в качестве сетевого интерфейса по умолчанию ( eth0 ).

Я уже редактировал:

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

поменять местами имена и все вроде бы нормально, и сеть работает, но программы все еще пытаются использовать сетевую карту PCI (теперь это « eth1 ») в качестве интерфейса по умолчанию. Например, iftop теперь пытается использовать « eth1 » в качестве устройства по умолчанию, так как он использовал « eth0 » до обмена.

Является ли это чисто программной проблемой, поскольку приложения пытаются использовать первое найденное устройство в качестве устройства по умолчанию, несмотря на именование их интерфейсов, или есть способ исправить это путем настройки ОС?


редактировать: я написал небольшое приложение для распечатки iflist, и устройство PCI ( eth1 ) появилось раньше, чем « eth0 ». Есть идеи как поменять порядок устройства.


редактировать: я нашел тему об этой же проблеме, и я попробовал все, что они предложили, и ни одно из решений не работает, за исключением замены имен «виртуально».

Атабаска Дик
источник
Просто заметьте, что редактирование /etc/udev/rules.d/70-persistent-net.rules и перезагрузка сделали эту работу за меня
Xosofox

Ответы:

18

Я отвечаю на свой вопрос сейчас, потому что я наконец нашел решение этой проблемы.

Я обнаружил, что можно изменить порядок устройств, выгрузив драйверы, а затем загрузив их в правильном порядке.

Первый метод (брутфорс):

Таким образом, первый метод, который я придумал, был простым - перегрузить драйвер с помощью скрипта 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


Второй способ (лучше, я думаю):

Я также нашел более элегантный способ (по крайней мере, для систем 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

Восстановите свое INITRD с « обновлением-initramfs -u »

И, наконец, добавьте имена драйверов в исправленном порядке в файл / 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 Вы определенно заслуживаете больше, чем один голос за это.
Багамат
У меня похожая проблема: у меня есть встроенный сетевой адаптер, затем иногда я запускаю программу VPN, которая создает другой интерфейс. Интерфейс VPN всегда имеет приоритет, но я не знаю почему. Я хочу, чтобы он использовался только в очень редких случаях (я хочу, чтобы приложение, которое его использует, указывало интерфейс VPN). Есть идеи? ^ _ ^ В любом случае, я скоро выложу новый вопрос.
Ограниченное искупление
2

Вы можете использовать параметр netdev=командной строки ядра (вам нужно передать его ядру в grub), чтобы указать ядру связать данный irq с данным интерфейсом, например:netdev=irq=2,name=eth0

Фредерик Дьюердт
источник
1
Я загрузил свой ящик с изменениями конфигурации grub, и я все еще получаю eth1 как устройство по умолчанию во многих приложениях. Я проверил dmesg для сетевой информации и и это говорит о том , что интегрированный сетевой адаптер имеет еще « eth1 » как IFNAME: forcedeth 0000:00:04.0: ifname eth1, PHY OUI 0x57d @ 1, addr 40:40:00:40:40:40. Это не слишком серьезная проблема, но она действительно размалывает мои механизмы, потому что встроенная карта составляет 1 Гб, и это должно быть устройство по умолчанию.
Атабаска Дик
1
Сейчас я попытался использовать nameif для изменения имен сетевых интерфейсов, но похоже, что он делает то же самое, что и udev. Без изменений в «реальном» порядке NIC. Я также пытался изменить физическое местоположение PCI NIC, но это тоже не помогло. Интегрированный сетевой адаптер имеет IRQ 22, а PCI NIC имеет IRQ 17, поэтому похоже, что ядро ​​упорядочивает их по IRQ, и пользователь никак не может изменить этот факт. Есть свежие идеи?
Атабаска Дик
1

Скорее всего, вам придется зайти в файлы конфигурации каждой уязвимой программы и изменить «eth1» на «eth0». Такие программы по умолчанию устанавливаются при установке или первом запуске с обнаруженными в настоящее время сетевыми картами.

Я использую Linux в качестве маршрутизатора, и эта проблема возникла при использовании скриптов. Теперь у меня есть фрагмент хорошего сценария под названием netconfэтого источника я в любом другом сценарии , когда мне нужно использовать NIC имен, этот файл дает мне центральное расположение , чтобы указать их (то есть LAN_IFACE=eth0, WAN_IFACE=eth1и т.д.)

LawrenceC
источник
2
Похоже, что многие программы просто полагаются на функцию if_nameindex () из заголовка <net / if.h> . Они просто используют первое найденное устройство и полностью игнорируют имена интерфейсов. Я понимаю, почему это так, гораздо проще использовать первое найденное устройство, чем сортировать имена.
Атабаска Дик
1

Вы не можете изменить, какой интерфейс используется по умолчанию в таких приложениях, как iftop. Они вызывают функцию библиотеки C if_nameindexи по умолчанию используют первый элемент в возвращенном массиве. GNU libc в if_nameindexLinux - это тонкая оболочка для SIOCGIFCONFioctl . Это возвращает интерфейсы в фиксированном порядке на основе порядка, в котором были инициализированы сетевые драйверы, и порядка, в котором каждый драйвер обнаруживал каждое устройство.

Если вы действительно не хотите переходить -iк iftopаналогичным программам, вы можете создать небольшую оболочку, if_nameindexкоторая переупорядочивает элементы в возвращаемом списке с помощью LD_PRELOAD. Я бы назвал это намного большим количеством проблем, чем оно того стоит.

Жиль "ТАК - перестань быть злым"
источник
Мне удалось точно определить «проблему» в if_nameindexфункции. Возможно, я просто оставлю это сейчас. К счастью, некоторые приложения действительно проверяют имя интерфейса. С другой стороны, некоторые приложения даже не имеют параметров конфигурации по умолчанию, поэтому мне просто нужно использовать параметр -i. Мне просто интересно, почему netdev=irq=22,name=eth0не работает опция загрузки ядра ? Я думал, что можно изменить порядок сетевых карт при запуске ядра.
Атабаска Дик
Если взглянуть на исходный код ядра ( for_each_netdevмакрос), интерфейсы перечислены в порядке загрузки драйверов (примерно). Ваши интерфейсы, вероятно, используют разные драйверы, поэтому вам нужно будет организовать загрузку драйверов в нужном вам порядке. Я ожидаю, что это будет трудно, особенно если вы хотите, чтобы ваш твик работал при обновлении ядра.
Жиль "ТАК - перестань быть злым"
1

Если у них разные драйверы, по крайней мере, в тот день вы могли бы поместить их в один из файлов конфигурации модуля:

alias eth0 driver1
alias eth1 driver2

Это довольно старые знания, но это может помочь.

Аарон Д. Мараско
источник
-1

Посмотрите на пакет ifrename. Это позволяет переименовывать имена интерфейсов на основе различной информации, такой как MAC-адрес интерфейса, драйвер, прерывание ..., настроенной в файле / etc / iftab.

Некоторые примеры из справочной страницы:

   # 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, можете ли вы дать нам полный ответ, а не просто подсказки? Вы не должны публиковать что-то вроде "есть страница руководства ...".
Архемар