Predictable Network Interface Names แบ่งการโยกย้าย vm


9

คุณจะรีเซ็ตอย่างไร/etc/networking/interfacesเมื่อใช้ "ชื่ออินเทอร์เฟซเครือข่ายที่คาดเดาได้"

Ubuntu รุ่นเก่ากว่า 15.10 ใช้ชื่ออะแดปเตอร์เครือข่ายเช่น:

  • eth0
  • eth1
  • eth2

การเปลี่ยนการ์ดเครือข่ายหรือย้าย vm ไปยังไฮเปอร์ไวเซอร์ใหม่จะทำให้ Linux เพิ่มหมายเลขอินเตอร์เฟซ การลบจะทำให้นำมาใช้ลินุกซ์ /etc/udev/rules.d/70-peristent-net.ruleseth0

Ubuntu 15.10 และใหม่กว่าใช้ ' Predictable Network Interface Names ' ชื่ออะแดปเตอร์เครือข่ายมาจากที่อยู่ mac

  • 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 / network / interfaces คืออะไร

ฉันต้องทำการกระทำนี้ก่อนที่จะปิด VM และโอนย้ายไปยังไฮเปอร์ไวเซอร์ใหม่ตั้งแต่ฉันใช้บรรจุหีบห่อเพื่อให้ภาพสีทองอัตโนมัติขึ้นอยู่กับพ่อครัว / เบนโตะภาพสีทอง

ฉันพบว่าการลบ / etc / network / interfaces ไม่ทำงานเนื่องจากไฟล์ไม่ได้ถูกสร้างใหม่โดยอัตโนมัติในการบูตครั้งถัดไปหลังจากการโยกย้าย

ฉันลองแก้ไขไฟล์ด้วงเพื่อเปลี่ยนกลับเป็นแบบแผนการตั้งชื่อ 'eth0' ในขณะที่ / etc / network / interfaces อ้างถึงชื่อเก่า (eth0), vm จะไม่ได้รับ ip และการรีบูตใด ๆ จะทำให้ vm ใช้หลักการตั้งชื่อใหม่ นอกจากนี้ผมได้พบ systemd มักจะมีความสำคัญถ้าฉันสามารถรับประกันได้อย่างถาวรยังคงอยู่ในการกำหนดค่าด้วงbiosdevname=0 ไม่แน่ใจว่าจะใช้สิ่งนี้อย่างถาวรได้อย่างไร

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

หากเป็นไปได้ฉันไม่ควรใช้ cloud init หรือใช้สคริปต์เริ่มต้นโพสต์ใด ๆ เนื่องจากฉันควรรักษาภาพสีทองให้สะอาดที่สุดเท่าที่จะทำได้

แน่นอนว่านี่เป็นปัญหาที่ผู้ให้บริการคลาวด์ (Azure, AWS, RackSpace, Openstack) ได้แก้ไขไปแล้วเมื่อพวกเขานำเข้า vms ฉันไม่สามารถเป็นคนแรกที่ลองและย้ายข้อมูล vm โดยใช้ชื่อเครือข่ายอินเทอร์เฟซที่คาดเดาได้

ฉันได้ลองใช้คำสั่งเหล่านี้ก่อนที่จะปิดและโยกย้าย vm

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

ฉันพบว่าเมื่อฉันย้าย vm นั้น/etc/network/interfacesและip addressยังคงหมายถึงens32


คุณลองวิธีแก้ปัญหาจากเว็บไซต์น้อง Askubuntu หรือไม่ askubuntu.com/a/785442/467355 - โดยทั่วไปสร้างกฎ udev ด้วยตนเองและอาจใช้สคริปต์บูตครั้งเดียวเพื่อแทรกแม็คใหม่ลงในมันหลังจากโคลน (หรือเพื่อสร้างใหม่หลังจากโคลนแต่ละครั้ง)
Dani_l

ใช่ฉันดูที่ ภาพเหล่านี้เป็นภาพทองคำทั่วไปที่ทุกคนสามารถใช้งานได้ดังนั้นฉันจึงไม่ทราบที่อยู่ mac ล่วงหน้า
spuder

นั่นคือจุดรวมของ "ใช้สคริปต์บูทครั้งเดียวเพื่อแทรกแม็คใหม่ลงในหลังโคลน (หรือเพื่อสร้างใหม่หลังจากการโคลนแต่ละครั้ง)" - คุณแทรกสคริปต์การบูตใหม่ลงในอิมเมจสีทองที่ใช้ในการสอบถามและใส่บูท แม็คที่ถูกต้องกับกฎ udev
Dani_l

คำตอบ:


4

แน่นอนว่านี่เป็นปัญหาที่ผู้ให้บริการคลาวด์ (Azure, AWS, RackSpace, Openstack) ได้แก้ไขไปแล้วเมื่อพวกเขานำเข้า vms

ฉันคิดว่า OpenStack ใช้รูปแบบคลาวด์ - เริ่ม, รูปแบบ ConfigDrive และให้การกำหนดค่าเครือข่ายที่ตรงกับฮาร์ดแวร์ VM แหล่งที่มา:

