ฉันกำลังตอบคำถามของตัวเองตอนนี้เพราะในที่สุดฉันก็พบวิธีแก้ปัญหาสำหรับปัญหานี้
ฉันพบว่าเป็นไปได้ที่จะเรียงลำดับอุปกรณ์ใหม่โดยการยกเลิกการโหลดไดรเวอร์และทำการโหลดตามลำดับที่ถูกต้อง
วิธีแรก (bruteforce):
ดังนั้นวิธีแรกที่ฉันคิดขึ้นนั้นง่ายมากที่จะทำให้คนขับโหลดซ้ำด้วยสคริปต์ 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 / 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
การเปลี่ยนแปลงจะมีผลบังคับใช้หลังจากการบู๊ตครั้งถัดไป
ไม่จำเป็นต้องบูตเครื่องใหม่ มันง่ายที่จะเปลี่ยนอุปกรณ์ด้วยคำสั่งต่อไปนี้ (ในฐานะที่เป็นรูทแน่นอน):
modprobe -r driver_0; modprobe -r driver_1; modprobe driver_1; modprobe driver_0
ลิงค์ที่มีประโยชน์ที่ฉันพบในขณะค้นหาวิธีแก้ปัญหา: