Sto rispondendo alla mia domanda ora perché ho finalmente trovato una soluzione per questo problema.
Ho scoperto che è possibile riordinare i dispositivi scaricando i driver e caricandoli nell'ordine corretto.
Primo metodo (bruteforce):
Quindi il primo metodo che ho ideato è stato semplice per forzare il ricaricamento del driver con lo script init.d.
Il seguente script di init è personalizzato per Debian 6.0, ma lo stesso principio dovrebbe funzionare su quasi tutte le distribuzioni che usano script init.d corretti.
#!/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
Quindi lo script deve essere aggiunto alla directory runlevel corretta. Questo può essere fatto facilmente su Debian con il comando " update-rc.d ". Per esempio:update-rc.d reorder-nics start S
Secondo metodo (meglio penso):
Ho anche trovato un modo un po 'più elegante (almeno per i sistemi Debian e Ubuntu).
Innanzitutto assicurarsi che il kernel non carichi automaticamente i driver della scheda NIC. Questo può essere fatto creando un file nella lista nera in /etc/modprobe.d/
. Ho creato un file chiamato " disable-nics.conf
". Si noti che i file in /etc/modprobe.d/
devono avere il .conf
suffisso. Anche la denominazione dei moduli /etc/modprobe.d/blacklist.conf
non influisce sul caricamento automatico dei moduli da parte del kernel, quindi è necessario creare il proprio file.
# Disable automatic loading of kernel driver modules
# Disable NIC drivers
blacklist driver_0 # eth0 by default
blacklist driver_1 # eth1 by default
Quindi esegui ' depmod -ae ' come root
Ricrea il tuo initrd con ' update-initramfs -u '
E infine aggiungi i nomi dei driver nell'ordine corretto nel file / 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
Le modifiche dovrebbero entrare in vigore dopo il prossimo avvio.
Il riavvio non è necessario però; è facile cambiare i dispositivi con il seguente comando (come root, ovviamente):
modprobe -r driver_0; modprobe -r driver_1; modprobe driver_1; modprobe driver_0
Alcuni link utili che ho trovato durante la ricerca della soluzione: