我正在尝试使用 NetworkManager 1.42 在 RHEL9 服务器上配置网络。我通过按照
here将一堆密钥文件写到
/etc/NetworkManager/system-connections
来做到这一点。
我运行的服务器有一个怪癖,这是在 chroot 环境中完成的(遗憾的是这是不可避免的,因为它是作为操作系统升级的一部分运行的),所以我在写入密钥文件后无法运行
nmcli connection reload
。尽管如此,我希望重新启动整个机器就足以让 NetworkManager 重新加载连接。
这是我写入的文件
/etc/NetworkManager/system-connections/ethMgmt
:
[connection]
id=ethMgmt
type=ethernet
interface-name=ethMgmt
autoconnect=true
[ethernet]
mac-address=00:0d:3a:aa:97:31
[ipv4]
method=manual
address1=10.60.4.101/27,10.60.4.97
[ipv6]
method=disabled
然后重新启动后,我可以看到连接已被读取,但已经创建了其他几个连接:
$ nmcli -f TYPE,FILENAME,NAME connection
TYPE FILENAME NAME
loopback /run/NetworkManager/system-connections/lo.nmconnection lo // green - connected
ethernet /run/NetworkManager/system-connections/ethMgmt.nmconnection ethMgmt // green - connected
ethernet /etc/NetworkManager/system-connections/ethMgmt.nmconnection ethMgmt // grey - not connected
我应该提到,我还安装了
NetworkManager-config-server
RPM,因此我的 NetworkManager 配置为:no-auto-default=*
。
删除
/run/NetworkManager/system-connections/*
下的文件并使用 systemctl restart NetworkManager
重新启动 NetworkManager 会将它们恢复,所以我确信是 NetworkManager 创建了它们。它们看起来像这样(配置明显不同):
[connection]
id=ethMgmt
uuid=12899f61-26c1-4b62-826e-5ec70a545802
type=ethernet
autoconnect=false
interface-name=ethMgmt
timestamp=1701105499
[ethernet]
mac-address=00:0D:3A:AA:97:31
[ipv4]
address1=10.60.4.101/27,10.60.4.97
method=manual
route1=168.63.129.16/32,10.60.4.97,0
route2=169.254.169.254/32,10.60.4.97,0
[ipv6]
addr-gen-mode=default
method=link-local
[proxy]
[.nmmeta]
nm-generated=true
volatile=true
external=true
我似乎可以通过以下方式解决问题:
rm -rf /run/NetworkManager/system-connections/*
nmcli connection reload
...结果是:
$ nmcli -f TYPE,FILENAME,NAME connection
TYPE FILENAME NAME
loopback /run/NetworkManager/system-connections/lo.nmconnection lo -- green / connected
ethernet /etc/NetworkManager/system-connections/ethMgmt.nmconnection ethMgmt -- green / connected
...但这是一个相当不优雅的解决方案(特别是必须记住在重新启动机器后运行一些命令)。
我可以采取什么措施来阻止 NetworkManager 创建这些文件并在启动时读取
/etc/NetworkManager/system-connections/ethMgmt.nmconnection
?
我缺少配置的“保持配置”位。将以下内容添加到
/usr/lib/NetworkManager/conf.d/01-custom.conf
解决了这个问题:
[device]
keep-configuration=no
来自文档:
启动时,NetworkManager 会尝试不干扰已配置的接口。它通过根据接口当前配置生成内存中连接来实现此目的。 如果生成的连接与现有持久连接之一匹配,则该持久连接将被激活。如果不匹配,生成的连接将被激活为“外部”,这意味着该连接被视为活动的,但 NetworkManager 实际上并不接触该接口。
可以通过将 keep-configuration 设置为 no 来禁用此行为。通过这种方式,在启动时 NetworkManager 总是尝试激活最合适的持久连接(具有最高自动连接优先级的连接,或者,如果出现平局,则激活最近激活的连接)。
请注意,当 NetworkManager 重新启动时,它会将之前的状态存储在 /run/NetworkManager 中;特别是,它会保存之前处于活动状态的连接的 UUID,以便在重新启动后可以再次激活它。因此keep-configuration对服务重启没有任何影响。