Linux'ta ağ kartlarının (eth1 <-> eth0) sırasını değiştirme


20

Sistem kurulumundan sonra ağ arayüzlerini ( eth1 <-> eth0 ) değiştirmenin herhangi bir yolu var mı ?

Yeni Debian 6.0 kurulumum varsayılan olarak " eth0 " olarak atanmış PCI ağ kartını ve anakartlar tümleşik ağ cihazını " eth1 " olarak taktı . Sorun, entegre cihazı varsayılan ( eth0 ) ağ arabirimi olarak kullanmak istiyorum .

Zaten düzenledim:

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

adları takas etmek ve her şey yolunda görünüyor ve ağ çalışıyor ama programlar hala varsayılan arayüz olarak PCI ağ kartını (şimdi " eth1 ") kullanmaya çalışıyor . Örneğin, iftop artık takastan önce " eth0 " kullandığı için " eth1 " i varsayılan cihaz olarak kullanmaya çalışıyor .

Uygulamalar arayüz adlandırmalarına rağmen ilk bulunan cihazı varsayılan cihaz olarak kullanmaya çalıştıklarından bu sadece bir yazılım problemi mi yoksa işletim sistemini yapılandırarak bunu düzeltmenin herhangi bir yolu var mı?


edit: iflist yazdırmak için küçük bir uygulama yazdım ve PCI aygıt ( eth1 ) " eth0 " önce geldi . Cihaz siparişinin nasıl değiştirileceği hakkında fikirler.


edit: Ben aynı sorun hakkında bir iş parçacığı buldum ve önerdikleri her şeyi denedim ve çözüm "hiçbiri" neredeyse "takas dışında hiçbiri çalışmıyor.


Sadece şunu belirtmek gerekirse, /etc/udev/rules.d/70-persistent-net.rules ve reboot düzenlemek benim için işi yaptı
Xosofox

Yanıtlar:


18

Şimdi kendi soruma cevap veriyorum çünkü sonunda bu sorun için bir çözüm buldum.

Sürücüleri yükleyip ardından doğru sırayla yükleyerek aygıtları yeniden sıralamanın mümkün olduğunu öğrendim.

İlk yöntem (bruteforce):

Bu yüzden geldi ilk yöntem init.d komut dosyası ile sürücü yeniden yüklemek bruteforce basitti.

Aşağıdaki init betiği Debian 6.0 için hazırlanmıştır, ancak aynı ilke uygun init.d betikleri kullanılarak hemen hemen her dağıtım üzerinde çalışmalıdır.

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

Daha sonra komut dosyasının uygun çalışma düzeyi dizinine eklenmesi gerekir. Bu, Debian'da " update-rc.d " komutu ile kolayca yapılabilir . Örneğin:update-rc.d reorder-nics start S


İkinci yöntem (Daha iyi olduğunu düşünüyorum):

Ayrıca biraz daha zarif bir yol buldum (en azından Debian ve Ubuntu sistemleri için).

İlk olarak çekirdeğin NIC sürücülerini otomatik olarak yüklemediğinden emin olun. Bu, içinde bir kara liste dosyası oluşturularak yapılabilir /etc/modprobe.d/. " disable-nics.conf" Adlı bir dosya oluşturdum . İçindeki dosyaların soneki /etc/modprobe.d/olması gerektiğini unutmayın .conf. Ayrıca modüllerin adlandırılması /etc/modprobe.d/blacklist.conf, modüllerin çekirdek tarafından otomatik yüklenmesini etkilemez, bu nedenle kendi dosyanızı oluşturmanız gerekir.

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

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

Sonra root olarak ' depmod -ae ' komutunu çalıştırın

' Update-initramfs -u ' ile initrd'inizi yeniden yaratın

Ve son olarak / etc / modules dosyasına sürücü adlarını düzeltilmiş sırayla ekleyin .

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

Değişiklikler bir sonraki önyüklemeden sonra yürürlüğe girmelidir.

Yine de yeniden başlatma gerekli değildir; şu komutla cihazları değiştirmek kolaydır (tabii ki root olarak):

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

Çözümü ararken bulduğum bazı yararlı bağlantılar:


2
+1 Kesinlikle bunun için birden fazla oy hakkına sahipsiniz.
Bahama

Benzer bir sorunum var: Entegre bir NIC'im var, o zaman bazen başka bir arayüz oluşturan bir VPN programı çalıştırıyorum. VPN arayüzü her zaman önceliğe sahip gibi görünüyor, ancak nedenini bilmiyorum. Sadece çok nadir durumlarda kullanılmasını istiyorum (onu kullanan uygulamanın VPN arayüzünü belirtmesini istiyorum). Herhangi bir fikir? ^ _ ^ Muhtemelen yakında yeni bir soru göndereceğim.
Sınırlı Kefaret

2

netdev=Çekirdeğe belirli bir irq'i belirli bir arabirime bağlama talimatı vermek için çekirdek komut satırı parametresini kullanabilirsiniz (bunu grubdaki çekirdeğe iletmeniz gerekir), örneğin:netdev=irq=2,name=eth0


