लिनक्स पर नेटवर्क कार्ड (eth1 <-> eth0) के क्रम को कैसे बदलें


20

क्या सिस्टम इंस्टालेशन के बाद नेटवर्क इंटरफेस ( eth1 <-> eth0 ) को स्वैप करने का कोई तरीका है ।

मेरे ब्रांड नए डेबियन 6.0 ने " एथ0 " के रूप में असाइन किए गए पीसीआई नेटवर्क कार्ड और डिफ़ॉल्ट रूप से मदरबोर्ड एकीकृत नेटवर्क डिवाइस को " एथ 1 " के रूप में स्थापित किया है। समस्या यह है कि मैं एकीकृत डिवाइस को डिफ़ॉल्ट ( eth0 ) नेटवर्क इंटरफ़ेस के रूप में उपयोग करना चाहता हूं ।

मैंने पहले ही संपादित कर लिया है:

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

नामों को स्वैप करने के लिए और सब कुछ ठीक लगता है और नेटवर्क काम कर रहा है, लेकिन प्रोग्राम अभी भी डिफ़ॉल्ट इंटरफ़ेस के रूप में पीसीआई नेटवर्क कार्ड (जो अब " एथ 1 ") का उपयोग करने की कोशिश कर रहे हैं । उदाहरण के लिए iftop अब " eth1 " को डिफ़ॉल्ट डिवाइस के रूप में उपयोग करने की कोशिश करता है क्योंकि यह स्वैप से पहले " eth0 " का उपयोग करता था।

क्या यह विशुद्ध रूप से एक सॉफ्टवेयर समस्या है, क्योंकि एप्लिकेशन पहले इंटरफ़ेस के नामकरण के बावजूद डिफॉल्ट डिवाइस के रूप में पहले पाए गए डिवाइस का उपयोग करने की कोशिश कर रहे हैं या ओएस को कॉन्फ़िगर करके इसे ठीक करने का कोई तरीका है?


संपादित करें: मैंने iflist को प्रिंट करने के लिए एक छोटा सा ऐप लिखा और " eth0 " से पहले PCI डिवाइस ( eth1 ) आया । कोई भी विचार कैसे डिवाइस ऑर्डर स्वैप करना है।


संपादित करें: मुझे एक ही समस्या के बारे में एक सूत्र मिला और मैंने उनके द्वारा सुझाई गई हर चीज की कोशिश की और "वस्तुतः" नामों की अदला-बदली के अलावा कोई भी समाधान काम नहीं कर रहा है।


बस ध्यान दें, संपादन /etc/udev/rules.d/70-persistent-net.rules और एक रिबूट ने मेरे लिए काम किया
Xosofox

जवाबों:


18

मैं अब अपने स्वयं के प्रश्न का उत्तर दे रहा हूं क्योंकि मुझे आखिरकार इस समस्या के लिए एक समाधान मिला।

मुझे पता चला कि ड्राइवरों को उतारकर और फिर उन्हें सही क्रम में लोड करके उपकरणों को फिर से चालू करना संभव है।

पहली विधि (bruteforce):

तो पहली विधि जो मैं लेकर आया था, init.d स्क्रिप्ट के साथ ड्राइवर को पुनः लोड करने के लिए सरल था।

निम्नलिखित init स्क्रिप्ट को डेबियन 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

फिर स्क्रिप्ट को उचित रनलेवल डायरेक्टरी में जोड़ा जाना चाहिए। यह डेबियन पर " अपडेट-आरडीडी " कमांड के साथ आसानी से किया जा सकता है । उदाहरण के लिए:update-rc.d reorder-nics start S


दूसरी विधि (बेहतर मुझे लगता है):

मुझे थोड़ा और सुरुचिपूर्ण रास्ता मिला (कम से कम डेबियन और उबंटू सिस्टम के लिए)।

पहले सुनिश्चित करें कि कर्नेल स्वतः एनआईसी ड्राइवरों को लोड नहीं करता है। इसमें ब्लैकलिस्ट फ़ाइल बनाकर किया जा सकता है /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

फिर रूट के रूप में ' डेमोड -ए ' चलाएं

' Initramfs -u ' के साथ अपने initrd को फिर से बनाएँ

और अंत में ड्राइवर का नाम सही क्रम में / etc / मॉड्यूल फ़ाइल में जोड़ें।

