Nama Antarmuka Jaringan yang Dapat Diprediksi merusak migrasi


9

Bagaimana Anda mengatur ulang /etc/networking/interfacessaat menggunakan "nama antarmuka jaringan yang dapat diprediksi"?

Versi Ubuntu yang lebih tua dari 15,10 menggunakan nama adaptor jaringan seperti:

  • eth0
  • eth1
  • eth2

Mengganti kartu jaringan, atau memindahkan vm ke hypervisor baru, akan menyebabkan Linux menambah nomor antarmuka. Menghapus /etc/udev/rules.d/70-peristent-net.rulesakan membuat Linux digunakan kembali eth0.

Ubuntu 15.10 dan yang lebih baru menggunakan ' Nama Antarmuka Jaringan yang Dapat Diprediksi '. Nama adaptor jaringan berasal dari alamat mac.

  • ens3
  • ens32
  • ens192

Saat memigrasi vm, jaringan tidak akan mulai karena /etc/network/interfacesmasih referensi adaptor jaringan lama yang tidak ada.

# 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

Apa cara terbaik untuk mereset file / etc / network / interfaces?

Saya perlu melakukan tindakan ini sebelum mematikan vm dan bermigrasi ke hypervisor baru karena saya menggunakan packer untuk membuat gambar emas otomatis, berdasarkan gambar koki / emas bento .

Saya menemukan menghapus / etc / network / interfaces tidak berfungsi karena file tidak secara otomatis dibuat ulang pada boot berikutnya setelah migrasi.

Saya sudah mencoba mengedit file grub saya untuk kembali ke konvensi penamaan 'eth0'. Sementara / etc / network / interfaces merujuk ke nama lama (eth0), vm tidak akan mendapatkan ip, dan setiap reboot akan menyebabkan vm menggunakan konvensi penamaan yang baru. Saya juga menemukan systemd akan selalu diutamakan kecuali saya bisa menjamin biosdevname=0 secara permanen tetap di konfigurasi grub . Tidak yakin bagaimana cara menerapkan ini secara permanen

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

Jika memungkinkan, saya lebih suka tidak menggunakan cloud init atau menggunakan skrip startup posting karena saya lebih suka menjaga gambar emas sebersih mungkin.

Tentunya ini adalah masalah yang penyedia cloud (Azure, AWS, RackSpace, Openstack) telah dipecahkan ketika mereka mengimpor vms. Saya tidak mungkin menjadi orang pertama yang mencoba dan memigrasi vm menggunakan nama antarmuka jaringan yang dapat diprediksi.

Saya sudah mencoba menjalankan perintah ini sebelum mematikan dan memigrasi vm

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

Saya menemukan ketika saya memigrasi vm, itu /etc/network/interfacesdan ip addressmasih merujukens32


Apakah Anda mencoba solusi dari situs saudara askubuntu? askubuntu.com/a/785442/467355 - pada dasarnya membuat aturan udev secara manual, dan mungkin menggunakan skrip boot waktu tunggal untuk memasukkan mac baru ke dalamnya setelah klon (atau untuk membuatnya segar setelah setiap klon)
Dani_l

Ya, saya memang melihatnya. Ini adalah gambar emas umum yang dapat digunakan oleh siapa saja jadi saya tidak tahu alamat mac sebelumnya.
Pengamen

Itulah inti dari "gunakan skrip boot waktu tunggal untuk memasukkan mac baru ke dalamnya setelah klon (atau untuk membuatnya segar setelah setiap klon)" - Anda memasukkan skrip boot baru ke gambar emas yang pada permintaan boot dan menyisipkan mac yang benar untuk aturan udev.
Dani_l

Jawaban:


4

Tentunya ini adalah masalah yang penyedia cloud (Azure, AWS, RackSpace, Openstack) telah dipecahkan ketika mereka mengimpor vms.

Saya pikir OpenStack menggunakan cloud-init, format ConfigDrive, dan menyediakan konfigurasi jaringan yang cocok dengan perangkat keras VM. Sumber:

Jika Anda mengesampingkan skrip boot pertama, ada satu jawaban yang jelas.

Sebelumnya secara praktis dijamin bahwa host yang dilengkapi dengan kartu ethernet tunggal hanya memiliki antarmuka "eth0" tunggal. Dengan skema baru ini, administrator sekarang harus memeriksa terlebih dahulu apa nama antarmuka lokal sebelum ia dapat memanggil perintah di mana sebelumnya ia memiliki peluang bagus bahwa "eth0" adalah nama yang tepat.

Saya tidak suka ini, bagaimana cara menonaktifkan ini?