1
Grub yapılandırma değişiklikleriyle kutumu açtım ve hala birçok uygulamada eth1'i varsayılan cihaz olarak alıyorum . Dmesg'i ağ bilgisi için kontrol ettim ve entegre NIC'nin hala ' eth1 ' ifadesinin ifname olarak olduğunu söylüyor forcedeth 0000:00:04.0: ifname eth1, PHY OUI 0x57d @ 1, addr 40:40:00:40:40:40. Bu çok ciddi bir sorun değil ama gerçekten dişlilerimi öğütüyor çünkü entegre 1GB kart ve varsayılan cihaz olmalı.
Athabaska Dick

1
Şimdi ağ arabirimi adlarını değiştirmek için nameif kullanmaya çalıştım, ancak udev'in yaptığı gibi görünüyor. "Gerçek" NIC düzeninde değişiklik yok. Ayrıca PCI NIC'lerin fiziksel konumunu değiştirmeye çalıştım, ancak bu da yardımcı olmadı. Entegre NIC'in IRQ 22'si ve PCI NIC'in IRQ 17'si var, bu yüzden çekirdek onları IRQ tarafından sipariş ediyor gibi görünüyor ve kullanıcı bu gerçeği hiçbir şekilde değiştiremez. Yeni bir fikrin var mı?
Athabaska Dick

1

Etkilenen her program yapılandırma dosyasına girmeniz ve 'eth1'i' eth0 'olarak değiştirmeniz gerekecektir. Bu tür programlar varsayılanlar, o anda algılanan NIC'lerle yüklendiklerinde veya ilk çalıştırıldıklarında ayarlanır.

Linux'u yönlendirici olarak kullanıyorum ve komut dosyalarını kullanırken bu sorunu yaşadım. Şimdi adında güzel bir script parçasını sahip netconfi NIC adlarını kullanmak gerektiğinde başka komut dosyası için de ben kaynak, bu dosya bana bunları belirtmek için merkezi bir konum verir (yani LAN_IFACE=eth0, WAN_IFACE=eth1vs.)


2
Görünüşe göre birçok program <net / if.h> başlığından if_nameindex () işlevine güveniyor . Sadece buldukları ilk cihazı kullanıyorlar ve arayüz adlarını tamamen görmezden geliyorlar. Neden böyle yapıldığını görebiliyorum, ilk bulunan cihazı kullanmak isimleri sıralamaktan çok daha kolay.
Athabaska Dick

1

Gibi uygulamalarda varsayılan olarak hangi arayüzün kullanılacağını değiştiremezsiniz iftop. C kitaplığı işlevini çağırır ve if_nameindexvarsayılan olarak döndürülen dizideki ilk öğeyi kullanırlar. Linux'taki GNU libc'ler if_nameindex, SIOCGIFCONFioctl'in etrafında ince bir sargıdır . Bu, ağ sürücülerinin başlatılma sırasına ve her sürücünün her aygıtı algılama sırasına göre arabirimleri sabit bir sırayla döndürür.

Eğer gerçekten geçmek zorunda istemiyorsanız -ietmek iftopve benzer programlar, etrafında küçük bir sarmalayıcı yapabilirsiniz if_nameindexile, bu yeniden sıralar döndü listedeki elemanları LD_PRELOAD. Buna değdiğinden çok daha fazla sorun diyorum.


Ben de "sorunu" if_nameindexişlevini tam olarak başardı . Belki de şimdilik şimdilik bırakıyorum. Neyse ki bazı uygulamalar gerçekten arayüz adını kontrol ediyor. Öte yandan, bazı uygulamalar varsayılan yapılandırma seçeneklerine bile sahip değil, bu yüzden sadece -i seçeneğini kullanmak zorundayım. Sadece çekirdek yükleme seçeneğinin neden netdev=irq=22,name=eth0çalışmadığını merak ediyordum ? Çekirdek başlangıcında NIC sırasını değiştirmenin mümkün olacağını düşündüm.
Athabaska Dick

Çekirdek kaynağına ( for_each_netdevmakro) hızlı bir şekilde bakıldığında , arayüzler sürücülerin yüklendiği sıraya göre (kabaca) numaralandırılır. Arabirimleriniz muhtemelen farklı sürücüler kullanır, bu nedenle sürücülerin istediğiniz sırayla yüklenmesini ayarlamanız gerekir. Özellikle tweak'in bir çekirdek güncellemesinde çalışmasını istiyorsanız bunun zor olmasını beklerim.
Gilles 'SO- kötü olmayı bırak'

1

Farklı sürücüleri varsa, en azından gün içinde modül yapılandırma dosyalarından birine koyabilirsiniz:

alias eth0 driver1
alias eth1 driver2

Bu oldukça eski bir bilgi ama yardımcı olabilir.


-1

'İfrename' paketine bir göz atın. Bu, arabirim adlarını, / etc / iftab dosyasında yapılandırılan arabirim, sürücü, kesinti ..., MAC adresi gibi çeşitli bilgilere göre yeniden adlandırmanıza olanak tanır.

Kılavuz sayfasından bazı örnekler:

   # 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'ye hoş geldiniz, sadece ipuçları değil, bize tam bir cevap verebilir misiniz? "Bir man sayfası var ..." gibi bir mesaj göndermemelisiniz.
Archemar
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.