प्रीडिक्टेबल नेटवर्क इंटरफेस नेम Vm माइग्रेशन को तोड़ते हैं


9

/etc/networking/interfaces"अनुमानित नेटवर्क इंटरफ़ेस नामों" का उपयोग करते समय आप कैसे रीसेट करते हैं?

15.10 से अधिक पुराने Ubuntu के संस्करण नेटवर्क एडेप्टर नामों का उपयोग करते हैं जैसे:

  • eth0
  • eth1
  • eth2

एक नेटवर्क कार्ड की जगह, या एक नए हाइपरविज़र के लिए एक vm को स्थानांतरित करने से, लिनक्स को इंटरफ़ेस संख्या बढ़ाने का कारण होगा। हटाने से /etc/udev/rules.d/70-peristent-net.rulesलिनक्स का पुन: उपयोग होगा eth0

उबंटू 15.10 और नया प्रयोग ' प्रिडिक्टेबल नेटवर्क इंटरफेस नेम्स '। नेटवर्क एडेप्टर नाम मैक पते से लिया गया है।

  • ens3
  • ens32
  • ens192

जब vm माइग्रेट हो रहा है, तब से नेटवर्किंग शुरू नहीं होगी क्योंकि /etc/network/interfacesपुराने गैर-मौजूद नेटवर्क एडेप्टर को संदर्भित करता है।

# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

source /etc/network/interfaces.d/*

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
auto ens32
iface ens32 inet dhcp
pre-up sleep 2

/ Etc / नेटवर्क / इंटरफेस फ़ाइल को रीसेट करने का सबसे अच्छा तरीका क्या है?

Vm को बंद करने से पहले मुझे इस क्रिया को करने की आवश्यकता है और एक नए हाइपरवाइजर की ओर पलायन कर रहा हूं क्योंकि मैं महाराज / bento सुनहरी छवियों के आधार पर स्वचालित स्वर्ण चित्रों को बनाने के लिए पैकर का उपयोग कर रहा हूं ।

मैंने पाया है कि डिलीट / etc / नेटवर्क / इंटरफेस काम नहीं करता है क्योंकि माइग्रेशन के बाद फाइल अगले बूट पर अपने आप रीजनरेट नहीं होती है।

मैंने 'gr0' नामकरण सम्मेलन में वापस लौटने के लिए अपनी ग्रब फ़ाइल को संपादित करने की कोशिश की है। जबकि / etc / network / interfaces पुराने नाम (eth0) को संदर्भित करता है, vm को एक ip नहीं मिलेगा, और कोई भी रिबूट vm को नए नामकरण सम्मेलन का उपयोग करने का कारण बनेगा। इसके अलावा, मैंने पाया है कि systemd हमेशा पूर्वता लेगा जब तक कि मैं गारंटी नहीं दे सकता biosdevname=0 कि ग्रब कॉन्फिग में स्थायी रूप से बनी हुई है । निश्चित नहीं है कि इसे स्थायी रूप से कैसे लागू किया जाए

GRUB_CMDLINE_LINUX_DEFAULT="net.ifnames=0 bios.devname=0"

यदि संभव हो, तो मैं क्लाउड इनिट का उपयोग नहीं करूंगा या किसी भी पोस्ट स्टार्टअप स्क्रिप्ट का उपयोग नहीं करूंगा क्योंकि मैं यथासंभव सुनहरे चित्रों को साफ रखूंगा।

निश्चित रूप से यह एक समस्या है कि क्लाउड प्रदाता (एज़्योर, एडब्ल्यूएस, रैकस्पेस, ओपनस्टैक) पहले ही हल कर चुके हैं जब वे वीएमएस आयात करते हैं। मैं संभवतः पूर्वानुमानित नेटवर्क इंटरफ़ेस नामों का उपयोग करके vm को आज़माने और स्थानांतरित करने वाला पहला व्यक्ति नहीं हो सकता।

मैंने vm को बंद करने और माइग्रेट करने से पहले इन कमांड को चलाने की कोशिश की है

apt-get remove biosdevname -y;
ln -s /dev/null /etc/systemd/network/99-default.link;

मुझे पता है कि जब मैं वीएम को माइग्रेट करता हूं, तब भी /etc/network/interfacesऔर फिर ip addressभी देखेंens32


क्या आपने बहन की साइट पूछ हल करने की कोशिश की है? Askubuntu.com/a/785442/467355 - मूल रूप से udev नियम को मैन्युअल रूप से बनाते हैं, और संभवतः क्लोन करने के बाद (या प्रत्येक क्लोन के बाद इसे नया बनाने के लिए) नए मैक को सम्मिलित करने के लिए एक ही समय बूट स्क्रिप्ट का उपयोग करते हैं
MAN_l

हां, मैंने उस पर गौर किया। ये सामान्य सुनहरी छवियां हैं जो किसी के द्वारा भी उपयोग की जा सकती हैं, इसलिए मुझे समय से पहले मैक पते का पता नहीं है।
स्पूडर

यह संपूर्ण बिंदु है कि क्लोन के बाद (या प्रत्येक क्लोन के बाद इसे नया बनाने के लिए) इसमें नया मैक डालने के लिए एक सिंगल टाइम बूट स्क्रिप्ट का उपयोग करें - आप बूट इमेज पर एक नई बूट स्क्रिप्ट को सुनहरा छवि में सम्मिलित करते हैं। udev नियम के लिए सही मैक।
दानी_ल

जवाबों:


4

निश्चित रूप से यह एक समस्या है कि क्लाउड प्रदाता (एज़्योर, एडब्ल्यूएस, रैकस्पेस, ओपनस्टैक) पहले ही हल कर चुके हैं जब वे वीएमएस आयात करते हैं।

मुझे लगता है कि ओपनस्टैक क्लाउड-इनिट, कॉन्फ़िगड्राइव प्रारूप का उपयोग करता है, और एक नेटवर्क कॉन्फ़िगरेशन प्रदान करता है जो वीएम हार्डवेयर से मेल खाता है। सूत्रों का कहना है:

यदि आप पहली बूट स्क्रिप्ट से इंकार करते हैं, तो एक स्पष्ट उत्तर है।

पहले यह व्यावहारिक रूप से गारंटीकृत था कि एक एकल ईथरनेट कार्ड से लैस मेजबान केवल एक "eth0" इंटरफ़ेस था। इस नई योजना के साथ, एक प्रशासक को अब पहले यह जांचना होगा कि स्थानीय इंटरफ़ेस का नाम क्या है, इससे पहले कि वह इस पर आदेशों को लागू कर सके, जहां पहले उसके पास एक अच्छा मौका था कि "eth0" सही नाम था।

मुझे यह पसंद नहीं है, मैं इसे कैसे अक्षम करूं?

आपके पास मूल रूप से तीन विकल्प हैं:

  1. आप नियत नामों के असाइनमेंट को अक्षम करते हैं, ताकि अप्रत्याशित कर्नेल नामों का फिर से उपयोग किया जाए। इसके लिए, बस डिफ़ॉल्ट नीति के लिए udev की .link फ़ाइल को मास्क करें: ln -s / dev / null /etc/systemd/network/99-default.link

https://www.freedesktop.org/wiki/Software/systemd/PredictableNetworkInterfaceNames/

पुराने निरंतर इंटरफ़ेस नामों पर वापस लौटना दस्तावेज़ों में से एक विकल्प नहीं है।

अन्य विकल्प एक सेटअप है जहां नेटवर्क इंटरफेस डिफ़ॉल्ट रूप से सक्षम होते हैं, उनके सटीक नाम की परवाह किए बिना। मुझे लगता है कि NetworkManager डिफ़ॉल्ट रूप से इसका समर्थन करता है। systemd-networkd को ऐसा करने के लिए भी कहा जा सकता है

जैसे ही आपके पास VM के लिए एक से अधिक नेटवर्क उपकरण होते हैं, उन्हें संभवतः विशिष्ट कॉन्फ़िगरेशन की आवश्यकता होती है ...

वीएम के बाहर, नेटवर्क मैनजर-शैली दृष्टिकोण का एक स्पष्ट लाभ है: एक पीसी में कई नेटवर्क इंटरफेस हो सकते हैं, शायद विभिन्न प्रकार के, उनमें से केवल एक जुड़ा हुआ है। उदाहरण के लिए यह कुछ प्रीमियम मदरबोर्ड पर देखा जा सकता है, या एक ऐसी प्रणाली पर जहां पहले नेटवर्क इंटरफ़ेस वांछित के रूप में काम नहीं करता था और कुछ बिंदु पर एक दूसरा इंटरफ़ेस स्थापित किया गया था।


शानदार सुझाव। मुझे लगता है कि ln -s /dev/null /etc/systemd/network/99-default.linkकोई फर्क नहीं पड़ता है। मेरे vms अभी भी नए नामकरण सम्मेलन का उपयोग करते हैं।
00

3

मैंने सफाई से ऐसा करने की कोशिश की, और निम्नलिखित हैक के साथ आया। Vm को बंद करने और माइग्रेट करने से ठीक पहले निम्नलिखित स्क्रिप्ट को चलाने से, vm के पास नेटवर्क एडेप्टर के रूप में eth0 होगा जब इसे संचालित किया जाएगा।

ln -s /dev/null /etc/systemd/network/99-default.link;
echo '# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

source /etc/network/interfaces.d/*

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
auto eth0
iface eth0 inet dhcp
pre-up sleep 2' > /etc/network/interfaces

sed -i.bak 's/GRUB_CMDLINE_LINUX_DEFAULT=.*/GRUB_CMDLINE_LINUX_DEFAULT="net.ifnames=0 bios.devname=0 quiet"/' /etc/default/grub
update-grub
apt-get remove biosdevname -y || true;

कड़ाई से बोलना apt-get remove biosdevnameआवश्यक नहीं है, क्योंकि उस पैकेज को डिफ़ॉल्ट रूप से ubuntu 16.04 पर स्थापित नहीं किया गया है। इसके अलावा, जोड़ने bios.devname=0के लिए GRUB_CMDLINE_LINUX_DEFAULTकी आवश्यकता नहीं है क्योंकि biosdevname स्थापित नहीं है। यह भविष्य में कभी भी biosdevname स्थापित होने पर नेटवर्क को टूटने से रोकता है।


लिंक सेट करना और कर्नेल तर्क क्यों पारित करना? प्रलेखन में कहा गया है कि एक को पर्याप्त होना चाहिए। कर्सरी चेक से पता चलता है कि वास्तव में ऐसा ही है।
0xC0000022L

2

क्या आपको अनुमानित नेटवर्क इंटरफ़ेस नामों की आवश्यकता है?

मेरा समाधान अनइंस्टॉल करने के लिए किया गया है biosdevname, और जिसके कारण मज़बूती से हमेशा नेटवर्क इंटरफेस होते हैं जिनका नाम eth0, eth1 और इसी तरह होता है। मुझे अनुमान लगाने योग्य नेटवर्क इंटरफ़ेस नाम और न ही biosdevname स्थापित करने का एक अच्छा कारण नहीं मिला है।

में /etc/udev/rules.d/70-persistent-net.rulesहै, जहां आप संशोधित कर सकते हैं कि हार्डवेयर मैक एड्रेस को eth0, eth1, इत्यादि के नाम दिए गए हैं। मैं सामान्य रूप से इस फ़ाइल की सामग्री को हटाता हूं, इसे एक रिक्त फ़ाइल के रूप में सहेजता हूं, रिबूट करता हूं, फिर मेरे पास एक साफ स्लेट है जिसमें सही नेटवर्क एडेप्टर दिखाई दे रहे हैं ...

# This file was automatically generated by the /lib/udev/write_net_rules
# program,run by the persistent-net-generator.rules rules file.
#
# This file was automatically generated by the /lib/udev/write_net_rules
# program,run by the persistent-net-generator.rules rules file.
#
# You can modify it,as long as you keep each rule on a single
# line,and change only the value of the NAME= key.
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="xx:xx:xx:xx:xx:xx", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="xx:xx:xx:xx:xx:xx", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth*", NAME="eth1"

^ ^ जहां xx: xx: xx: xx: xx: xx आपके नेटवर्क एडेप्टर का अद्वितीय मैक पता है।

मुझे पता है कि आप इस फ़ाइल को हटाने का उल्लेख नहीं करते हैं, लेकिन मैं ऊपर दिए गए उदाहरण को पोस्ट नहीं करता हूं क्योंकि कम से कम Suse में यह है /lib/udev/write_net_rulesकि यह फ़ाइल बनाता है। इसलिए देखें कि क्या इस फ़ाइल पर वापस नज़र रखने से मदद मिलती है, यदि यह आपके वितरण पर लागू होता है तो आप अपनी समस्या को हल करने के लिए इसे संशोधित करने में सक्षम हो सकते हैं।

ध्यान दें कि यह मैं Suse संस्करण 11 से जानता हूं जो पुराने Init तरीका है, सिस्टमड से पहले। सुनिश्चित नहीं है कि यह सिस्टम के तहत लिनक्स के नवीनतम संस्करणों के लिए बदल गया है।


biosdevname को udev "buildin" net_id freedesktop.org/wiki/Software/systemd/…
sourcejedi

0

रैनबो इस अपग्रेड में रैनबो 14.04 होस्ट 16.04 पर चलता है। biosdevnameपैकेज तो का सहारा स्थापित नहीं है "biosdevname=0 net.ifnames=0"में /etc/default.grubके रूप में ओ पी ने कहा।

मैं इस स्क्रिप्ट को चलाता हूं, और अगर आउटपुट अच्छा दिखता है, /etc/udev/rules.d/70-persistent-net.rulesतो कर्नेल कभी भी एक अलग क्रम में ईथरनेट पोर्ट्स को एन्यूमरेट करने का फैसला करने के मामले में नए udv नियमों के निर्माण के लिए रीडायरेक्ट करता है।

#!/bin/bash
count=0

# build array of network devices starting with eth? from /proc
for dev in `cat /proc/net/dev | egrep 'eth.*:' | awk '{print $1};' | cut -d':' -f1 | sort`; do
   edev[$count]="$dev"
   let count="$count+1"
done

# use array to find mac address
for d in ${edev[@]}; do
   mac=`ip addr show "$d" | grep ether | awk '{print $2};'`
   if [ -n "$mac" ]; then
      echo "# mac for $d is $mac"
   fi 

   printf 'SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="%s", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth*", NAME="%s"\n' $mac $d
done
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.