หากคุณแยกแยะสคริปต์บูตแรกมีคำตอบที่ชัดเจน

ก่อนหน้านี้มีการรับประกันว่าโฮสต์ที่ติดตั้งการ์ดอีเทอร์เน็ตเดียวมีอินเทอร์เฟซ "eth0" เพียงอันเดียว ด้วยรูปแบบใหม่นี้ผู้ดูแลระบบจะต้องตรวจสอบก่อนว่าชื่ออินเทอร์เฟซท้องถิ่นคืออะไรก่อนที่เขาจะสามารถเรียกใช้คำสั่งได้ก่อนหน้านี้เขามีโอกาสที่ดีที่ "eth0" เป็นชื่อที่ถูกต้อง

ฉันไม่ชอบสิ่งนี้ฉันจะปิดการใช้งานนี้ได้อย่างไร

คุณมีสามตัวเลือกโดยทั่วไป:

  1. คุณปิดใช้งานการมอบหมายชื่อคงที่ดังนั้นชื่อเคอร์เนลที่ไม่แน่นอนจะถูกใช้อีกครั้ง สำหรับสิ่งนี้เพียงแค่ปกปิดไฟล์. link ของ udev สำหรับนโยบายเริ่มต้น: ln -s / dev / null /etc/systemd/network/99-default.link

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

การสลับกลับไปเป็นชื่ออินเทอร์เฟซแบบถาวรเก่าไม่ใช่ตัวเลือกหนึ่งในเอกสาร

อีกทางเลือกหนึ่งคือการตั้งค่าที่เปิดใช้งานอินเทอร์เฟซเครือข่ายโดยไม่คำนึงถึงชื่อที่แน่นอน ฉันคิดว่า NetworkManager สนับสนุนสิ่งนี้เป็นค่าเริ่มต้น systemd-networkd นอกจากนี้ยังสามารถบอกให้ทำเช่นนี้

ทันทีที่คุณมีอุปกรณ์เครือข่ายมากกว่าหนึ่งรายการสำหรับ VM พวกเขาอาจต้องการการกำหนดค่าเฉพาะต่อไป ...

นอกเหนือจาก VM แล้วมีข้อได้เปรียบที่ชัดเจนของแนวทาง NetworkManager: พีซีอาจมีอินเตอร์เฟซเครือข่ายหลายประเภทอาจเป็นประเภทที่แตกต่างกันโดยมีเพียงหนึ่งการเชื่อมต่อเท่านั้น ตัวอย่างเช่นนี้สามารถเห็นได้ในเมนบอร์ดระดับพรีเมียมบางตัวหรือในระบบที่อินเตอร์เฟสเครือข่ายแรกไม่ทำงานตามที่ต้องการและมีการติดตั้งอินเทอร์เฟซที่สองในบางจุด


คำแนะนำที่ดี ฉันพบว่าln -s /dev/null /etc/systemd/network/99-default.linkไม่มีความแตกต่าง vms ของฉันยังคงใช้หลักการตั้งชื่อใหม่
spuder

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ที่ที่คุณสามารถแก้ไขสิ่งที่อยู่ฮาร์ดแวร์ของ Mac ได้รับการตั้งชื่อเพื่อ 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 เป็นที่อยู่ mac ที่ไม่ซ้ำกันของอะแดปเตอร์เครือข่ายของคุณ

ฉันรู้ว่าคุณพูดถึงการลบไฟล์นี้ไม่ใช่วิธีแก้ปัญหา แต่ฉันโพสต์ตัวอย่างข้างต้นเพราะอย่างน้อยก็ใน Suse มันเป็น/lib/udev/write_net_rulesไฟล์ที่สร้างขึ้น ดังนั้นดูว่าการติดตามกลับไปที่ไฟล์นี้ช่วยได้หรือไม่ถ้ามันใช้กับการแจกจ่ายของคุณคุณอาจสามารถแก้ไขเพื่อแก้ไขปัญหาของคุณได้

โปรดทราบว่านี่คือสิ่งที่ฉันรู้จาก Suse รุ่น 11 ซึ่งเป็นวิธี Init เก่าก่อน systemd ไม่แน่ใจว่าสิ่งนี้มีการเปลี่ยนแปลงสำหรับ linux เวอร์ชันล่าสุดภายใต้ systemd หรือไม่


biosdevname ถูกแทนที่ด้วย udev "builtin" net_id freedesktop.org/wiki/Software/systemd/…
sourcejedi

0

วิ่งเข้าไปในการอัพเกรด Ubuntu 14.04 โฮสต์นี้เป็น 16.04 biosdevnameไม่ได้ติดตั้งแพคเกจจึงใช้"biosdevname=0 net.ifnames=0"ใน/etc/default.grubตามที่ระบุโดย OP

ฉันรันสคริปต์นี้และถ้าผลลัพธ์ดูดีให้เปลี่ยนเส้นทางเอาต์พุตไป/etc/udev/rules.d/70-persistent-net.rulesเพื่อสร้างกฎ udev ใหม่ในกรณีที่เคอร์เนลเคยตัดสินใจที่จะระบุพอร์ตอีเธอร์เน็ตในลำดับที่แตกต่างกัน

#!/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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.