Есть ли способ поменять местами сетевые интерфейсы ( 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 ». Есть идеи как поменять порядок устройства.
редактировать: я нашел тему об этой же проблеме, и я попробовал все, что они предложили, и ни одно из решений не работает, за исключением замены имен «виртуально».
источник
Ответы:
Я отвечаю на свой вопрос сейчас, потому что я наконец нашел решение этой проблемы.
Я обнаружил, что можно изменить порядок устройств, выгрузив драйверы, а затем загрузив их в правильном порядке.
Первый метод (брутфорс):
Таким образом, первый метод, который я придумал, был простым - перегрузить драйвер с помощью скрипта init.d.
Следующий скрипт init предназначен для Debian 6.0, но тот же принцип должен работать практически на любом дистрибутиве, использующем надлежащие скрипты init.d.
Затем скрипт должен быть добавлен в соответствующий каталог уровня запуска. Это легко сделать в 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
не влияет на автозагрузку модулей ядром, поэтому вы должны создать свой собственный файл.Затем запустите depmod -ae от имени пользователя root
Восстановите свое INITRD с « обновлением-initramfs -u »
И, наконец, добавьте имена драйверов в исправленном порядке в файл / etc / modules .
Изменения вступят в силу после следующей загрузки.
Перезагрузка не нужна, хотя; переключать устройства легко с помощью следующей команды (конечно, от имени root):
Некоторые полезные ссылки, которые я нашел во время поиска решения:
источник
Вы можете использовать параметр
netdev=
командной строки ядра (вам нужно передать его ядру в grub), чтобы указать ядру связать данный irq с данным интерфейсом, например:netdev=irq=2,name=eth0
источник
forcedeth 0000:00:04.0: ifname eth1, PHY OUI 0x57d @ 1, addr 40:40:00:40:40:40
. Это не слишком серьезная проблема, но она действительно размалывает мои механизмы, потому что встроенная карта составляет 1 Гб, и это должно быть устройство по умолчанию.Скорее всего, вам придется зайти в файлы конфигурации каждой уязвимой программы и изменить «eth1» на «eth0». Такие программы по умолчанию устанавливаются при установке или первом запуске с обнаруженными в настоящее время сетевыми картами.
Я использую Linux в качестве маршрутизатора, и эта проблема возникла при использовании скриптов. Теперь у меня есть фрагмент хорошего сценария под названием
netconf
этого источника я в любом другом сценарии , когда мне нужно использовать NIC имен, этот файл дает мне центральное расположение , чтобы указать их (то естьLAN_IFACE=eth0
,WAN_IFACE=eth1
и т.д.)источник
Вы не можете изменить, какой интерфейс используется по умолчанию в таких приложениях, как
iftop
. Они вызывают функцию библиотеки Cif_nameindex
и по умолчанию используют первый элемент в возвращенном массиве. GNU libc вif_nameindex
Linux - это тонкая оболочка дляSIOCGIFCONF
ioctl . Это возвращает интерфейсы в фиксированном порядке на основе порядка, в котором были инициализированы сетевые драйверы, и порядка, в котором каждый драйвер обнаруживал каждое устройство.Если вы действительно не хотите переходить
-i
кiftop
аналогичным программам, вы можете создать небольшую оболочку,if_nameindex
которая переупорядочивает элементы в возвращаемом списке с помощьюLD_PRELOAD
. Я бы назвал это намного большим количеством проблем, чем оно того стоит.источник
if_nameindex
функции. Возможно, я просто оставлю это сейчас. К счастью, некоторые приложения действительно проверяют имя интерфейса. С другой стороны, некоторые приложения даже не имеют параметров конфигурации по умолчанию, поэтому мне просто нужно использовать параметр -i. Мне просто интересно, почемуnetdev=irq=22,name=eth0
не работает опция загрузки ядра ? Я думал, что можно изменить порядок сетевых карт при запуске ядра.for_each_netdev
макрос), интерфейсы перечислены в порядке загрузки драйверов (примерно). Ваши интерфейсы, вероятно, используют разные драйверы, поэтому вам нужно будет организовать загрузку драйверов в нужном вам порядке. Я ожидаю, что это будет трудно, особенно если вы хотите, чтобы ваш твик работал при обновлении ядра.Если у них разные драйверы, по крайней мере, в тот день вы могли бы поместить их в один из файлов конфигурации модуля:
Это довольно старые знания, но это может помочь.
источник
Посмотрите на пакет ifrename. Это позволяет переименовывать имена интерфейсов на основе различной информации, такой как MAC-адрес интерфейса, драйвер, прерывание ..., настроенной в файле / etc / iftab.
Некоторые примеры из справочной страницы:
источник