Cara mengubah urutan kartu jaringan (eth1 <-> eth0) di linux

20

Apakah ada cara untuk menukar antarmuka jaringan ( eth1 <-> eth0 ) setelah instalasi sistem.

Debian 6.0 saya yang baru menginstal kartu jaringan PCI yang ditetapkan sebagai " eth0 " dan motherboard perangkat jaringan terintegrasi sebagai " eth1 " secara default. Masalahnya adalah saya ingin menggunakan perangkat terintegrasi sebagai antarmuka jaringan default ( eth0 ).

Saya sudah mengedit:

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

untuk menukar nama dan semuanya tampaknya ok dan jaringan berfungsi tetapi program masih mencoba untuk menggunakan kartu jaringan PCI (yang sekarang " eth1 ") sebagai antarmuka standar. Misalnya iftop sekarang mencoba untuk menggunakan " eth1 " sebagai perangkat default seperti yang digunakan " eth0 " sebelum swap.

Apakah ini murni masalah perangkat lunak karena aplikasi mencoba menggunakan perangkat yang pertama kali ditemukan sebagai perangkat default terlepas dari penamaan antarmuka mereka atau apakah ada cara untuk memperbaikinya dengan mengkonfigurasi OS?


sunting: Saya menulis aplikasi kecil untuk mencetak iflist dan perangkat PCI ( eth1 ) muncul sebelum " eth0 ". Ada ide bagaimana menukar pesanan perangkat.


sunting: Saya menemukan utas tentang masalah yang sama dan saya mencoba semua yang mereka sarankan dan tidak ada solusi yang bekerja kecuali untuk menukar nama "hampir".

Athabaska Dick
sumber
Sekadar diketahui, mengedit /etc/udev/rules.d/70-persistent-net.rules dan reboot melakukan pekerjaan untuk saya
Xosofox

Jawaban:

18

Saya menjawab pertanyaan saya sendiri sekarang karena saya akhirnya menemukan solusi untuk masalah ini.

Saya menemukan bahwa mungkin untuk memesan ulang perangkat dengan membongkar driver dan kemudian memuatnya dalam urutan yang benar.

Metode pertama (bruteforce):

Jadi metode pertama yang saya buat adalah mudah untuk memaksa driver memuat ulang dengan skrip init.d.

Skrip init berikut dirancang untuk Debian 6.0, tetapi prinsip yang sama harus bekerja pada hampir semua distribusi menggunakan skrip init.d yang tepat.

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

Maka skrip harus ditambahkan ke direktori runlevel yang tepat. Ini dapat dilakukan dengan mudah di Debian dengan perintah " update-rc.d ". Sebagai contoh:update-rc.d reorder-nics start S


Metode kedua (Lebih baik saya pikir):

Saya juga menemukan cara yang sedikit lebih elegan (setidaknya untuk sistem Debian & Ubuntu).

Pertama, pastikan kernel tidak memuat driver NIC secara otomatis. Ini dapat dilakukan dengan membuat file daftar hitam di /etc/modprobe.d/. Saya membuat file dengan nama " disable-nics.conf". Perhatikan bahwa file dalam /etc/modprobe.d/harus memiliki .confakhiran. Penamaan modul /etc/modprobe.d/blacklist.confjuga tidak memengaruhi modul autoloading oleh kernel, jadi Anda harus membuat file Anda sendiri.

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

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

Kemudian jalankan ' depmod -ae ' sebagai root

Buat initrd Anda dengan ' update-initramfs -u '

Dan akhirnya menambahkan nama driver dalam urutan yang benar ke 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

Perubahan harus mulai berlaku setelah booting berikutnya.

Reboot tidak perlu; mudah untuk berpindah perangkat dengan perintah berikut (sebagai root, tentu saja):

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

Beberapa tautan bermanfaat yang saya temukan saat mencari solusinya:

Athabaska Dick
sumber
2
+1 Anda pasti berhak mendapatkan lebih dari satu suara untuk itu.
bahamat
Saya memiliki masalah yang sama: Saya memiliki NIC terintegrasi, lalu terkadang saya menjalankan program VPN yang membuat antarmuka lain. Antarmuka VPN sepertinya selalu diutamakan, tetapi saya tidak tahu mengapa. Saya hanya ingin itu digunakan dalam keadaan yang sangat langka (saya ingin aplikasi yang menggunakannya harus menentukan antarmuka VPN). Ada ide? ^ _ ^ Saya mungkin akan segera mengirim pertanyaan baru.
Penebusan Terbatas
2

Anda dapat menggunakan netdev=parameter baris perintah kernel (Anda perlu memberikannya ke kernel di grub) untuk menginstruksikan kernel untuk menautkan irq yang diberikan ke antarmuka yang diberikan, misalnya:netdev=irq=2,name=eth0

