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.
#!/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
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.
# Disable automatic loading of kernel driver modules
# Disable NIC drivers
blacklist driver_0 # eth0 by default
blacklist driver_1 # eth1 by default
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 .
# /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
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):
modprobe -r driver_0; modprobe -r driver_1; modprobe driver_1; modprobe driver_0
Kilka przydatnych linków, które znalazłem podczas wyszukiwania rozwiązania: