Czy jest jakiś sposób na zamianę interfejsów sieciowych ( eth1 <-> eth0 ) po instalacji systemu?
Mój nowy Debian 6.0 instaluje domyślnie przypisaną kartę sieciową PCI jako „ eth0 ”, a zintegrowane urządzenie sieciowe płyty głównej jako „ eth1 ”. Problem polega na tym, że chcę używać zintegrowanego urządzenia jako domyślnego interfejsu sieciowego ( eth0 ).
Już edytowałem:
/etc/udev/rules.d/70-persistent-net.rules
do zamiany nazw i wszystko wydaje się być w porządku, a sieć działa, ale programy nadal próbują używać karty sieciowej PCI (która jest teraz „ eth1 ”) jako domyślnego interfejsu. Na przykład iftop próbuje teraz użyć „ eth1 ” jako domyślnego urządzenia, ponieważ używał „ eth0 ” przed zamianą.
Czy jest to czysto problem programowy, ponieważ aplikacje próbują użyć pierwszego znalezionego urządzenia jako urządzenia domyślnego pomimo nazw interfejsu lub czy jest jakiś sposób, aby to naprawić, konfigurując system operacyjny?
edycja: Napisałem małą aplikację do wydrukowania iflist, a urządzenie PCI ( eth1 ) pojawiło się przed „ eth0 ”. Wszelkie pomysły, jak zamienić kolejność urządzeń.
edytuj: Znalazłem wątek na ten sam problem i wypróbowałem wszystko, co sugerują, i żadne z rozwiązań nie działa, z wyjątkiem zamiany nazw „wirtualnie”.
źródło
Odpowiedzi:
Odpowiadam teraz na moje pytanie, ponieważ w końcu znalazłem obejście tego problemu.
Dowiedziałem się, że można zmienić kolejność urządzeń, rozładowując sterowniki, a następnie ładując je we właściwej kolejności.
Pierwsza metoda (bruteforce):
Tak więc pierwszą metodą, którą wymyśliłem, była prosta brutalizacja siły przeładowania sterownika za pomocą skryptu init.d.
Poniższy skrypt init jest dostosowany do Debiana 6.0, ale ta sama zasada powinna działać na prawie każdej dystrybucji przy użyciu odpowiednich skryptów init.d.
Następnie skrypt należy dodać do odpowiedniego katalogu poziomu uruchamiania. Można to łatwo zrobić w Debianie za pomocą polecenia „ update-rc.d ”. Na przykład:
update-rc.d reorder-nics start S
Druga metoda (lepiej myślę):
Znalazłem też nieco bardziej elegancki sposób (przynajmniej dla systemów Debian i Ubuntu).
Najpierw upewnij się, że jądro nie ładuje automatycznie sterowników karty sieciowej. Można to zrobić, tworząc plik czarnej listy w
/etc/modprobe.d/
. Utworzyłem plik o nazwie „disable-nics.conf
”. Pamiętaj, że pliki w/etc/modprobe.d/
muszą mieć.conf
sufiks. Nazywanie modułów również/etc/modprobe.d/blacklist.conf
nie wpływa na automatyczne ładowanie modułów przez jądro, więc musisz stworzyć własny plik.Następnie uruchom „ depmod -ae ” jako root
Odtwórz initrd za pomocą ' update-initramfs -u '
I wreszcie dodaj nazwy sterowników w poprawionej kolejności do pliku / etc / modules .
Zmiany powinny wejść w życie po następnym uruchomieniu.
Ponowne uruchomienie nie jest jednak konieczne; łatwo jest przełączać urządzenia za pomocą następującego polecenia (oczywiście jako root):
Kilka przydatnych linków, które znalazłem podczas wyszukiwania rozwiązania:
źródło
Możesz użyć
netdev=
parametru wiersza poleceń jądra (musisz przekazać go do jądra w Grub), aby poinstruować jądro, aby połączyć dane IRQ z danym interfejsem, np .:netdev=irq=2,name=eth0
źródło
forcedeth 0000:00:04.0: ifname eth1, PHY OUI 0x57d @ 1, addr 40:40:00:40:40:40
. To nie jest zbyt poważny problem, ale naprawdę szlifuje mój sprzęt, ponieważ zintegrowana karta ma 1 GB i powinna być domyślnym urządzeniem.Prawdopodobnie będziesz musiał przejść do plików konfiguracyjnych programów, których dotyczy problem, i zmienić „eth1” na „eth0”. Domyślne ustawienia takich programów są konfigurowane podczas instalacji lub pierwszego uruchomienia z aktualnie wykrytymi kartami sieciowymi.
Używam Linuksa jako routera i miałem ten problem podczas używania skryptów. Mam teraz piękny fragment skryptu o nazwie
netconf
że źródło w jakiegokolwiek innego skryptu, gdy trzeba użyć nazwy NIC, plik ten daje mi centralnej lokalizacji, aby je określić (tjLAN_IFACE=eth0
,WAN_IFACE=eth1
itp)źródło
Nie można zmienić interfejsu używanego domyślnie w aplikacjach takich jak
iftop
. Wywołują funkcję biblioteki Cif_nameindex
i domyślnie używają pierwszego elementu w zwróconej tablicy. GNU libc'sif_nameindex
w Linuksie jest cienkim opakowaniem wokółSIOCGIFCONF
ioctl . Zwraca interfejsy w ustalonej kolejności, w oparciu o kolejność, w jakiej sterowniki sieciowe zostały zainicjowane i kolejność, w której każdy sterownik wykrywa każde urządzenie.Jeśli naprawdę nie chcesz przechodzić
-i
doiftop
podobnych programów, możesz utworzyć małe opakowanie,if_nameindex
które zmieni kolejność elementów na liście zwracanej za pomocąLD_PRELOAD
. Nazwałbym to znacznie większym kłopotem niż jest tego warte.źródło
if_nameindex
funkcjonowanie. Być może po prostu zostawię to na razie. Na szczęście niektóre aplikacje naprawdę sprawdzają nazwę interfejsu. Z drugiej strony niektóre aplikacje nawet nie mają domyślnych opcji konfiguracji, więc po prostu muszę użyć opcji -i. Zastanawiałem się, dlaczego opcja ładowania jądranetdev=irq=22,name=eth0
nie działa? Pomyślałem, że powinna być możliwa zmiana kolejności kart sieciowych podczas uruchamiania jądra.for_each_netdev
makro) interfejsy są wyliczane w kolejności, w jakiej sterowniki są ładowane (z grubsza). Twoje interfejsy prawdopodobnie używają różnych sterowników, więc musisz ustawić ładowanie sterowników w żądanej kolejności. Spodziewałbym się, że będzie to trudne, szczególnie jeśli chcesz, aby twoje ulepszenie działało w ramach aktualizacji jądra.Jeśli mają różne sterowniki, przynajmniej w dniu, w którym można umieścić jeden z plików konfiguracyjnych modułu:
To trochę stara wiedza, ale może pomóc.
źródło
Spójrz na pakiet „ifrename”. Umożliwia to zmianę nazw nazw interfejsów na podstawie różnych informacji, takich jak adres MAC interfejsu, sterownik, przerwanie ..., skonfigurowane w pliku / etc / iftab.
Kilka przykładów ze strony man:
źródło