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


9

/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を使用してchef / bentoゴールデンイメージに基づいて自動ゴールデンイメージを作成しているため、vmをシャットダウンして新しいハイパーバイザーに移行する前に、このアクションを実行する必要があります。

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

grubファイルを編集して、「eth0」命名規則に戻しました。/ etc / network / interfacesは古い名前(eth0)を参照しますが、vmはipを取得せず、再起動すると、vmは新しい命名規則を使用します。またbiosdevname=0 、grub configに永続的に残ることが保証できない限り、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 addressそれでも参照しますens32


姉妹サイトaskubuntuからの解決策を試しましたか?askubuntu.com/a/785442/467355-基本的に手動でudevルールを作成し、1回限りの起動スクリプトを使用して、新しいMacをクローンの後に新しいMacを挿入します(または各クローンの後に新しいMacを作成します)
Dani_l

はい、見ました。これらは誰でも使用できる汎用のゴールデンイメージであるため、事前にMACアドレスがわかりません。
spuder 2017年

これが「1回の起動スクリプトを使用して、クローンの後に新しいMacを挿入する(または各クローンの後に新しいMacを作成する)」という要点です。新しいクエリをゴールデンイメージに挿入し、ブート時にクエリを実行して挿入します。 udevルールに対する正しいMac。
Dani_l 2017年

回答:


4

確かにこれは、クラウドプロバイダー(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番目のインターフェイスがどこかにインストールされたシステムで見られます。


素晴らしい提案。私はそれln -s /dev/null /etc/systemd/network/99-default.linkは違いを見つけません。私のVMはまだ新しい命名規則を使用しています。
スパー、

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 biosdevnameubuntu 16.04にはデフォルトでパッケージがインストールされていないため、このパッケージは必要ありません。また、biosdevnameがインストールされていないため、に追加bios.devname=0するGRUB_CMDLINE_LINUX_DEFAULT必要はありません。biosdevnameが将来的にインストールされる場合でも、ネットワークが切断されるのを防ぎます。


なぜリンク設定してカーネル引数を渡すのですか?ドキュメントには、1つで十分であると記載されています。Cursoryチェックは、それが事実であることを示唆しています。
0xC0000022L 2018

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アドレスです。

私はあなたがこのファイルを削除することが解決策ではないことを言及しているのを知っています、しかし私は上記の例を投稿し/lib/udev/write_net_rulesます。したがって、このファイルへのバックトラッキングが役立つかどうかを確認してください。ディストリビューションに適用できる場合は、問題を解決するためにファイルを変更できる可能性があります。

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


biosdevnameはnet_idと「組み込み」のudevによって取って代わられるfreedesktop.org/wiki/Software/systemd/...
sourcejedi

0

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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.