machine-id

machine-id:

  1. 相关文档:ubuntu-machine-id,debian-machine-id
  2. machine-id是新版本系统用于标识系统的标识符,用于标识系统自己
  3. 由于历史原因machine-id在linux内部有两种实现,分别为dbusmachine-id以及systemdmachine-id
  4. 为了解决兼容性的问题,dbus以及systemd都会尝试复制/读取对方的machine-id
  5. machine-id目前用于以下方面:

    1. 用于DHCP 主机标识符,申请ip地址
    2. GNOME配置id
    3. systemd-boot EFI引导配置id
    4. ...等一些没有通报的使用场景

​ 此外:在新版本的linux中(systemd)使用machine-id而不是传统mac地址来申请ip地址,因此单纯的clone虚拟机会导致ip重复的问题,目前主要有三个解决方案:

  1. 重新生成machine-id
  2. dhclient强制申请
  3. 临时停用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 

缺点:

  1. 这种方案基本上可以保证不出现machine-id的外部问题
  2. 但是machine-id是系统内部使用的,一般建议修改machine-id后需要立刻重启
  3. 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这种应急方案肯定是不行的,所以在生产环境中目前主要有以下两个比较合适的方案:

  1. 每次启动时自动刷新machine-id然后配合dhclient使用

    一般情况下足够使用,但是当虚拟机内部有程序依赖 machine-id时不适用

    此外频繁刷新machine-id可能会出现异常,这个需要实际场景测试

  2. 通过修改内核参数使得网卡名称固定为eth0/eth1/...格式,然后通过netplan配置文件写死通过mac申请dhcp

    这个方案理论上是最好的
  3. 其实还有一个歪门邪道:直接让dhcp服务器拒绝非mac地址申请ip
  4. openstack的使用场景中也可以考虑使用cloud-int 来固定网卡配置,从而避免dhcp的问题
Last modification:July 29, 2022
如果觉得我的文章对你有用,请随意赞赏