web-dev-qa-db-ja.com

予測可能なネットワークインターフェイス名がVMの移行を中断する

「予測可能なネットワークインターフェイス名」を使用する場合、/etc/networking/interfacesをどのようにリセットしますか?

15.10より前のバージョンのUbuntuでは、次のようなネットワークアダプター名を使用しています。

  • eth0
  • eth1
  • eth2

ネットワークカードを交換したり、VMを新しいハイパーバイザーに移動したりすると、Linuxはインターフェイス番号を増加させます。 /etc/udev/rules.d/70-peristent-net.rulesを削除すると、Linuxはeth0を再利用します。

Ubuntu 15.10以降では、「 予測可能なネットワークインターフェイス名 」を使用します。ネットワークアダプター名は、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ファイルをリセットする最良の方法は何ですか?

packer を使用しているため、VMをシャットダウンして新しいハイパーバイザーに移行する前にbeforeこのアクションを実行する必要があります chef/bento ゴールデンイメージに基づく自動ゴールデンイメージ。

移行後の次の起動時にファイルが自動的に再生成されないため、/ etc/network/interfacesを削除しても機能しないことがわかりました。

Grubファイルを編集して、「eth0」命名規則に戻しました。/etc/network/interfacesは古い名前(eth0)を参照しますが、vmはipを取得せず、再起動すると、vmは新しい命名規則を使用します。また、biosdevname=0永久にgrub構成に残る を保証できない限り、systemdが常に優先されることもわかりました。これを永続的に適用する方法がわからない

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

可能であれば、ゴールデンイメージをできるだけクリーンに保つため、クラウドの初期化や起動後のスクリプトは使用しません。

確かにこれは、クラウドプロバイダー(Azure、AWS、RackSpace、Openstack)がVMをインポートするときにすでに解決している問題です。私は、予測可能なネットワークインターフェイス名を使用してVMを移行しようとする最初の人になることはできません。

VMをシャットダウンして移行する前に、これらのコマンドを実行してみました

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

VMを移行したときに、/etc/network/interfacesip addressens32を参照していることがわかりました

9
spuder

私はこれをきれいにしようとあきらめ、次のハックを思いつきました。 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が将来的にインストールされる場合でも、ネットワークが切断されるのを防ぎます。

3
spuder

確かにこれは、クラウドプロバイダー(Azure、AWS、RackSpace、Openstack)がVMをインポートするときにすでに解決している問題です。

OpenStackはcloud-init、ConfigDrive形式を使用し、VMハードウェアと一致するネットワーク構成を提供します。ソース:

初回起動スクリプトを除外する場合、明確な答えが1つあります。

以前は、単一のイーサネットカードを備えたホストが単一の「eth0」インターフェースしか持たないことが実際に保証されていました。この新しいスキームが導入されたため、管理者は、以前に「eth0」が正しい名前である可能性が高かったコマンドを呼び出す前に、ローカルインターフェース名を最初に確認する必要があります。

気に入らないのですが、どうすれば無効にできますか?

基本的に3つのオプションがあります。

  1. 固定名の割り当てを無効にして、予測できないカーネル名が再び使用されるようにします。そのためには、デフォルトポリシーのudevの.linkファイルをマスクします。ln -s/dev/null /etc/systemd/network/99-default.link

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

古い永続的なインターフェイス名に戻すことは、文書化されているオプションの1つではありません。

もう1つの方法は、正確な名前に関係なく、ネットワークインターフェイスがデフォルトで有効になっているセットアップです。 NetworkManagerはデフォルトでこれをサポートしていると思います。 systemd-networkdでもこれを行うように指示できます

VMに複数のネットワークデバイスがあるとすぐに、おそらく特定の構成が必要になります...

VM以外では、NetworkManagerスタイルのアプローチには明らかな利点が1つあります。PCには、おそらく異なるタイプの複数のネットワークインターフェイスがあり、そのうちの1つだけが接続されている場合があります。たとえば、これは一部のプレミアムマザーボード、または最初のネットワークインターフェイスが期待どおりに動作せず、2番目のインターフェイスがどこかにインストールされたシステムで見られます。

4
sourcejedi

予測可能なネットワークインターフェイス名が必要ですか?

私の解決策は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であるため、上の例を投稿します。そのため、このファイルへのバックトラッキングが役立つかどうかを確認してください。ディストリビューションに適用できる場合は、問題を解決するためにファイルを変更できる可能性があります。

これは、systemdの前の古いInit方法であるSuseバージョン11から知っていることです。 systemdの下の最新バージョンのlinuxでこれが変更されたかどうかはわかりません。

2
ron

このアップグレードUbuntu 14.04ホストを16.04に実行しました。 biosdevnameパッケージがインストールされていないため、OPで述べられているように"biosdevname=0 net.ifnames=0"/etc/default.grubを使用しています。

このスクリプトを実行し、出力に問題がない場合は、カーネルがイーサネットポートを別の順序で列挙することを決定した場合に備えて、出力を/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
0
Server Fault