machine-id
machine-id:
- 相关文档:ubuntu-machine-id,debian-machine-id
machine-id
是新版本系统用于标识系统的标识符,用于标识系统自己- 由于历史原因
machine-id
在linux内部有两种实现,分别为dbus
的machine-id
以及systemd
的machine-id
- 为了解决兼容性的问题,
dbus
以及systemd
都会尝试复制/读取对方的machine-id
machine-id
目前用于以下方面:- 用于DHCP 主机标识符,申请ip地址
GNOME
配置idsystemd-boot EFI
引导配置id- ...等一些没有通报的使用场景
此外:在新版本的linux中(systemd
)使用machine-id而不是传统mac地址来申请ip地址,因此单纯的clone虚拟机会导致ip重复的问题,目前主要有三个解决方案:
- 重新生成
machine-id
- dhclient强制申请
- 临时停用
machine-id
0x1 重新生成 machine-id
- 最粗暴的方案就是每次启动时重新生成machind-id
- 可以写到rc.local启动脚本里
- 生成machine后建议重新dhclient
rm /etc/machine-id /var/lib/dbus/machine-id
dbus-uuidgen --ensure
systemd-machine-id-setup
dhclient -r
dhclient
缺点:
- 这种方案基本上可以保证不出现machine-id的外部问题
- 但是machine-id是系统内部使用的,一般建议修改machine-id后需要立刻重启
- ps:官方建议
machine-id
应该离线修改
0x2 使用mac申请ip
- 参考链接
- 主要是修改netplan配置文件强制使用mac申请
- netplan配置如下
- 注意:不是所有的操作系统都是遵守这个约定
network:
version: 2
ethernets:
enp3s0:
dhcp4: yes
dhcp-identifier: mac
0x3 dhclient手动管理
- 这个办法只是暂时的
- 本质上还是依靠machineid申请ip
- 不能相信dhcp每次都能发现ip冲突
- 建议救急使用
- 大量压力测试下还是会出现ip重复/获取不到ip的问题,这个时候会卡死
#!/bin/bash
# 等待10秒
sleep 10
# 释放所有ip
dhclient -r
# 根据mac重新申请ip地址
dhclient
0x4 停用
使用如下指令停用machineid是比较缓和的办法
truncate -s 0 /etc/machine-id # 或者 echo -n /etc/machine-id
- 不能删除文件,这会导致一些异常
- 注意:不是所有的操作系统都是遵守这个约定,有的操作系统会尝试恢复原始的
machine-id
0x5 解决方案
在实际应用场景中常常涉及到虚拟机模板批量创建实例,这个时候其实必须要一个稳定的方案,依赖dhclient
这种应急方案肯定是不行的,所以在生产环境中目前主要有以下两个比较合适的方案:
每次启动时自动刷新
machine-id
然后配合dhclient使用一般情况下足够使用,但是当虚拟机内部有程序依赖 machine-id时不适用
此外频繁刷新machine-id可能会出现异常,这个需要实际场景测试
通过修改内核参数使得网卡名称固定为
eth0/eth1/...
格式,然后通过netplan
配置文件写死通过mac申请dhcp这个方案理论上是最好的
- 其实还有一个歪门邪道:直接让dhcp服务器拒绝非mac地址申请ip
- openstack的使用场景中也可以考虑使用cloud-int 来固定网卡配置,从而避免dhcp的问题