Cách thay đổi thứ tự các card mạng (eth1 <-> eth0) trên linux


20

Có cách nào để trao đổi giao diện mạng ( eth1 <-> eth0 ) sau khi cài đặt hệ thống.

Cài đặt Debian 6.0 hoàn toàn mới của tôi được gán card mạng PCI là " eth0 " và thiết bị mạng tích hợp bo mạch chủ là " eth1 " theo mặc định. Vấn đề là tôi muốn sử dụng thiết bị tích hợp làm giao diện mạng mặc định ( eth0 ).

Tôi đã chỉnh sửa:

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

để hoán đổi tên và mọi thứ dường như đều ổn và mạng đang hoạt động nhưng các chương trình vẫn đang cố gắng sử dụng card mạng PCI (hiện là " eth1 ") làm giao diện mặc định. Ví dụ: iftop hiện cố gắng sử dụng " eth1 " làm thiết bị mặc định vì nó đã sử dụng " eth0 " trước khi trao đổi.

Đây có phải là sự cố phần mềm không khi các ứng dụng đang cố gắng sử dụng thiết bị được tìm thấy đầu tiên làm thiết bị mặc định mặc dù đã đặt tên giao diện hoặc có cách nào khắc phục điều này bằng cách định cấu hình HĐH không?


chỉnh sửa: Tôi đã viết một ứng dụng nhỏ để in iflist và thiết bị PCI ( eth1 ) xuất hiện trước " eth0 ". Bất kỳ ý tưởng làm thế nào để trao đổi thứ tự thiết bị.


chỉnh sửa: Tôi tìm thấy một chủ đề về cùng một vấn đề và tôi đã thử mọi thứ họ đề xuất và không có giải pháp nào hoạt động ngoại trừ việc hoán đổi tên "hầu như".


Chỉ cần lưu ý, chỉnh sửa /etc/udev/rules.d/70-persistent-net.rules và khởi động lại đã làm công việc cho tôi
Xosofox

Câu trả lời:


18

Bây giờ tôi đang trả lời câu hỏi của mình vì cuối cùng tôi cũng tìm được cách giải quyết cho vấn đề này.

Tôi phát hiện ra rằng có thể sắp xếp lại các thiết bị bằng cách dỡ trình điều khiển và sau đó tải chúng theo đúng thứ tự.

Phương pháp đầu tiên (bruteforce):

Vì vậy, phương pháp đầu tiên tôi nghĩ ra là đơn giản để cải tiến trình điều khiển tải lại với tập lệnh init.d.

Tập lệnh init được thiết kế riêng cho Debian 6.0, nhưng cùng một nguyên tắc sẽ hoạt động trên hầu hết mọi bản phân phối sử dụng tập lệnh init.d thích hợp.

#!/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

Sau đó, tập lệnh phải được thêm vào thư mục runlevel thích hợp. Điều này có thể được thực hiện dễ dàng trên Debian với lệnh " update-rc.d ". Ví dụ:update-rc.d reorder-nics start S


Phương pháp thứ hai (Tôi nghĩ tốt hơn):

Tôi cũng tìm thấy một cách thanh lịch hơn một chút (ít nhất là đối với các hệ thống Debian & Ubuntu).

Trước tiên, hãy đảm bảo rằng kernel không tự động tải trình điều khiển NIC. Điều này có thể được thực hiện bằng cách tạo một tệp danh sách đen trong /etc/modprobe.d/. Tôi đã tạo một tập tin có tên " disable-nics.conf". Lưu ý rằng các tập tin trong /etc/modprobe.d/phải có .confhậu tố. Ngoài ra, việc đặt tên các mô-đun /etc/modprobe.d/blacklist.confkhông ảnh hưởng đến việc tự động tải các mô-đun bằng kernel, vì vậy bạn phải tạo tệp của riêng mình.

# Disable automatic loading of kernel driver modules
# Disable NIC drivers

blacklist driver_0     # eth0 by default
blacklist driver_1     # eth1 by default

Sau đó chạy ' depmod -ae ' với quyền root

Tái tạo initrd của bạn với ' update-initramfs -u '

Và cuối cùng thêm tên trình điều khiển theo thứ tự đã sửa vào tệp / etc / mô-đun .

# /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

Thay đổi sẽ có hiệu lực sau lần khởi động tiếp theo.

Khởi động lại là không cần thiết mặc dù; thật dễ dàng để chuyển đổi các thiết bị bằng lệnh sau (tất nhiên là root):

modprobe -r driver_0; modprobe -r driver_1; modprobe driver_1; modprobe driver_0

Một số liên kết hữu ích tôi tìm thấy trong khi tìm kiếm giải pháp:


2
+1 Bạn chắc chắn xứng đáng với nhiều hơn một phiếu bầu cho điều đó.
bahamat

Tôi có một vấn đề tương tự: Tôi có một NIC tích hợp, đôi khi tôi chạy một chương trình VPN tạo giao diện khác. Giao diện VPN dường như luôn được ưu tiên, nhưng tôi không biết tại sao. Tôi chỉ muốn nó được sử dụng trong những trường hợp rất hiếm (tôi muốn ứng dụng sử dụng nó phải chỉ định giao diện VPN). Có ý kiến ​​gì không? ^ _ ^ Có lẽ tôi sẽ sớm đăng một câu hỏi mới.
Chuộc tội có giới hạn

2

Bạn có thể sử dụng netdev=tham số dòng lệnh kernel (bạn cần truyền nó cho kernel trong grub) để hướng dẫn kernel liên kết một irq đã cho với một giao diện đã cho, ví dụ:netdev=irq=2,name=eth0