# /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 आप निश्चित रूप से उस के लिए केवल एक से अधिक वोट के लायक हैं।
बहमट

मुझे एक समान समस्या है: मेरे पास एक एकीकृत एनआईसी है, फिर कभी-कभी मैं एक वीपीएन प्रोग्राम चलाता हूं जो एक और इंटरफ़ेस बनाता है। वीपीएन इंटरफ़ेस हमेशा पूर्वता लेने लगता है, लेकिन मुझे नहीं पता कि क्यों। मैं केवल इसे बहुत ही दुर्लभ परिस्थितियों में उपयोग करना चाहता हूं (मैं चाहता हूं कि वह एप्लिकेशन जो वीपीएन इंटरफ़ेस निर्दिष्ट करने के लिए इसका उपयोग करता है)। कोई विचार? ^ _ ^ मैं शायद बहुत जल्द ही एक नया प्रश्न पोस्ट करूंगा।
सीमित प्रायश्चित

2

आप netdev=कर्नेल कमांड लाइन पैरामीटर का उपयोग कर सकते हैं (आपको उस कर्नेल को ग्रब में पास करने की आवश्यकता है) कर्नेल को दिए गए इंटरफ़ेस से दिए गए irq को जोड़ने के लिए निर्देश देने के लिए, जैसे:netdev=irq=2,name=eth0


1
मैंने अपने बॉक्स को ग्रब कॉन्फिगरेशन संशोधनों के साथ बूट किया और मुझे अभी भी कई ऐप्स में डिफ़ॉल्ट डिवाइस के रूप में eth1 मिल रहा है । मैंने नेटवर्क जानकारी के लिए dmesg की जाँच की और यह कहता है कि एकीकृत NIC में अभी भी ifname के रूप में ' eth1 ' है forcedeth 0000:00:04.0: ifname eth1, PHY OUI 0x57d @ 1, addr 40:40:00:40:40:40:। यह बहुत गंभीर समस्या नहीं है, लेकिन यह वास्तव में मेरे गियर को पीसता है क्योंकि एकीकृत 1 जीबी कार्ड है और यह डिफ़ॉल्ट डिवाइस होना चाहिए।
अथाबास्का डिक

1
मैंने अब नेटवर्क इंटरफ़ेस नामों को बदलने के लिए नेमिफ का उपयोग करने की कोशिश की है लेकिन ऐसा लगता है कि यह वही करता है जो udv करता है। "वास्तविक" एनआईसी आदेश में कोई बदलाव नहीं। मैंने PCI NIC के भौतिक स्थान को बदलने की भी कोशिश की, लेकिन इससे कोई मदद नहीं मिली। एकीकृत एनआईसी में आईआरक्यू 22 है और पीसीआई एनआईसी में आईआरक्यू 17 है इसलिए ऐसा लगता है कि कर्नेल उन्हें आईआरक्यू द्वारा आदेश दे रहा है और उपयोगकर्ता उस तथ्य को किसी भी तरह से बदल नहीं सकता है। कोई नया विचार?
अथाबास्का डिक

1

आपको प्रत्येक प्रभावित प्रोग्राम कॉन्फ़िगरेशन फ़ाइलों में जाने और 'eth1' को 'eth0' में बदलने की संभावना है। ऐसे प्रोग्राम डिफॉल्ट्स सेटअप किए जाते हैं जब वे स्थापित होते हैं या पहले वर्तमान में पाए गए एनआईसी के साथ चलते हैं।

मैं एक राउटर के रूप में लिनक्स का उपयोग करता हूं, और स्क्रिप्ट का उपयोग करते समय यह समस्या थी। अब मैं एक अच्छा स्क्रिप्ट टुकड़ा कहा जाता है netconfकिसी भी अन्य स्क्रिप्ट जब भी मैं एनआईसी नाम का उपयोग करने की आवश्यकता है के लिए में है कि मैं स्रोत, इस फाइल मुझे उन्हें निर्दिष्ट करने के लिए एक केंद्रीय स्थान देता है (यानी LAN_IFACE=eth0, WAN_IFACE=eth1आदि)


2
ऐसा लगता है कि बहुत सारे कार्यक्रम सिर्फ if_nameindex () फ़ंक्शन पर <net / if.h> शीर्ष लेख से निर्भर हैं । वे केवल पहले डिवाइस का उपयोग करते हैं जो वे पाते हैं और इंटरफ़ेस नामों की पूरी तरह से उपेक्षा करते हैं। मैं देख सकता हूं कि यह ऐसा क्यों किया गया है, नामों को क्रमबद्ध करने की तुलना में पहले पाए गए डिवाइस का उपयोग करना बहुत आसान है।
अथाबास्का डिक

1

आप यह नहीं बदल सकते हैं कि कौन सा इंटरफ़ेस डिफ़ॉल्ट रूप से अनुप्रयोगों में उपयोग किया जाता है iftop। वे सी लाइब्रेरी फ़ंक्शन को कॉल करते हैं if_nameindexऔर डिफ़ॉल्ट रूप से लौटे सरणी में पहले तत्व का उपयोग करते हैं। if_nameindexलिनक्स पर GNU libc SIOCGIFCONFioctl के आसपास एक पतला आवरण है । यह एक निश्चित क्रम में इंटरफेस लौटाता है, उस क्रम के आधार पर जिसमें नेटवर्क ड्राइवरों को आरंभीकृत किया गया था और जिस क्रम में प्रत्येक ड्राइवर ने प्रत्येक डिवाइस का पता लगाया था।

क्या तुम सच में पारित करने के लिए नहीं करना चाहते हैं -iके लिए iftopऔर इसी तरह के कार्यक्रमों, आप के आसपास एक छोटा सा आवरण बना सकते हैं if_nameindexके साथ है कि पुन: क्रमित लौटे सूची में तत्वों, LD_PRELOAD। मुझे लगता है कि यह बहुत अधिक मुसीबत से लायक है।


मैंने if_nameindexफ़ंक्शन में "समस्या" को भी इंगित किया । शायद मैं इसे अभी के लिए छोड़ देता हूं। सौभाग्य से कुछ ऐप वास्तव में इंटरफ़ेस नाम की जांच करते हैं। दूसरी ओर कुछ ऐप्स में डिफ़ॉल्ट कॉन्फ़िगरेशन विकल्प भी नहीं होते हैं इसलिए मुझे सिर्फ -i विकल्प का उपयोग करना होगा। मैं सोच रहा था कि कर्नेल लोडिंग विकल्प netdev=irq=22,name=eth0काम क्यों नहीं करता है? मुझे लगा कि कर्नेल स्टार्टअप पर एनआईसी के आदेश को बदलना संभव है।
अथाबास्का डिक

कर्नेल स्रोत ( for_each_netdevमैक्रो) पर एक त्वरित नज़र से , इंटरफेस को उस क्रम में एन्यूमरेट किया जाता है जिसमें ड्राइवर लोड किए जाते हैं (मोटे तौर पर)। आपके इंटरफेस संभवत: विभिन्न ड्राइवरों का उपयोग करते हैं, इसलिए आपको उन ड्राइवरों के लिए व्यवस्था करनी होगी जिन्हें आप चाहते हैं। मुझे उम्मीद है कि यह मुश्किल होगा, खासकर अगर आप चाहते हैं कि आपका ट्विन कर्नेल के उन्नयन पर काम करे।
गिल्स एसओ- बुराई को रोकें '

1

यदि उनके पास अलग-अलग ड्राइवर हैं, तो कम से कम उस दिन जब आप मॉड्यूल कॉन्फ़िगरेशन फ़ाइलों में से एक में डाल सकते हैं:

alias eth0 driver1
alias eth1 driver2

यह कुछ बहुत पुराना ज्ञान है, लेकिन यह मदद कर सकता है।


-1

'Ifrename' पैकेज पर एक नजर। यह आपको इंटरफ़ेस / ड्राइवर, इंटरप्ट ..., / a / etc / iftab फ़ाइल में कॉन्फ़िगर किए गए मैक पते जैसी विभिन्न सूचनाओं के आधार पर इंटरफ़ेस नामों का नाम बदलने देता है।

मैन पेज से कुछ उदाहरण:

   # 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 में आपका स्वागत है, क्या आप हमें पूरा जवाब दे सकते हैं, केवल संकेत नहीं? आपको कुछ पोस्टिंग के साथ पोस्ट नहीं करना चाहिए जैसे "एक मैन पेज है ..."।
आर्चेमार
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.