Я отвечаю на свой вопрос сейчас, потому что я наконец нашел решение этой проблемы.
Я обнаружил, что можно изменить порядок устройств, выгрузив драйверы, а затем загрузив их в правильном порядке.
Первый метод (брутфорс):
Таким образом, первый метод, который я придумал, был простым - перегрузить драйвер с помощью скрипта 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
Затем скрипт должен быть добавлен в соответствующий каталог уровня запуска. Это легко сделать в 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 от имени пользователя root
Восстановите свое INITRD с « обновлением-initramfs -u »
И, наконец, добавьте имена драйверов в исправленном порядке в файл / 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
Изменения вступят в силу после следующей загрузки.
Перезагрузка не нужна, хотя; переключать устройства легко с помощью следующей команды (конечно, от имени root):
modprobe -r driver_0; modprobe -r driver_1; modprobe driver_1; modprobe driver_0
Некоторые полезные ссылки, которые я нашел во время поиска решения: