วิธีการเปลี่ยนลำดับของการ์ดเครือข่าย (eth1 <-> eth0) บน linux


20

มีวิธีใดที่จะสลับอินเตอร์เฟสเครือข่าย ( eth1 <-> eth0 ) หลังจากการติดตั้งระบบ

การติดตั้ง Debian 6.0 ใหม่ของฉันได้รับมอบหมายการ์ดเครือข่าย PCI เป็น " eth0 " และอุปกรณ์เครือข่ายรวมของเมนบอร์ดเป็น " eth1 " โดยค่าเริ่มต้น ปัญหาคือฉันต้องการใช้อุปกรณ์รวมเป็นอินเตอร์เฟสเครือข่ายเริ่มต้น ( eth0 )

ฉันแก้ไขแล้ว:

/etc/udev/rules.d/70-persistent-net.rules

เพื่อสลับชื่อและทุกอย่างดูเหมือนจะโอเคและเครือข่ายใช้งานได้ แต่โปรแกรมยังคงพยายามใช้การ์ดเครือข่าย PCI (ซึ่งตอนนี้ " eth1 ") เป็นอินเทอร์เฟซเริ่มต้น ตัวอย่างเช่นiftopพยายามใช้ " eth1 " เป็นอุปกรณ์เริ่มต้นเนื่องจากใช้ " eth0 " ก่อนการแลกเปลี่ยน

นี่เป็นปัญหาซอฟต์แวร์หมดจดหรือเปล่าเนื่องจากแอปพลิเคชันพยายามใช้อุปกรณ์ที่พบครั้งแรกเป็นอุปกรณ์เริ่มต้นแม้ว่าจะมีการตั้งชื่ออินเตอร์เฟสหรือมีวิธีแก้ไขปัญหานี้โดยการกำหนดค่าระบบปฏิบัติการหรือไม่


แก้ไข:ฉันเขียนแอปขนาดเล็กเพื่อพิมพ์ iflist และอุปกรณ์ PCI ( eth1 ) ปรากฏขึ้นก่อน " eth0 " แนวคิดใด ๆ วิธีสลับลำดับอุปกรณ์


แก้ไข:ฉันพบเธรดเกี่ยวกับปัญหาเดียวกันและฉันลองทุกอย่างที่พวกเขาแนะนำและไม่มีวิธีแก้ปัญหาใดทำงานยกเว้นการสลับชื่อ "ความจริง"


เพียงแค่ต้องทราบการแก้ไข /etc/udev/rules.d/70-persistent-net.rules และการรีบูตทำงานให้ฉัน
Xosofox

คำตอบ:


18

ฉันกำลังตอบคำถามของตัวเองตอนนี้เพราะในที่สุดฉันก็พบวิธีแก้ปัญหาสำหรับปัญหานี้

ฉันพบว่าเป็นไปได้ที่จะเรียงลำดับอุปกรณ์ใหม่โดยการยกเลิกการโหลดไดรเวอร์และทำการโหลดตามลำดับที่ถูกต้อง

วิธีแรก (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

ลิงค์ที่มีประโยชน์ที่ฉันพบในขณะค้นหาวิธีแก้ปัญหา:


2
+1 คุณสมควรได้รับมากกว่าหนึ่งคะแนนเท่านั้น
bahamat

ฉันมีปัญหาที่คล้ายกัน: ฉันมี NIC รวมอยู่แล้วบางครั้งฉันก็เรียกใช้โปรแกรม VPN ซึ่งสร้างอินเทอร์เฟซอื่น ดูเหมือนว่าอินเทอร์เฟซ VPN จะมาก่อนเสมอ แต่ฉันไม่รู้ว่าทำไม ฉันต้องการให้ใช้ในสถานการณ์ที่หายากมากเท่านั้น (ฉันต้องการแอปพลิเคชันที่ใช้เพื่อระบุอินเทอร์เฟซ VPN) ความคิดใด ๆ ^ _ ^ ฉันอาจจะโพสต์คำถามใหม่ในไม่ช้า
การชดเชย จำกัด

2

คุณสามารถใช้netdev=พารามิเตอร์บรรทัดคำสั่งเคอร์เนล (คุณต้องส่งผ่านไปยังเคอร์เนลในด้วง) เพื่อสั่งให้เคอร์เนลเชื่อมโยง irq ที่กำหนดไปยังอินเทอร์เฟซที่กำหนดเช่น:netdev=irq=2,name=eth0


1
ฉันบูตกล่องด้วยการปรับแต่งการปรับแต่งด้วงและฉันยังคงได้รับeth1เป็นอุปกรณ์เริ่มต้นในหลาย ๆ แอพ ฉันจะตรวจสอบ dmesg เพื่อดูข้อมูลและเครือข่ายและมันบอกว่า NIC แบบบูรณาการยังคงมี ' eth1 ' เป็น forcedeth 0000:00:04.0: ifname eth1, PHY OUI 0x57d @ 1, addr 40:40:00:40:40:40ifname: นี่ไม่ใช่ปัญหาที่ร้ายแรงเกินไป แต่มันบดขยี้เกียร์ของฉันจริง ๆ เพราะอินทิเกรตคือการ์ด 1GB และควรเป็นอุปกรณ์เริ่มต้น
Athabaska Dick

1
ตอนนี้ฉันได้ลองใช้nameifเพื่อเปลี่ยนชื่ออินเตอร์เฟสเครือข่าย แต่ดูเหมือนว่ามันจะเหมือนกับที่ udev ทำ ไม่มีการเปลี่ยนแปลงคำสั่ง NIC "ของจริง" ฉันพยายามเปลี่ยนตำแหน่งทางกายภาพของ PCI NIC ด้วย แต่ก็ไม่ได้ช่วย Integrated NIC มี IRQ 22 และ PCI NIC มี IRQ 17 ดังนั้นดูเหมือนว่าเคอร์เนลกำลังสั่งซื้อโดย IRQ และผู้ใช้ไม่สามารถเปลี่ยนความจริงนั้นในทางใดทางหนึ่ง ความคิดใหม่ ๆ
Athabaska Dick

1

คุณอาจต้องเข้าไปในไฟล์กำหนดค่าโปรแกรมที่ได้รับผลกระทบแต่ละไฟล์และเปลี่ยน 'eth1' เป็น 'eth0' ค่าเริ่มต้นของโปรแกรมดังกล่าวจะถูกตั้งค่าเมื่อติดตั้งหรือรันครั้งแรกด้วย NIC ที่ตรวจพบในปัจจุบัน

ฉันใช้ Linux เป็นเราเตอร์และมีปัญหานี้เมื่อใช้สคริปต์ ตอนนี้ผมมีส่วนสคริปต์ที่ดีเรียกnetconfว่าผมแหล่งที่มาในบทอื่น ๆ เมื่อใดก็ตามที่ฉันจำเป็นต้องใช้ชื่อ NIC แฟ้มนี้ให้ฉันตั้งอยู่ใจกลางเมืองเพื่อระบุพวกเขา (เช่นLAN_IFACE=eth0, WAN_IFACE=eth1ฯลฯ )


2
ดูเหมือนว่าโปรแกรมจำนวนมากอาศัยพึ่งฟังก์ชั่นif_nameindex ()จากส่วนหัว<net / if.h> พวกเขาใช้อุปกรณ์แรกที่พบและละเว้นชื่ออินเทอร์เฟซทั้งหมด ฉันเห็นได้ว่าทำไมมันถึงทำแบบนั้นมันใช้งานอุปกรณ์ที่ค้นพบครั้งแรกได้ง่ายกว่าเรียงชื่อ
Athabaska Dick

1

iftopคุณไม่สามารถเปลี่ยนอินเตอร์เฟซที่ถูกนำมาใช้โดยเริ่มต้นในการใช้งานเช่น พวกเขาเรียกใช้ฟังก์ชันไลบรารี C if_nameindexและใช้องค์ประกอบแรกในอาร์เรย์ที่ส่งคืนโดยค่าเริ่มต้น GNU libc ของif_nameindexบน Linux เป็นเสื้อคลุมบาง ๆ รอบIOCTLSIOCGIFCONF ที่ส่งคืนอินเทอร์เฟซในใบสั่งคงที่โดยยึดตามลำดับที่ไดรเวอร์เครือข่ายเริ่มต้นและลำดับที่แต่ละไดรเวอร์ตรวจพบอุปกรณ์แต่ละชิ้น

จริงๆถ้าคุณไม่ต้องการที่จะต้องผ่าน-iไปiftopและโปรแกรมที่คล้ายกันคุณสามารถทำให้เสื้อคลุมขนาดเล็กทั่วif_nameindexreorders LD_PRELOADว่าองค์ประกอบในรายการที่ส่งคืนด้วย ฉันจะเรียกว่าปัญหามากขึ้นกว่าที่คุ้มค่า


ฉันจัดการระบุ "ปัญหา" ลงในif_nameindexฟังก์ชั่นด้วย บางทีฉันอาจจะทิ้งมันไว้ตอนนี้ โชคดีที่บางแอพตรวจสอบชื่ออินเทอร์เฟซ ในขณะที่บางแอพไม่มีตัวเลือกการตั้งค่าเริ่มต้นดังนั้นฉันต้องใช้ตัวเลือก -i ฉันแค่สงสัยว่าทำไมตัวเลือกการโหลดเคอร์เนลnetdev=irq=22,name=eth0ไม่ทำงาน ฉันคิดว่าน่าจะเป็นไปได้ที่จะเปลี่ยนคำสั่ง NIC เมื่อเริ่มต้นเคอร์เนล
Athabaska Dick

จากการดูอย่างรวดเร็วที่เคอร์เนลแหล่ง ( for_each_netdevแมโคร), อินเทอร์เฟซที่ระบุในลำดับที่โหลดโปรแกรมควบคุม (คร่าว ๆ ) อินเทอร์เฟซของคุณอาจใช้ไดรเวอร์ที่แตกต่างกันดังนั้นคุณจะต้องจัดการให้โหลดไดรเวอร์ตามลำดับที่คุณต้องการ ฉันคาดหวังว่าสิ่งนี้จะเป็นเรื่องยากโดยเฉพาะอย่างยิ่งหากคุณต้องการปรับแต่งให้ทำงานข้ามการอัพเกรดเคอร์เนล
Gilles 'หยุดความชั่วร้าย'

1

หากพวกเขามีไดรเวอร์ที่แตกต่างกันอย่างน้อยก็ย้อนกลับไปในวันที่คุณสามารถใส่ลงในหนึ่งในไฟล์การกำหนดค่าโมดูล

alias eth0 driver1
alias eth1 driver2

นั่นเป็นความรู้เก่าที่ค่อนข้างสวย แต่มันอาจช่วยได้


-1

ดูแพ็คเกจ 'ifrename' สิ่งนี้ช่วยให้คุณเปลี่ยนชื่ออินเทอร์เฟซตามข้อมูลต่าง ๆ เช่นที่อยู่ MAC ของอินเตอร์เฟสไดรเวอร์ขัดจังหวะ ... กำหนดค่าในไฟล์ / etc / iftab

ตัวอย่างบางส่วนจาก man page:

   # This is a comment
   eth2      mac 08:00:09:DE:82:0E
   eth3      driver wavelan interrupt 15 baseaddress 0x390
   eth4      driver pcnet32 businfo 0000:02:05.0
   air*      mac 00:07:0E:* arp 1
   myvpn     SYSFS{address} 00:10:83:* SYSFS{type} 1
   bcm*      SYSFS{device} 0000:03:00.0 SYSFS{device/driver} bcm43xx
   bcm*      SYSFS{..} 0000:03:00.0 SYSFS{../driver} bcm43xx

ยินดีต้อนรับสู่ U&L คุณสามารถให้คำตอบที่สมบูรณ์ไม่ใช่แค่คำใบ้เท่านั้น? คุณไม่ควรโพสต์ด้วยข้อความที่ชอบ "มีหน้าคน ... "
Archemar
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.