Anda pada dasarnya memiliki tiga opsi:

  1. Anda menonaktifkan penetapan nama tetap, sehingga nama kernel yang tidak dapat diprediksi digunakan lagi. Untuk ini, cukup sembunyikan file .link udev untuk kebijakan default: ln -s / dev / null /etc/systemd/network/99-default.link

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

Beralih kembali ke nama antarmuka persisten lama bukanlah salah satu opsi yang didokumentasikan.

Alternatif lainnya adalah pengaturan di mana antarmuka jaringan diaktifkan secara default, apa pun namanya. Saya pikir NetworkManager mendukung ini secara default. systemd-networkd juga dapat diberitahu untuk melakukan ini .

Segera setelah Anda memiliki lebih dari satu perangkat jaringan untuk VM, mereka mungkin memerlukan konfigurasi khusus ...

Di luar VM, ada satu keuntungan nyata dari pendekatan gaya NetworkManager: PC mungkin memiliki beberapa antarmuka jaringan, mungkin dari jenis yang berbeda, dengan hanya satu dari mereka yang terhubung. Misalnya ini dapat dilihat pada beberapa motherboard premium, atau pada sistem di mana antarmuka jaringan pertama tidak berfungsi seperti yang diinginkan dan antarmuka kedua dipasang di beberapa titik.


Saran yang bagus. Saya menemukan bahwa ln -s /dev/null /etc/systemd/network/99-default.linktidak ada bedanya. VMS saya masih menggunakan konvensi penamaan baru.
Spuder

3

Saya menyerah untuk mencoba melakukan ini dengan bersih, dan muncul dengan retasan berikut. Dengan menjalankan skrip berikut tepat sebelum mematikan vm dan memigrasi, vm akan memiliki eth0 sebagai adaptor jaringan saat dinyalakan.

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;

Sebenarnya, apt-get remove biosdevnametidak diperlukan karena paket itu tidak diinstal secara default di ubuntu 16.04. Juga, menambahkan bios.devname=0ke GRUB_CMDLINE_LINUX_DEFAULTtidak diperlukan karena biosdevname tidak diinstal. Itu mencegah jaringan dari melanggar jika biosdevname pernah diinstal di masa depan.


Mengapa mengatur tautan dan meneruskan argumen kernel? Dokumentasi menyatakan seseorang harus cukup. Pemeriksaan sepintas menunjukkan bahwa memang itulah masalahnya.
0xC0000022L

2

Apakah Anda memerlukan nama antarmuka jaringan yang dapat diprediksi?

Solusi saya adalah meng-uninstall biosdevname, dan yang andal mengakibatkan selalu memiliki antarmuka jaringan yang dinamai eth0, eth1, dan sebagainya. Saya belum menemukan alasan yang baik untuk menginstal nama antarmuka jaringan atau biosdevname yang dapat diprediksi.

di /etc/udev/rules.d/70-persistent-net.rulessinilah Anda dapat mengubah alamat mac perangkat keras apa yang dinamai dengan eth0, eth1, dan sebagainya. Saya biasanya menghapus isi file ini, menyimpannya sebagai file kosong, reboot, lalu saya memiliki catatan bersih dengan adapter jaringan yang benar muncul ...

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

^^ di mana xx: xx: xx: xx: xx: xx adalah alamat mac unik adapter jaringan Anda.

Saya tahu Anda menyebutkan menghapus file ini bukan solusinya, tetapi saya memposting contoh di atas karena setidaknya di Suse itu /lib/udev/write_net_rulesyang membuat file ini. Jadi lihat apakah pelacakan kembali ke file ini membantu, jika ini berlaku untuk distribusi Anda, Anda mungkin dapat memodifikasinya untuk menyelesaikan masalah Anda.

perhatikan ini yang saya tahu dari Suse versi 11 yang merupakan cara lama Init, sebelum systemd. Tidak yakin apakah ini telah berubah untuk versi terbaru linux di bawah systemd.


biosdevname diawasi oleh udev "builtin" net_id freedesktop.org/wiki/Software/systemd/…
sourcejedi

0

Berlari ke pembaruan Ubuntu 14.04 host ini menjadi 16.04. biosdevnamepaket tidak diinstal sehingga terpaksa "biosdevname=0 net.ifnames=0"di /etc/default.grubseperti yang dinyatakan oleh OP.

Saya menjalankan skrip ini, dan jika output terlihat bagus, arahkan kembali output ke /etc/udev/rules.d/70-persistent-net.rulesuntuk membangun aturan udev baru jika seandainya kernel memutuskan untuk menyebutkan port ethernet dalam urutan yang berbeda.

#!/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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.