Frederik Deweerdt
sumber
1
Saya mem-boot kotak saya dengan modifikasi konfigurasi grub dan saya masih mendapatkan eth1 sebagai perangkat default di banyak aplikasi. Aku memeriksa dmesg untuk info jaringan dan dan mengatakan bahwa NIC terintegrasi memiliki masih ' eth1 ' sebagai ifname: forcedeth 0000:00:04.0: ifname eth1, PHY OUI 0x57d @ 1, addr 40:40:00:40:40:40. Ini bukan masalah yang terlalu serius, tetapi ini benar-benar mengganggu saya karena yang terintegrasi adalah kartu 1GB dan itu harus menjadi perangkat default.
Athabaska Dick
1
Saya sekarang telah mencoba menggunakan nameif untuk mengubah nama antarmuka jaringan tetapi sepertinya ia melakukan hal yang sama seperti yang dilakukan udev. Tidak ada perubahan dalam urutan NIC "nyata". Saya juga mencoba mengubah lokasi fisik PCI NIC tetapi tidak membantu juga. NIC terintegrasi memiliki IRQ 22 dan PCI NIC memiliki IRQ 17 sehingga sepertinya kernel memerintahkannya oleh IRQ dan pengguna tidak dapat mengubah fakta itu dengan cara apa pun. Ada ide segar?
Athabaska Dick
1

Anda kemungkinan harus masuk ke setiap file konfigurasi program yang terpengaruh dan mengubah 'eth1' menjadi 'eth0.' Default program-program tersebut adalah setup ketika mereka diinstal atau dijalankan pertama kali dengan NIC yang terdeteksi saat ini.

Saya menggunakan Linux sebagai router, dan mengalami masalah ini saat menggunakan skrip. Saya sekarang memiliki script fragmen bagus disebut netconfbahwa saya sumber dalam untuk script lain setiap kali saya harus menggunakan nama NIC, file ini memberi saya lokasi sentral untuk menentukan mereka (yaitu LAN_IFACE=eth0, WAN_IFACE=eth1, dll)

LawrenceC
sumber
2
Sepertinya banyak program yang hanya mengandalkan fungsi if_nameindex () dari header <net / if.h> . Mereka hanya menggunakan perangkat pertama yang mereka temukan dan sama sekali mengabaikan nama antarmuka. Saya bisa melihat mengapa hal itu dilakukan seperti itu, jauh lebih mudah untuk menggunakan perangkat yang ditemukan pertama daripada mengurutkan namanya.
Athabaska Dick
1

Anda tidak dapat mengubah antarmuka mana yang digunakan secara default di aplikasi seperti iftop. Mereka memanggil fungsi C library if_nameindexdan menggunakan elemen pertama dalam array yang dikembalikan secara default. Libc GNUif_nameindex di Linux adalah pembungkus tipis di sekitar SIOCGIFCONFioctl . Itu mengembalikan antarmuka dalam urutan tetap, berdasarkan pada urutan di mana driver jaringan diinisialisasi dan urutan di mana setiap driver mendeteksi setiap perangkat.

Jika Anda benar-benar tidak ingin harus meneruskan -ike iftopdan program serupa, Anda dapat membuat pembungkus kecil di sekitar if_nameindexyang menata ulang elemen dalam daftar yang dikembalikan, dengan LD_PRELOAD. Saya akan menyebutnya lebih banyak masalah daripada nilainya.

Gilles 'SANGAT berhenti menjadi jahat'
sumber
Saya berhasil menentukan "masalah" ke dalam if_nameindexfungsi juga. Mungkin saya tinggalkan saja untuk saat ini. Untungnya beberapa aplikasi benar-benar memeriksa nama antarmuka. Di sisi lain beberapa aplikasi bahkan tidak memiliki opsi konfigurasi standar, jadi saya hanya perlu menggunakan opsi -i. Saya hanya ingin tahu mengapa opsi pemuatan kernel netdev=irq=22,name=eth0tidak berfungsi? Saya pikir mungkin untuk mengubah urutan NIC saat startup kernel.
Athabaska Dick
Dari sekilas melihat sumber kernel ( for_each_netdevmakro), antarmuka disebutkan dalam urutan di mana driver dimuat (kira-kira). Antarmuka Anda mungkin menggunakan driver yang berbeda, jadi Anda harus mengatur agar driver dimuat sesuai urutan yang Anda inginkan. Saya berharap ini menjadi sulit, terutama jika Anda ingin tweak Anda bekerja di seluruh upgrade kernel.
Gilles 'SO- stop being evil'
1

Jika mereka memiliki driver yang berbeda, setidaknya pada hari Anda dapat memasukkan ke dalam salah satu file konfigurasi modul:

alias eth0 driver1
alias eth1 driver2

Itu pengetahuan yang lumayan tua tetapi mungkin bisa membantu.

Aaron D. Marasco
sumber
-1

Lihatlah paket 'ifrename'. Ini memungkinkan Anda mengganti nama nama antarmuka berdasarkan berbagai informasi seperti alamat MAC antarmuka, driver, interrupt ..., dikonfigurasi dalam file / etc / iftab.

Beberapa contoh dari halaman manual:

   # 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
Ben White
sumber
Selamat datang di U&L, dapatkah Anda memberi kami jawaban yang lengkap, bukan sekadar petunjuk? Anda tidak boleh memposting dengan sesuatu seperti "ada halaman manual ...".
Archemar