背景:
我正在创建一个 RHEL6 OS 磁盘映像,该映像可能会被传递给许多具有相同硬件(序列号除外,如 MAC)的不同计算机。该映像是预先配置的,并在系统设置后复制。(因此无需首次启动等。)将映像放在硬盘上后,该硬盘可能会放在多台不同的计算机上。
我希望创建的所有网络接口都命名为 eth0,无论 MAC 是什么。我已删除/修改了持久网络 udev 规则,以确保可用的单个网络接口名为 eth0。(使用持久网络 udev 规则,当驱动器在计算机之间传递时,eth* 将继续计数。)因此,这是可行的。
问题陈述:
我还希望所有这些计算机都使用静态 IP 地址。即使没有有效的网络连接到计算机,我也需要分配 IP 地址。我已修改 ifcfg-eth0 来设置 IP 地址,但这取决于 MAC,因此当我将磁盘移动到另一台计算机时它不起作用。(据我所知,NetworkManager 也取决于 MAC。)
如果 ifcfg-eth0 文件没有 HWADDR 行,那么它在计算机之间移动时可以正常工作。我在 udev 规则的末尾添加了一个 RUN 命令来运行一个脚本,该脚本将从 ifcfg-eth0 中删除 HWADDR 行,但这并不奏效,因为我很确定文件系统在 udev 期间以只读方式挂载,因此它实际上无法修改 ifcfg-eth0。
我希望计算机上的单个网络接口在启动时显示一个预先指定的 IP 地址,无论当前 MAC 是什么。我认为我已经非常接近了,但我似乎无法想出最后的办法来强制它将 IP 地址分配给任何可用的接口。
编辑:
ifcfg-eth0:
DEVICE=eth0
IPADDR=10.10.10.10
BROADCAST=10.10.10.255
ONBOOT=yes
NAME=eth0
BOOTPROTO=none
NETMASK=255.255.255.0
TYPE=Ethernet
HWADDR=##:##:##:##:##:##
IPV6INIT=no
USERCTL=no
NM_CONTROLLED=no
如果 HWADDR 行与当时计算机中的 MAC 匹配,则没有问题。但如果 HWADDR 行不匹配,内核会在启动时发出抱怨:
Bringing up interface eth0: Device eth0 has different MAC address than expected, ignoring. [FAILED]
如果启动时没有 HWADDR 行,它可以正常工作,但它会在某个时候自动填充该行,因此下次移动驱动器时它将无法工作。我曾想过在 udev 启动时使用 sed 并删除 HWADDR 行,但由于只读文件系统,我认为这实际上不是一个好主意(或不会起作用)。
答案1
设置文件的不可变位,以使其无法被修改(无需删除该位):
chattr +i /etc/sysconfig/network-scripts/ifcfg-eth0