どうも、Tです。
DHCPでIPを配布しているvSphere環境でテンプレートからクローンしたUbuntu仮想マシンが同じIPアドレスを受け取ってしまう事象が発生したので備忘録です。
ここでの結論
- netpalnを使っている(Ubuntuなど)は、DHCPのIP取得にmachine-idを使う
- machine-idはクローンで同じ番号が設定される(変更されない)
- クローン済みの仮想マシンで解決するには、machine-idを再生成する
- テンプレートの仮想マシンのmachine-idは空にするか、DUIDにMACアドレスを使うように設定変更しておく
環境
- vcsa:7.0 Update2c 18356314
- Gest OS:Ubuntu 20.04.1 LTS
- DHCPサーバー:Windows Server 2019
問題
テンプレートからクローンしたUbuntu仮想マシンにDHCPから同じIPアドレスが設定される。
原因
原因は、Ubuntu(正確にはnetplan)は、DHCPでIPを取得する際にDUID(DHCP Unique Identifier)にMachine-idを使用するためです。Linuxのmachine-idはvSphereのクローン機能ではMACアドレスのように新しい番号を生成することはないため、同じmachine-idでクローンされます。
VMware社からもKB82229が公開されています。
解決方法
とりあえず試した解決方法です。
方法1.machine-idを再作成
「systemd-machine-id-setup」コマンドを実行してmachine-idを新しく再生成します。
#元のmachine-idを確認 kadmin@ubuntu03:/$ cat /etc/machine-id 7633515b79ae4aae988ac402e731f6a6 #machine-idファイルを削除 kadmin@ubuntu03:/$ sudo rm /etc/machine-id #machine-idを再作成 kadmin@ubuntu03:/$ sudo systemd-machine-id-setup Initializing machine ID from random generator. #再作成後のmachine-idを確認 kadmin@ubuntu03:/$ cat /etc/machine-id 68eb6ed196a5423d8e41f352294e791a
生成後、ネットワークサービスを再起動すると、重複しないIPアドレスを受け取るようになります。
kadmin@ubuntu03:/$ sudo systemctl restart systemd-networkd
方法2.machine-idを空にしておく(KB82229記載あり)
KB82229に記載のある方法です。machine-idを空にしておくことで再起動時に新しいmachine-idが再生成されるようです。注意点としては、echoコマンドがsudo suしている状態でないとpermissionではじかれてしました。
kadmin@ubuntu02:~$ sudo su [sudo] password for kadmin: #machine-idファイルを改行なしで空にする root@ubuntu02:/home/kadmin# echo -n > /etc/machine-id #/var/lib配下のmachine-idファイル(/etc/machine-idへのリンク)を削除して再作成する root@ubuntu02:/home/kadmin# rm /var/lib/dbus/machine-id root@ubuntu02:/home/kadmin# ln -s /etc/machine-id /var/lib/dbus/machine-id #machine-idの中身は空の状態 root@ubuntu02:/home/kadmin# cat /var/lib/dbus/machine-id root@ubuntu02:/home/kadmin# #OSを再起動する root@ubuntu02:/home/kadmin#sudo reboot
再起動後、新しいmachine-idが作成され、重複しないIPアドレスを受け取るようになります。
kadmin@ubuntu02:~$ cat /etc/machine-id 5c6c3eb364284aeaa639291a3f44e3de
方法3.DUIDにMACアドレスを使う(KB82229記載あり)
DUIDにmachine-idではなく、MACアドレスを使うように、NICの設定(netpaln)を変更する方法です。
DHCPで構成したとき、netplanの設定は下記のファイルがありました。
kadmin@ubuntu01:~$ ls -l /etc/netplan/ total 12 -rw-r--r-- 1 root root 117 Sep 20 13:40 00-installer-config.yaml -rw-r--r-- 1 root root 117 Sep 20 13:39 00-installer-config.yaml.BeforeVMwareCustomization -rw-r--r-- 1 root root 236 Sep 20 13:40 99-netcfg-vmware.yaml
クローン時のOSカスタマイズで設定されたであろう「99-netcfg-vmware.yaml」の中身は下記のようになっています。(vSphereのOSカスタマイズでDHCPにしています。)
kadmin@ubuntu01:~$ cat /etc/netplan/99-netcfg-vmware.yaml # Generated by VMWare customization engine. network: version: 2 renderer: networkd ethernets: ens160: dhcp4: yes dhcp4-overrides: use-dns: true dhcp6: yes dhcp6-overrides: use-dns: true
システムが生成したyamlをいじるのは避けたいので新しいyamlファイルを作成します。yamlはすべてのファイルをアルファベット順に読み込んでオーバーライドしていく仕様のため、99より後に読み込まれるように100で作成しました。
kadmin@ubuntu01:~$ sudo vi /etc/netplan/100-add-config-dhcp-duid.yaml
KBにある下記の設定を行います。yaml形式なのでインデントがずれると正常に反映されないためインデント位置に気を付けてください。match構文でeで始まるインターフェースに対して設定しています。dhcp-identifier: macがDUIDの指定です。
network: version: 2 renderer: networkd ethernets: default: match: name: e* dhcp4: yes dhcp-identifier: macで
defaultという構文を初めて見た・・・・ぱっと調べた感じでは明示的な意味でてこないので分かる人いたら教えてください。一応後で調べられるようにマニュアルだけ・・・。
yamlの設定を反映します。※SSHなどで接続している場合は、切断されます。
kadmin@ubuntu01:~$ sudo netplan apply
machine-idは同じままですが、DUIDにMACアドレスを使用しているため、重複しないIPアドレスが取得できました。
kadmin@ubuntu01:~$ cat /etc/machine-id 7633515b79ae4aae988ac402e731f6a6 kadmin@ubuntu01:~$ ip a s 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000 link/ether 00:50:56:9b:61:07 brd ff:ff:ff:ff:ff:ff inet 192.168.10.222/24 brd 192.168.10.255 scope global dynamic ens160 valid_lft 85980sec preferred_lft 85980sec inet6 fe80::250:56ff:fe9b:6107/64 scope link valid_lft forever preferred_lft forever
ちなみに
この問題は、Ubuntuだからではなく、netplan依存の問題のためUbuntu以外でも発生する可能性があります。
pthonOSでも類似の情報が公開されていました。
Debianは最近使っていませんが、どうなんだろう・・・・?ちょっと気になる情報は公開されています。
参考
まとめ
すでにクローンしてしまっている仮想マシンを修正するには、「方法1」でmachine-idの再作成。
テンプレートを準備する場合は、「方法2」でmachine-idを空の状態でシャットダウンしてテンプレート化するか「方法3」でDUIDをmacアドレスを使うように変更するになりそうです。
netplanのデフォルト動作的には方法2がいいけど、起動のたびにやるのが少し億劫なので、安牌案としては、方法3かなぁ・・・・。