Як змінити порядок мережевих карт (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

Потім сценарій повинен бути доданий у відповідний каталог runlevel. Це можна зробити легко на 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 ' як корінь

Відтворіть свій initrd за допомогою " update-initramfs -u "

І нарешті додайте імена драйверів у виправленому порядку до файлу / etc / module .

# /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 Ви напевно заслуговуєте на це більше, ніж лише один голос.
bahamat

У мене є аналогічна проблема: у мене інтегрований NIC, тоді іноді я запускаю програму 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, але це теж не допомогло. Вбудований NIC має IRQ 22, а PCI NIC має IRQ 17, тому схоже, що ядро ​​замовляє їх IRQ, і користувач не може жодним чином змінити цей факт. Якісь свіжі ідеї?
Атабаска Дік

1

Ймовірно, вам доведеться зайти в усі файли конфігурації постраждалих програм і змінити "eth1" на "eth0". Такі програми за замовчуванням встановлюються під час їх встановлення або першого запуску із виявленими в даний час NIC.

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


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

1

Ви не можете змінити, який інтерфейс використовується за замовчуванням у таких програмах iftop. Вони викликають функцію бібліотеки С if_nameindexі використовують за замовчуванням перший елемент у поверненому масиві. GNU libc в if_nameindexLinux - це тонка обгортка навколо SIOCGIFCONFйоктлю . Це повертає інтерфейси у фіксованому порядку, виходячи з порядку, в якому ініціалізовані драйвери мережі, та порядку, у якому кожен драйвер виявляв кожен пристрій.

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


Мені теж вдалося точно визначити "проблему" if_nameindex. Можливо, я просто покину це. На щастя, деякі програми дійсно перевіряють ім'я інтерфейсу. З іншого боку, деякі програми навіть не мають параметрів конфігурації за замовчуванням, тому я просто повинен використовувати -i варіант. Мені було просто цікаво, чому варіант завантаження ядра netdev=irq=22,name=eth0не працює? Я подумав, що можна буде змінити порядок NIC при запуску ядра.
Атабаска Дік

Швидкий огляд джерела ядра ( for_each_netdevмакрос) інтерфейси перераховуються в порядку, в якому завантажуються драйвери (приблизно). У ваших інтерфейсах, ймовірно, використовуються різні драйвери, тому вам доведеться організувати завантаження драйверів у потрібному порядку. Я б очікував, що це буде складно, особливо якщо ви хочете, щоб ваш твіт працював над оновленням ядра.
Жил 'ТАК - перестань бути злим'

1

Якщо вони мають різні драйвери, щонайменше, в той же день, коли ви можете помістити один з файлів конфігурації модуля:

alias eth0 driver1
alias eth1 driver2

Це досить старе знання, але воно може допомогти.


-1

Погляньте на пакет 'ifrename'. Це дозволяє перейменовувати імена інтерфейсів на основі різноманітної інформації, наприклад, MAC-адреси інтерфейсу, драйвера, переривання ..., налаштованої у файлі / etc / iftab.

Деякі приклади зі сторінки man:

   # 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, чи можете ви дати нам повну відповідь, а не прості підказки? Ви не повинні розміщувати повідомлення з чимось на зразок "є сторінка чоловіка ...".
Архемар
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.