1
Tôi đã khởi động hộp của mình với các sửa đổi cấu hình grub và tôi vẫn nhận được eth1 là thiết bị mặc định trong nhiều ứng dụng. Tôi đã kiểm tra dmesg để biết thông tin mạng và nó nói rằng NIC tích hợp vẫn còn ' eth1 ' là ifname : forcedeth 0000:00:04.0: ifname eth1, PHY OUI 0x57d @ 1, addr 40:40:00:40:40:40. Đây không phải là vấn đề quá nghiêm trọng nhưng nó thực sự làm hỏng bánh răng của tôi vì tích hợp là thẻ 1gb và nó phải là thiết bị mặc định.
Athabaska Dick

1
Bây giờ tôi đã cố gắng sử dụng nameif để thay đổi tên giao diện mạng nhưng có vẻ như nó giống như udev. Không có thay đổi trong thứ tự NIC "thực". Tôi cũng đã cố gắng thay đổi vị trí vật lý của các PCI PCI nhưng cũng không giúp được gì. NIC tích hợp có IRQ 22 và PCI NIC có IRQ 17 nên có vẻ như kernel đang đặt hàng chúng theo IRQ và người dùng không thể thay đổi thực tế đó theo bất kỳ cách nào. Bất kỳ ý tưởng mới?
Athabaska Dick

1

Bạn có thể sẽ phải đi vào từng tệp cấu hình chương trình bị ảnh hưởng và thay đổi 'eth1' thành 'eth0.' Các chương trình mặc định như vậy được thiết lập khi chúng được cài đặt hoặc chạy lần đầu tiên với các NIC hiện được phát hiện.

Tôi sử dụng Linux như một bộ định tuyến và gặp vấn đề này khi sử dụng các tập lệnh. Bây giờ tôi có một đoạn kịch bản đẹp gọi netconfmà tôi nguồn trong đối với bất kỳ kịch bản khác bất cứ khi nào tôi cần phải sử dụng tên NIC, tập tin này mang lại cho tôi một vị trí trung tâm để xác định chúng (ví dụ LAN_IFACE=eth0, WAN_IFACE=eth1vv)


2
Có vẻ như rất nhiều chương trình chỉ dựa vào hàm if_nameindex () từ tiêu đề <net / if.h> . Họ chỉ sử dụng thiết bị đầu tiên họ tìm thấy và hoàn toàn bỏ qua các tên giao diện. Tôi có thể thấy lý do tại sao nó được thực hiện như vậy, nó dễ sử dụng thiết bị đầu tiên được tìm thấy hơn là sắp xếp tên.
Athabaska Dick

1

Bạn không thể thay đổi giao diện nào được sử dụng theo mặc định trong các ứng dụng như iftop. Họ gọi hàm thư viện C if_nameindexvà sử dụng phần tử đầu tiên trong mảng được trả về theo mặc định. GNU libc's if_nameindextrên Linux là một trình bao bọc mỏng xung quanh SIOCGIFCONFioctl . Điều đó trả về các giao diện theo một thứ tự cố định, dựa trên thứ tự trình điều khiển mạng được khởi tạo và thứ tự mỗi trình điều khiển phát hiện từng thiết bị.

Nếu bạn thực sự không muốn phải vượt qua -iđể iftopvà các chương trình tương tự, bạn có thể tạo một wrapper nhỏ xung quanh if_nameindexđó sắp xếp lại các yếu tố trong danh sách trả về với LD_PRELOAD. Tôi sẽ gọi đó là nhiều rắc rối hơn giá trị của nó.


Tôi cũng quản lý xác định chính xác "vấn đề" thành if_nameindexchức năng. Có lẽ tôi chỉ để nó bây giờ. May mắn thay một số ứng dụng thực sự kiểm tra tên giao diện. Mặt khác, một số ứng dụng thậm chí không có tùy chọn cấu hình mặc định nên tôi chỉ phải sử dụng tùy chọn -i. Tôi chỉ tự hỏi tại sao tùy chọn tải kernel netdev=irq=22,name=eth0không hoạt động? Tôi nghĩ rằng nó có thể thay đổi thứ tự NIC khi khởi động kernel.
Athabaska Dick

Từ cái nhìn nhanh về nguồn kernel ( for_each_netdevmacro), các giao diện được liệt kê theo thứ tự các trình điều khiển được tải (đại khái). Giao diện của bạn có thể sử dụng các trình điều khiển khác nhau, vì vậy bạn phải sắp xếp để các trình điều khiển được tải theo thứ tự bạn muốn. Tôi hy vọng điều này sẽ khó khăn, đặc biệt nếu bạn muốn tinh chỉnh của mình hoạt động trong quá trình nâng cấp kernel.
Gilles 'SO- ngừng trở nên xấu xa'

1

Nếu họ có các trình điều khiển khác nhau, ít nhất là vào ngày bạn có thể đưa vào một trong các tệp cấu hình mô-đun:

alias eth0 driver1
alias eth1 driver2

Đó là một số kiến ​​thức khá cũ nhưng nó có thể giúp ích.


-1

Hãy xem gói 'ifrename'. Điều này cho phép bạn đổi tên tên giao diện dựa trên nhiều thông tin khác nhau, chẳng hạn như địa chỉ MAC của giao diện, trình điều khiển, ngắt ..., được định cấu hình trong tệp / etc / iftab.

Một số ví dụ từ trang người đàn ông:

   # 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

Chào mừng bạn đến với U & L, bạn có thể cung cấp cho chúng tôi câu trả lời đầy đủ, không chỉ là gợi ý? Bạn không nên đăng bài với nội dung như "có một trang nam ...".
Archemar
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.