如何迁移到NetworkManager密钥文件进行配置

409 阅读16分钟

接口配置文件可能不会在Fedora中支持太久,但迁移到NetworkManager比你想象的要容易。

NetworkManager于2004年推出,使网络配置更加灵活和动态。旧的SystemV启动壳脚本(接口配置文件是其中的一部分)无法处理WiFi、有线、VPN、宽带调制解调器等,或者至少无法快速或有效地处理。

在一系列的文章中,我写了为什么我是NetworkManager的粉丝以及我如何使用它。在第一部分中,我介绍了NetworkManager的作用以及它提供的一些查看网络连接和设备的工具。在那篇文章中,我提到NetworkManager不需要大多数主机的接口配置文件。然而,它可以创建自己的ini风格的配置文件,而且它可以识别旧的网络接口配置文件。NetworkManager的配置文件被正式称为keyfiles。在第二部分中,我看了被废弃的接口配置文件以及如何配置它们,如果你仍然在使用它们的话。

从Fedora 36开始,新安装的系统不再默认提供对废弃的ifcfg 文件的支持。它将继续在从早期的Fedora版本升级到36版本的系统上使用它们--至少在一段时间内。尽管如此,在这个后期阶段,依赖已被废弃的ifcfg 配置文件并不是一个好主意。所以在本系列的第三部分,我将演示使用提供的命令行工具将现有的界面配置文件迁移到NetworkManager密钥文件。我还将研究如何使用命令行和GUI工具从头开始创建新的密钥文件,并比较它们的易用性。

迁移的过程比听起来要简单得多。我在我需要迁移的两个系统上使用了nmcli connection migrate 命令,一个是有一个网络接口卡(NIC),一个是我的路由器/防火墙,有三个NIC。在虚拟机上进行了一些广泛的测试后,它在两台生产主机上第一次也都完美地工作。就这样了。不需要其他命令、选项或参数。而且速度很快,在两台主机上的时间都不到一秒。

我为什么要迁移我的文件?

旧的shell脚本的大部分限制在于结构--或者说缺乏结构--ifcfg 文件。NetworkManager引入了新的网络连接密钥文件来克服这些问题。但是直到Fedora 36,它仍然可以识别旧的ifcfg 配置文件。现在,NetworkManager 不再为新安装的系统创建或支持ifcfg 文件。

我在一个新的 Fedora 36 安装系统上试验了 NetworkManager,但无法说服它使用新创建的ifcfg 文件。它继续将接口视为动态主机配置协议(DHCP),并从 DHCP 服务器获取其配置值。ifcfg 文件在新的安装中不再被支持,因为NetworkManager-initscripts-ifcfg-rh 包不再被安装。该软件包包含使用ifcfg 文件所需的工具。从Fedora旧版本升级的主机仍然会安装NetworkManager-initscripts-ifcfg-rh 包,所以它暂时会和其他安装内容一起升级到Fedora 36。这在将来可能不会是真的。

如果您的网络主机使用 DHCP 配置,您不需要迁移任何ifcfg 文件。事实上,你可以简单地删除它们,如果它们仍然存在的话,NetworkManager 会处理网络连接的管理问题。就我个人而言,我更喜欢把这些废弃的文件移到/root 的一个存档子目录下,这样我以后就可以找到它们,以防万一。

所有具有静态连接的主机都应该被迁移。这通常包括服务器、防火墙,以及其他可能需要在DHCP服务器不活跃的情况下执行其网络功能的主机。我有两台这样的主机:我的主服务器和我的防火墙/路由器。

我的实验

当NetworkManager正式废弃了位于/etc/sysconfig/network-scripts 的接口配置文件时,它并没有立即停止使用这些文件,但更新过程中确实放入了一个自述文件,/etc/sysconfig/network-scripts/readme-ifcfg-rh.txt 。这个简短的文件明确指出,ifcfg 风格的文件已被废弃。它还提供了一个简单的命令,为我们完成了迁移。

我建议你在你的主机上阅读该文件,然后在一个非生产环境中进行实验。我使用一个虚拟机进行实验,学到了很多东西。在我开始做修改之前,我显示了下图所示的连接数据,以获得网络连接的当前状态。

[root@myserver ~]# nmcli
enp0s3: connected to Wired connection 1
        "Intel 82540EM"
        ethernet (e1000), 08:00:27:07:CD:FE, hw, mtu 1500
        ip4 default
        inet4 192.168.0.136/24
        route4 192.168.0.0/24 metric 100
        route4 default via 192.168.0.254 metric 100

lo: unmanaged
        "lo"
        loopback (unknown), 00:00:00:00:00:00, sw, mtu 65536

DNS configuration:
        servers: 192.168.0.52 8.8.8.8 8.8.4.4
        domains: example.org
        interface: enp0s3

我创建了一个简单的ifcfg 文件,在我的一个虚拟机上定义了一个静态配置,然后进行测试,以验证这个静态配置是否正常工作。下面是我为这次测试创建的ifcfg-enp0s3 文件。

TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
# HWADDR=08:00:27:07:CD:FE
IPADDR=192.168.0.95
PREFIX=24
DEFROUTE=no
IPV4_FAILURE_FATAL=no
IPV6INIT=no
NAME=enp0s3
ONBOOT=yes
DNS1=192.168.0.52
DNS2=8.8.8.8
AUTOCONNECT_PRIORITY=-999
DEVICE=enp0s3

我注释了ifcfg-enp0s3 文件中的硬件地址,因为它似乎没有必要。我尝试了两种方式,无论哪种方式都能正常工作--一旦我最终让它正常工作。NetworkManager完全无视这个文件的内容,直到我安装了NetworkManager-initscripts-ifcfg-rh 包。在那之后,NetworkManager能够从这个ifcfg-enp0s3 文件中设置网络配置。

然后,是时候试试迁移工具了。我运行了下面的命令,将ifcfg 文件迁移到一个密钥文件。

[root@myserver system-connections]# nmcli connection migrate 
Connection 'Wired connection 1' (c7b11d30-522e-306f-8622-527119911afc) successfully migrated.
[root@myserver system-connections]# 

这个命令花了不到一秒钟。它创建了新的密钥文件,然后删除了ifcfg 文件。我建议在运行这个迁移工具之前,先复制一个原始的ifcfg 文件。它为我的主机创建了/etc/NetworkManager/system-connections/enp0s3.nmconnection 文件。如果不指定具体的接口,这个命令将迁移位于/etc/sysconfig/network-scripts 的所有ifcfg 文件。如果一台主机有多个网卡和相应的ifcfg 文件,而你只想迁移其中的一部分,你可以指定一个要迁移的连接列表。

可以用你喜欢的编辑器来修改keyfiles。我试着修改了IPADDR 条目,并重新启动NetworkManager,只是为了确保它能工作。nmcli connection reload 命令对我不起作用。不建议使用编辑器直接对密钥文件进行修改,但它确实有效。说实话,许多有经验的系统管理员(比如我)真的更喜欢直接编辑ASCII文本的配置文件,所以不管是否推荐,我大多数时候都是这样做的。我只是想知道这些文件里到底有什么,这样我就能认识到它们什么时候出了问题。这有助于解决配置问题。

实际操作

经过一天的实验,我完全理解了这一切是如何运作的,以及在失败的情况下如何恢复,我已经准备好真正地去做了。我选择了我的主服务器作为最初的尝试,因为它只有一个网卡,这将使它在出现问题时能够更快地恢复在线。

首先,我把下图所示的文件/etc/sysconfig/network-scripts/ifcfg-eno1 复制到/root ,作为备份。nmcli connection migrate 命令可以将钥匙文件转换回ifcfg 文件。但是,当我可以有一个准确的备份准备好放回去的时候,为什么还要麻烦呢?

HWADDR=e0:d5:5e:a2:de:a4
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
DEFROUTE=yes
IPADDR=192.168.0.52
PREFIX=24
GATEWAY=192.168.0.254
DOMAIN=example.org
IPV6INIT=no
DNS1=192.168.0.52
DNS2=8.8.8.8
DNS3=8.8.4.4
IPV4_FAILURE_FATAL=no
IPV6INIT=no
PEERROUTES=no
NAME="enp0s31f6"
ONBOOT=yes
AUTOCONNECT_PRIORITY=-999
DEVICE="enp0s31f6"

在运行nmcli connection migrate 命令后,我验证了它是否发出了状态行以表明转换已经发生,它确实如此。接下来我验证了ifcfg 文件已经消失,/etc/NetworkManager/system-connections/enp0s31f6.nmconnection 密钥文件已经到位。

[connection]
id=enp0s31f6
uuid=abf4c85b-57cc-4484-4fa9-b4a71689c359
type=ethernet
autoconnect-priority=-999
interface-name=enp0s31f6

[ethernet]
mac-address=E0:D5:5E:A2:DE:A4

[ipv4]
address1=192.168.0.52/24,192.168.0.254
dns=192.168.0.52;8.8.8.8;8.8.4.4;
dns-search=example.org;
ignore-auto-routes=true
method=manual

[ipv6]
addr-gen-mode=stable-privacy
method=ignore
never-default=true

[proxy]

这个文件将不会被使用,直到NetworkManager被重新启动或主机被重新启动。我首先重启了NetworkManager,然后检查结果,如下图所示。网络配置看起来是正确的。

[root@myserver ~]# nmcli
enp0s31f6: connected to enp0s31f6
        "Intel I219-V"
        ethernet (e1000e), E0:D5:5E:A2:DE:A4, hw, mtu 1500
        ip4 default
        inet4 192.168.0.52/24
        route4 default via 192.168.0.254 metric 100
        route4 192.168.0.0/24 metric 100

lo: unmanaged
        "lo"
        loopback (unknown), 00:00:00:00:00:00, sw, mtu 65536

DNS configuration:
        servers: 192.168.0.52 8.8.8.8 8.8.4.4
        domains: example.org
        interface: enp0s31f6

在完全重启后,我再次验证了网络配置,它看起来与上面的输出相同。有了这个工作,我删除了NetworkManager-initscripts-ifcfg-rh 包,并再次重启,只是因为验证一下一切也无妨。

一旦我知道迁移工具在我的一个生产系统上工作,而且是一个重要的系统,我就准备在我的防火墙/路由器上做这件事,就是那个有三个网卡的系统。我在该主机上运行了同样的nmcli connection migrate 命令,并验证了结果。在确保所有工作正常后,我用DNF从两个生产主机上删除了NetworkManager-initscripts-ifcfg-rh 包。我又对每台主机进行了几次重启测试,以确保在删除initscripts 包的过程中没有出现任何问题。

如果我没有 ifcfg 文件怎么办?

新安装的 Fedora 不会创建任何类型的网络接口配置文件。默认情况下,NetworkManager 将网络接口作为 DHCP 连接来处理。所以对于使用 DHCP 获取网络配置信息的主机,您不需要做任何事情。

然而,你可能需要为一些新的主机创建静态配置,即使你没有废弃的ifcfg 文件来迁移。

恢复使用 DHCP

恢复到使用 DHCP 很容易。只要从/etc/NetworkManager/system-connections/ 中删除所需连接的密钥文件,然后重新启动 NetworkManager。删除可以是指把文件移到别的地方,或者直接删除它。

为了准备下一步创建新的密钥文件的实验,我把enp0s31f6.nmconnection 的密钥文件移到/root 并重启 NetworkManager。

创建新的密钥文件

尽管旧的ip 命令仍然可以用来修改实时环境中的网络接口设置,但这些修改在重启后并不持久。使用NetworkManager工具,如nmclinmtui ,GUI NetworkManager 连接编辑器 (nm-connection-editor),以及您喜欢的文本编辑器所做的修改是持久的。连接编辑器在Fedora的系统托盘上对我试过的每一个桌面--Xfce、Cinnamon、LXDE、KDE Plasma--以及我还没有试过的其他桌面都是可用的。

文本编辑器

假设你熟悉钥匙文件的结构、语法和变量,只需一个ASCII文本编辑器就可以从头开始创建或修改钥匙文件。尽管我很欣赏并使用这种能力,但使用所提供的三种工具之一通常要简单得多。

使用nmtui

nmtui 工具(NetworkManager Text User Interface)是我在这三个工具中的第二选择。我发现这个界面很麻烦,没有吸引力,而且不直观。这个工具不是默认安装的,如果我不是在写这篇文章,我可能不会安装它。

然而,它确实有效,它为我创建的密钥文件与我在下面讨论的GUI连接管理器创建的密钥文件基本相同。我发现的唯一不同之处(当然是使用diff 命令)是文件中的时间戳字段和我在配置连接时有意做出的一个不同选择。该界面确实提供了一些关于你需要提供的数据的线索,以创建一个有效的密钥文件。

通过在命令行上输入命令nmtui ,启动这个工具。一般来说,方向键允许在显示的页面上的字段之间移动,回车键选择一个项目进行修改或添加。Page Up/Page Down键可以滚动页面。选择 "编辑连接",然后按回车键,创建一个新的密钥文件。

A window shows three options under NetworkManager TUI. Edit a connection is first and highlighted in red

在界面中蜿蜒前行后,我来到了 "编辑连接 "页面。在这个界面上,我并不清楚CIDR前缀应该附加到IP地址上,但我还是这么做了,而且成功了。在这个页面上填写适当的数据来配置接口。注意,我已经禁用了IPV6。

The Edit Connection window includes editable fields including name, device, IPv4 Configuration (including addresses, gateway, DNS servers, Search domains) and a similar IPv6 configuration, which is disabled. Routing options that can be checked are shown: Require IPv4 addressing for this connection is checked for this example.

接下来,用键盘向下滚动到页面底部,按OK键保存密钥文件。密钥文件立即被保存,但NetworkManager必须重新启动以激活这个文件,不管是新的还是改变的。虽然这不是我最喜欢的创建和管理NetworkManager钥匙文件的界面,但我打算在GUI连接编辑器不可用时使用它,例如在远程主机上工作时。

使用nmcli

我过去曾使用nmcli (Network Manager Command Line Interface)工具来配置一个接口,这个工具也非常好用。我只是最不喜欢它,因为它需要最多输入和阅读手册页和在线参考资料。执行该命令会立即在/etc/NetworkManager/system-connections/ 目录中创建接口配置文件。

下图所示的命令添加了需要的密钥文件,就像其他工具一样。

[root@myserver system-connections]# nmcli connection add connection-name enp0s3-Wired ifname enp0s3 type ethernet ipv4.addresses 192.168.0.136/24 ipv4.gateway 192.168.0.254 ipv4.dns 192.168.0.254,8.8.8.8,8.8.4.4 ipv4.dns-search example.org ipv6.method disabled 
Connection 'ethernet-enp0s3' (67d3a3c1-3d08-474b-ae91-a1005f323459) successfully added.
[root@myserver system-connections]# cat enp0s3-Wired.nmconnection 
[connection]
id=ethernet-enp0s3
uuid=67d3a3c1-3d08-474b-ae91-a1005f323459
type=ethernet
interface-name=enp0s3

[ethernet]

[ipv4]
address1=192.168.0.136/32,192.168.0.254
dns=192.168.0.52;8.8.8.8;8.8.4.4;
dns-search=example.org;
method=manual

[ipv6]
addr-gen-mode=stable-privacy
method=disabled

[proxy]
[root@myserver system-connections]# 

在使用nmcli connection add 的时候,有一个辅助工具是Bash标签完成序列,它显示了可用的子命令。

[root@myserver system-connections]# nmcli connection add <tab><tab>
autoconnect                        ifname                             ipv6.dhcp-send-hostname
con-name                           ipv4.addresses                     ipv6.dhcp-timeout
connection.auth-retries            ipv4.dad-timeout                   ipv6.dns
connection.autoconnect             ipv4.dhcp-client-id                ipv6.dns-options
connection.autoconnect-priority    ipv4.dhcp-fqdn                     ipv6.dns-priority
connection.autoconnect-retries     ipv4.dhcp-hostname                 ipv6.dns-search
connection.autoconnect-slaves      ipv4.dhcp-hostname-flags           ipv6.gateway
connection.dns-over-tls            ipv4.dhcp-iaid                     ipv6.ignore-auto-dns
connection.gateway-ping-timeout    ipv4.dhcp-reject-servers           ipv6.ignore-auto-routes
connection.id                      ipv4.dhcp-send-hostname            ipv6.ip6-privacy
connection.interface-name          ipv4.dhcp-timeout                  ipv6.may-fail
connection.lldp                    ipv4.dhcp-vendor-class-identifier  ipv6.method
connection.llmnr                   ipv4.dns                           ipv6.never-default
connection.master                  ipv4.dns-options                   ipv6.ra-timeout
connection.mdns                    ipv4.dns-priority                  ipv6.required-timeout
connection.metered                 ipv4.dns-search                    ipv6.route-metric
connection.mud-url                 ipv4.gateway                       ipv6.routes
connection.multi-connect           ipv4.ignore-auto-dns               ipv6.route-table
connection.permissions             ipv4.ignore-auto-routes            ipv6.routing-rules
connection.read-only               ipv4.may-fail                      ipv6.token
connection.secondaries             ipv4.method                        master
connection.slave-type              ipv4.never-default                 match.driver
connection.stable-id               ipv4.required-timeout              match.interface-name
connection.timestamp               ipv4.route-metric                  match.kernel-command-line
connection.type                    ipv4.routes                        match.path
connection.uuid                    ipv4.route-table                   proxy.browser-only
connection.wait-device-timeout     ipv4.routing-rules                 proxy.method
connection.zone                    ipv6.addresses                     proxy.pac-script
help                               ipv6.addr-gen-mode                 proxy.pac-url
hostname.from-dhcp                 ipv6.dhcp-duid                     slave-type
hostname.from-dns-lookup           ipv6.dhcp-hostname                 tc.qdiscs
hostname.only-from-default         ipv6.dhcp-hostname-flags           tc.tfilters
hostname.priority                  ipv6.dhcp-iaid                     type
[root@myserver system-connections]# nmcli connection add 

我通常喜欢用命令行来完成大多数任务。然而,要正确掌握这个命令的语法和选项的复杂性意味着我必须始终使用man page,并在发布命令之前研究这个命令。这需要时间。而且,它仍然抱怨我漏掉了一些东西或弄错了。即使它没有抛出一个错误,它创建的密钥文件也工作得很差,甚至根本没有。例如,当我从测试虚拟机中SSH出来时,连接正常,但我无法SSH到测试虚拟机中。我仍然不确定问题出在哪里,但那个密钥文件的IP地址的CIDR前缀是错误的。我最终通过参考手册页nmcli-examples(7)上的例子得到了正确的命令。

当这是唯一可用的方法时,我可以这样做,但这是我最不喜欢的工具。

使用GUI NetworkManager连接编辑器

我在本节的部分内容中使用了我的一台笔记本电脑来显示有线和无线连接。尽管我通常更喜欢命令行工具,但在所有三个可用的工具选项中,我最喜欢这个GUI NetworkManager连接编辑器工具。它很容易使用,很直观,提供了对任何需要的配置项目的快速访问,而且在我试过的所有桌面的系统托盘中都可以直接使用。

只要右击系统托盘中的网络图标,即看起来像一对电脑的那个。然后选择编辑连接。

A dropdown menu shows options for enabling networking, WiFi, and notifications, and others. A pointer arrow indicates the choice Edit Connections

这将打开连接编辑窗口,如下图所示。从连接列表中双击所需的连接,通常是Wired Connection 1 或一个WiFi SSID。下图显示了在我的一台笔记本电脑上打开的有线和无线连接供编辑。我从来没有需要编辑一个无线连接,因为我所连接的无线连接总是使用DHCP进行配置。要求无线连接使用静态地址是可能的,但我从未遇到过这种情况。

Two windows showing options for editing wired and wireless connections are side by side. The wired ethernet connection has fields for device, MTU, LAN info, and link negotiation. The WiFi version has fields for SSID, Mode, Band, Channel, Rate, Transmission Power, Device, and MTU,

编辑有线连接1对话窗口的以太网标签显示了这台笔记本电脑的设备名称enp111s0 。在大多数情况下,这个页面上没有什么需要改变的。

回到我的虚拟机上,我把方法栏从自动(DHCP)改为手动。我为这个主机添加了IP地址、CIDR前缀和我想要的默认路由(网关)。我还添加了三个DNS服务器和搜索域。这些是网络连接所需的最低配置变量。它们也是在接口配置文件和以前的密钥文件中定义的那些。该网卡的设备名称是enp0s3 。下面是 ,使用GUI NetworkManager连接编辑工具对有线连接进行配置。

The manual wired connection fields include addresses, DNS servers, search domains, DHCP client ID. The box to require IPv4 addressing for this connection to complete is checked.

方法字段的另一个可用选项是禁用。我把IPV6设置为Disabled,因为我不使用IPV6。

设置完这些值后,点击 "保存"按钮,立即创建新的密钥文件。对现有的密钥文件进行修改也很容易。然而,NetworkManager必须重新启动,才能使这些配置变化生效。

就创建新的NetworkManager密钥文件所需的时间和工作量而言,GUI连接编辑器远远优于其他选项。它提供了一个易于使用的界面,并提供了足够的所需数据信息,对我们很有帮助。

结论

Fedora 36 改变了使用旧式的、被废弃的接口配置文件的方程式。对于新安装的Fedora 36,除非明确安装了NetworkManager-initscripts-ifcfg-rh 包,否则这些文件将无法使用。这是一个警告信号,所有对那些废弃的ifcfg 脚本的支持在未来将被完全忽略。

幸运的是,从任何现有的ifcfg 脚本迁移是非常容易的,而使用三个工具中的一个来创建新的脚本也不会太困难。我更喜欢GUI的NetworkManager连接编辑工具,因为它清晰而简单。我可以使用nmtui 工具,它与 GUI 版本做同样的事情,但有一个有点笨拙的用户界面。如果我可以的话,我尽量不使用nmcli 工具。它确实有效,但很麻烦,需要大量的阅读和实验来获得正确的命令语法和所有正确的参数来创建一个完全可用的钥匙文件。