Öngörülebilir Ağ Arabirimi Adları, vm geçişini bozar


9

/etc/networking/interfaces"Öngörülebilir ağ arayüzü adları" kullanırken nasıl sıfırlanırsınız ?

Ubuntu'nun 15.10'dan eski sürümleri aşağıdaki gibi ağ bağdaştırıcısı adları kullanır:

  • eth0
  • eth1
  • eth2

Ağ kartını değiştirmek veya vm'yi yeni bir hipervizöre taşımak, Linux'un arabirim numarasını artırmasına neden olur. Silme /etc/udev/rules.d/70-peristent-net.rulesLinux'un yeniden kullanılmasını sağlar eth0.

Ubuntu 15.10 ve daha yeni sürümlerde ' Öngörülebilir Ağ Arabirimi Adları ' kullanılır. Ağ bağdaştırıcısının adı mac adresinden türetilir.

  • ens3
  • ens32
  • ens192

Bir vm taşınırken, /etc/network/interfaceshala var olmayan eski ağ bağdaştırıcısına başvurduğundan ağ başlatılmaz .

# 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 dosyasını sıfırlamanın en iyi yolu nedir?

Şef / bento altın görüntülerine dayalı otomatik altın görüntüler yapmak için packer kullandığım için vm'yi kapatmadan ve yeni bir hipervizöre geçmeden önce bu eylemi yapmam gerekiyor .

Dosya taşıma işleminden sonra bir sonraki önyüklemede otomatik olarak yeniden oluşturulmadığından / etc / network / arabirimlerinin silinmesinin çalışmadığını gördüm.

Grub dosyamı 'eth0' adlandırma kuralına geri dönmek için düzenlemeyi denedim. / Etc / network / arabirimleri eski adı (eth0) ifade ederken, vm bir ip almaz ve herhangi bir yeniden başlatma vm'nin yeni adlandırma kuralını kullanmasına neden olur. Ayrıca ben biosdevname=0 grub yapılandırma kalıcı olarak kalmasını garanti sürece sürece systemd her zaman öncelik alacak buldum . Bunu kalıcı olarak nasıl uygulayacağınızdan emin değilim

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

Mümkünse, altın görüntüleri olabildiğince temiz tutmayı tercih ettiğim için bulut init'i veya herhangi bir başlangıç ​​sonrası komut dosyası kullanmayı tercih etmem.

Şüphesiz bu, bulut sağlayıcılarının (Azure, AWS, RackSpace, Openstack) vms içe aktarırken zaten çözdüğü bir sorundur. Tahmin edilebilir ağ arabirimi adlarını kullanarak bir vm'yi deneyen ve geçiren ilk kişi olamıyorum.

Kapatmadan ve vm'yi taşımadan önce bu komutları çalıştırmayı denedim

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

Ben vm göç zaman bulmak /etc/network/interfacesve ip addresshala bakınens32


Kardeş siteden askubuntu çözümü denediniz mi? askubuntu.com/a/785442/467355 - temel olarak manuel olarak udev kuralını oluşturun ve muhtemelen yeni
mac'u

Evet, ona baktım. Bunlar, herkes tarafından kullanılabilen genel altın görüntülerdir, bu yüzden önceden mac adresini bilmiyorum.
spuder

"Klondan sonra yeni mac'u eklemek için (veya her klondan sonra yeni oluşturmak için) tek seferlik bir önyükleme komut dosyası kullanın" - bu, önyükleme sorgularının ardından eklediğiniz altın görüntüye yeni bir önyükleme komut dosyası eklersiniz udev kuralı için doğru mac.
Dani_l

Yanıtlar:


4

Şüphesiz bu, bulut sağlayıcılarının (Azure, AWS, RackSpace, Openstack) vms içe aktarırken zaten çözdüğü bir sorundur.

OpenStack'ın bulut init, ConfigDrive biçimini kullandığını ve VM donanımıyla eşleşen bir ağ yapılandırması sağladığını düşünüyorum. Kaynaklar:

İlk önyükleme komut dosyasını devre dışı bırakırsanız, açık bir yanıt vardır.

Önceden, tek bir ethernet kartı ile donatılmış ana makinelerin sadece tek bir "eth0" arayüzüne sahip oldukları neredeyse garanti ediliyordu. Bu yeni şema uygulandığında, bir yöneticinin, daha önce "eth0" ın doğru ad olduğu konusunda iyi bir şansı olduğu yerlerde komutları çağırmadan önce yerel arayüz adının ne olduğunu kontrol etmesi gerekiyor.

Bunu sevmedim, bunu nasıl devre dışı bırakabilirim?

