予測可能なネットワークインターフェイス名が原因でVMの移行が中断されることがある

予測可能なネットワークインターフェイス名が原因でVMの移行が中断されることがある

/etc/networking/interfaces「予測可能なネットワークインタフェース名」を使用するときにリセットする方法は?

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

  • eth0
  • eth1
  • eth2

ネットワークカードを交換したり、仮想マシンを新しいハイパーバイザーに移動したりすると、Linuxのインターフェース番号が増えます。削除すると、/etc/udev/rules.d/70-peristent-net.rulesLinuxを再利用できますeth0

Ubuntu 15.10以降を使用する '予測可能なネットワークインターフェイス名'。ネットワークアダプタ名はMACアドレスから派生します。

  • ens3
  • ens32
  • ens192

/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"命名規則に戻すためにgrubファイルを編集してみました。 /etc/network/interfacesは古い名前(eth0)を参照しますが、VMはIPを取得できず、再起動するとVMは新しい命名規則を使用します。また、保証できない限り、systemdが常に優先されることがわかりました。biosdevname=0 grub 構成に永続的に保持。これを永久に適用する方法がわかりません。

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

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

もちろん、クラウドプロバイダー(Azure、AWS、RackSpace、Openstack)は、仮想マシンをインポートするときにこの問題を解決しました。予測可能なネットワークインターフェイス名を使用してVMを移行する最初の人は、私にはなりません。

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

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

VMの移行時に/etc/network/interfacesまだip address参照していることがわかりました。ens32

答え1

もちろん、クラウドプロバイダー(Azure、AWS、RackSpace、Openstack)は、仮想マシンをインポートするときにこの問題を解決しました。

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つではありません。

別のオプションは、正確な名前に関係なく、デフォルトでネットワークインターフェイス設定を有効にすることです。 NetworkManagerは基本的にこれをサポートすると思います。 systemd-networkdにこれを行うように指示することもできます。

仮想マシンに複数のネットワークデバイスがある場合は、特定の設定が必要な場合があります。

VMに加えて、NetworkManagerスタイルのアプローチには明らかな利点があります。 PCにはさまざまな種類の複数のネットワークインターフェイスがありますが、それらの1つだけが接続されています。たとえば、一部の高度なマザーボードまたは最初のネットワークインターフェイスが期待どおりに機能せず、ある時点で2番目のインターフェイスがインストールされているシステムでこの現象が発生する可能性があります。

答え2

私はこれをきれいにする努力をあきらめ、次のトリックを思い出しました。 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にデフォルトでインストールされていないため、これは必要ありません。また、biosdevnameはインストールされていないため、bios.devname=0追加する必要はありません。GRUB_CMDLINE_LINUX_DEFAULT後で biosdevname をインストールすると、ネットワークの中断を防ぐことができます。

答え3

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

私の解決策は削除することでした。biosdevnameその結果、ネットワークインタフェース名は常にeth0、eth1などとして安定しています。予測可能なネットワークインターフェイス名またはbiosdevnameをインストールする必要がある妥当な理由が見つかりませんでした。

では、/etc/udev/rules.d/70-persistent-net.ruleseth0、eth1などのハードウェアMACアドレスを変更できます。私は通常ファイルの内容を削除し、空のファイルとして保存し、再起動すると正しいネットワークアダプタが表示されるきれいな状態になります。

# 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バージョンでは、これが変更されたかどうかはわかりません。

答え4

Ubuntu 14.04ホストを16.04にアップグレードするときにこの問題が発生しました。biosdevnameパッケージがインストールされていないため、"biosdevname=0 net.ifnames=0"OPの説明に従って使用してください。/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

関連情報