让我解释一下我想做的事情:
- 我正在创建一个将安装在 SD 卡上的 Linux 发行版映像
- 将默认主机名设置为 myHostname.local
- 这一切都在我的本地网络上
如果我只有 1 个服务器,这没问题,但如果我运行另一个服务器,该怎么办?主机名如何工作,因为两个主机现在都是同一个名称。
- myHostname.local<--服务器 1
- myHostname.local<--服务器2
Avahi 是否提供动态更改主机名的方法?类似这样的方法:
- myHostname1.local<--服务器1
- myHostname2.local<--服务器2
有什么建议么?
答案1
Avahi 是 Zeroconf 协议的一个实现,在RFC6762,将其运行的计算机的主机名更改为其他主机名在末尾添加一个数字。
此反重复进程不会改变机器上的主机名(因此机器上运行的其他应用程序将看到并宣布相同的主机名),如果机器以不同的顺序启动,则它们可能会获得不同的主机名。
如果您追求主机名的一致性和稳定性,则此解决方案将不起作用。
有不同的解决方案可以为每台机器提供唯一的主机名:
- 修改部署过程,为每个安装赋予唯一的主机名(可以是手动干预),
- 用一个配置管理系统在初始部署后修改每个安装,
pwgen
让每台机器在第一次启动时(或者,如果机器上的存储是只读的,则在每次启动时)生成随机名称(例如使用密码生成器)。
最简单的解决方案应该是改变您的部署流程,但您可能在某些时候需要配置管理系统。
对于最后一种解决方案,我不建议在小型个人部署中使用它,因为与手动修改每台机器相比,您很可能要花费更多的时间来使其工作。还请注意,除了名称持久性之外,它几乎与您使用 avahi 已经拥有的一样。
答案2
使用avahi-utils
:
使用avahi-utils
(Debian),你可以编写一个 shell 脚本,通过以下方式扫描网络以查找重复项avahi-browse
命令(在所有网卡上进行网络连接*),然后通过设置主机名avahi-set-host-name
。
*: 一次在单个网络接口上执行此操作是不够的。一些设备实现了多 NIC 系统,其中设备可以同时连接到多个网络。这些 NIC 还可以彼此独立地断开/重新连接,您应该注意,它们可以独立于启动事件执行此操作。因此,启动/登录脚本无法解决您的问题。您需要一个在网络连接时触发的脚本:
以下是几种在网络连接时触发脚本的方法供您使用
此外,您可能希望将脚本设置为计时器,以扫描网络变化。还可以考虑在设备之间建立 Web 服务,以通知它们另一台设备已连接。