Temel olarak üç seçeneğiniz vardır:

  1. Öngörülemeyen çekirdek adlarının tekrar kullanılması için sabit adların atanmasını devre dışı bırakırsınız. Bunun için, varsayılan politika için udev'in .link dosyasını maskeleyin: ln -s / dev / null /etc/systemd/network/99-default.link

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

Eski kalıcı arabirim adlarına geri dönmek, belgelenen seçeneklerden biri değildir.

Diğer alternatif, ağ adlarının tam adlarına bakılmaksızın varsayılan olarak etkinleştirildiği bir kurulumdur. NetworkManager'ın bunu varsayılan olarak desteklediğini düşünüyorum. systemd-networkd de bunu yapması söylenebilir .

Bir VM için birden fazla ağ cihazınız olduğunda, muhtemelen yine de belirli bir yapılandırmaya ihtiyaç duyarlar ...

VM'lerin dışında, NetworkManager tarzı yaklaşımın bariz bir avantajı vardır: Bir PC'nin, belki de farklı türlerden olmak üzere, sadece bir tanesi bağlı olan birden fazla ağ arabirimi olabilir. Örneğin bu, bazı premium anakartlarda veya ilk ağ arayüzünün istendiği gibi çalışmadığı ve bir noktada ikinci bir arayüzün kurulduğu bir sistemde görülebilir.


Harika öneriler. ln -s /dev/null /etc/systemd/network/99-default.linkFark etmez buluyorum . vms'm hala yeni adlandırma kuralını kullanıyor.
17'de spuder

3

Bunu temiz yapmaya çalışmaktan vazgeçtim ve aşağıdaki hack ile geldim. Vm'yi kapatmadan ve geçirmeden hemen önce aşağıdaki komut dosyasını çalıştırarak, vm açıldığında ağ bağdaştırıcısı olarak eth0'a sahip olur.

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;

Açıkçası, apt-get remove biosdevnamebu paket ubuntu 16.04'te varsayılan olarak yüklenmediğinden gerekli değildir. Ayrıca, ekleme bios.devname=0için GRUB_CMDLINE_LINUX_DEFAULTbiosdevname kurulu olmadığı için gerekli değildir. Gelecekte biosdevname kurulursa ağın kesilmesini önler.


Neden linki ayarı ve çekirdek argüman geçirerek? Dokümantasyon, kişinin yeterli olması gerektiğini belirtir. Cursory check, durumun böyle olduğunu gösteriyor.
0xC0000022L

2

Öngörülebilir ağ arayüzü adlarına mı ihtiyacınız var?

Benim çözümüm kaldırmak oldu biosdevnameve bu her zaman eth0, eth1, vb adında ağ arayüzlerine sahip olmakla sonuçlandı. Öngörülebilir ağ arabirimi adları veya biosdevname yüklü olması için iyi bir neden bulamadım.

içinde /etc/udev/rules.d/70-persistent-net.rulesdonanım mac adresi eth0, eth1 için adlandırılmış ve benzeri Nelerin değiştirebilir yerdir. Normalde bu dosyanın içeriğini silerim, boş bir dosya olarak kaydederim, yeniden başlatırım, sonra doğru ağ bağdaştırıcılarının göründüğü temiz bir sayfa var ...

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

^^ burada xx: xx: xx: xx: xx: xx, ağ bağdaştırıcılarınızın benzersiz mac adresidir.

Bu dosyayı silmenin çözüm olmadığını belirttiğinizi biliyorum, ama en azından Suse'de /lib/udev/write_net_rulesbu dosyayı oluşturduğu için yukarıdaki örneği gönderiyorum . Bu nedenle, bu dosyaya geri izlemenin yardımcı olup olmadığına bakın, dağıtımınız için geçerliyse, sorununuzu çözmek için değiştirebilirsiniz.

Bu sistemd önce eski Init yolu olan Suse sürüm 11 ne biliyorum olduğunu unutmayın. Bunun systemd altındaki linux'un en son sürümleri için değişip değişmediğinden emin değilim.


biosdevname, udev "builtin" tarafından üstlendi net_id freedesktop.org/wiki/Software/systemd/…
sourcejedi

0

Bu yükseltme Ubuntu 14.04 ana bilgisayarlarıyla 16.04'e koştu. biosdevnamepaket böylece başvurdu yüklü olmadığı "biosdevname=0 net.ifnames=0"içinde /etc/default.grubOP tarafından belirtildiği gibi.

Bu komut dosyasını çalıştırıyorum ve çıktı iyi görünüyorsa /etc/udev/rules.d/70-persistent-net.rules, çekirdeğin farklı bir sırayla ethernet bağlantı noktalarını numaralandırmaya karar vermesi durumunda çıktıyı yeni udev kuralları oluşturmak üzere yeniden yönlendirin .

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