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

接口配置文件可能在 Fedora 中不再被支持,但迁移到 NetworkManager 比您想象的更容易。
3 位读者喜欢这篇文章。
A network diagram

Opensource.com

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

在一系列文章中,我写了我为什么喜欢 NetworkManager 以及我如何使用它。在第一部分中,我研究了 NetworkManager 的作用以及它提供的一些用于查看网络连接和设备的工具。在那篇文章中,我提到 NetworkManager 对于大多数主机来说不需要接口配置文件。但是,它可以创建自己的 ini 样式配置文件,并且它可以识别较旧的网络接口配置文件。NetworkManager 配置文件正式称为密钥文件。在第二部分中,我研究了已弃用的接口配置文件以及如果您仍在使用的配置方法。

从 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 服务器获取其配置值。由于不再安装 NetworkManager-initscripts-ifcfg-rh 软件包,因此新的安装不再支持 ifcfg 文件。该软件包包含使用 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-initscripts-ifcfg-rh 软件包之前,NetworkManager 完全忽略了此文件的内容。之后,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 文件。如果主机有多个 NIC 和相应的 ifcfg 文件,但您只想迁移其中的一些,则可以指定要迁移的连接列表。

可以使用您喜欢的编辑器修改密钥文件。我尝试通过更改 IPADDR 条目并重新启动 NetworkManager 来确保它正常工作。nmcli connection reload 命令对我不起作用。不建议使用编辑器直接更改密钥文件,但它确实有效。老实说,许多经验丰富的系统管理员(像我一样)真的更喜欢直接编辑 ASCII 文本配置文件,因此——推荐与否——这就是我大部分时间做事的方式。我只是想知道这些文件中实际存在的内容,以便我可以识别它们何时出现问题。它有助于解决配置问题。

实战演练

经过一天的实验,我完全了解了这一切是如何运作的,以及如何在失败的情况下恢复,我准备好真正地做这件事了。我选择了我的主服务器作为第一次尝试,因为它只有一个 NIC,如果出现问题,这将使它更快地恢复在线。

首先,我将下面显示的 /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 软件包并再次重新启动,因为验证一切不会有坏处。

一旦我知道迁移工具在我的一个生产系统上工作,而且是一个重要的系统,我就准备在我的防火墙/路由器(具有三个 NIC 的那个)上执行此操作。我在该主机上运行了相同的 nmcli connection migrate 命令并验证了结果。在确保一切正常工作后,我使用 DNF 从两个生产主机中删除了 NetworkManager-initscripts-ifcfg-rh 软件包。并且我使用每个主机的更多次重新启动进行了测试,以确保在删除 initscripts 软件包期间没有任何东西损坏。

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

新安装的 Fedora 不会创建任何类型的网络接口配置文件。默认情况下,NetworkManager 将网络接口作为 DHCP 连接处理。因此,对于使用 DHCP 获取其网络配置信息的主机,您无需执行任何操作。

但是,即使您没有要迁移的已弃用的 ifcfg 文件,您可能仍需要为某些新主机创建静态配置。

恢复到 DHCP

恢复到使用 DHCP 非常简单。只需从 /etc/NetworkManager/system-connections/ 中删除所需连接的 keyfile,然后重启 NetworkManager。删除 可以是将文件移动到其他位置或直接删除它。

为了准备我下一步创建新 keyfile 的实验,我将 enp0s31f6.nmconnection keyfile 移动到了 /root,并重启了 NetworkManager。

创建新的 keyfile

尽管旧的 ip 命令仍然可以用来修改实时环境中的网络接口设置,但这些更改在重启后不会保留。 使用 NetworkManager 工具(例如 nmcli nmtui,GUI NetworkManager 连接编辑器 (nm-connection-editor))和您喜欢的文本编辑器所做的更改是持久的。 我尝试过的所有桌面(Xfce、Cinnamon、LXDE、KDE Plasma)以及我可能尚未尝试的其余桌面,其系统托盘上都可以使用连接编辑器。

文本编辑器

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

使用 nmtui

nmtui 工具 (NetworkManager Text User Interface) 是我第二选择的工具。 我觉得这个界面繁琐、不吸引人且不够直观。 此工具默认情况下未安装,如果我不是在写这篇文章,我可能也不会安装它。

但是,它确实有效,并且为我创建了一个 keyfile,该 keyfile 与 GUI Connection Manager 创建的 keyfile 基本相同,我在下面讨论。 我发现的唯一区别(当然是使用 diff 命令)是文件中的时间戳字段以及我在配置连接时有意做出的一个不同的选择。 该界面确实提供了一些关于您需要提供的数据以创建有效 keyfile 的线索。

通过在命令行中输入命令 nmtui 来启动此工具。 通常,箭头键允许在显示页面上的字段之间移动,Enter 键选择要修改或添加的项目。 Page Up/Page Down 键滚动页面。 选择Edit a connection,然后按 Enter 以创建一个新的 keyfile。

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

(David Both, CC BY-SA 4.0)

在浏览完界面后,我到达了“编辑连接”页面。 我从这个界面不清楚 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.

(David Both, CC BY-SA 4.0)

接下来,使用键盘滚动到页面底部,然后按 OK 以保存 keyfile。 keyfile 会立即保存,但必须重启 NetworkManager 才能激活此文件,无论是新的还是更改过的。 虽然这不是我最喜欢的创建和管理 NetworkManager keyfile 的界面,但我计划在 GUI 连接编辑器不可用时使用它,例如在远程主机上工作时。

使用 nmcli

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

如下所示的命令添加了所需的 keyfile,就像其他工具一样。

[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 tab-completion 序列,它显示了可用的子命令。

[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 并在发出命令之前研究该命令。 这需要时间。 即使它没有抛出错误,它创建的 keyfile 的效果也很差,甚至根本不起作用。 例如,当我从测试 VM SSH 出来时,连接有效,但我无法 SSH 进入测试 VM。 我仍然不确定问题是什么,但该 keyfile 的 IP 地址的 CIDR 前缀不正确。 我最终通过参考手册页 nmcli-examples(7) 上的示例来纠正了该命令。

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

使用 GUI NetworkManager 连接编辑器

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

只需右键单击系统托盘中的网络图标(看起来像一对计算机),然后选择 Edit Connections

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

(David Both, CC BY-SA 4.0)

这将打开连接编辑窗口,如下图所示。 从连接列表中双击所需的连接,通常是 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,

(David Both, CC BY-SA 4.0)

“Editing Wired Connection 1”对话窗口的 Ethernet 选项卡显示了此笔记本电脑的设备名称 enp111s0。 在大多数情况下,此页面上的任何内容都不需要更改。

回到我的 VM 上,我将 Method 字段从 Automatic (DHCP) 更改为 Manual。 我为该主机添加了 IP 地址、CIDR 前缀和默认路由(网关)。 我还添加了三个 DNS 服务器和搜索域。 这些是网络连接所需的最小配置变量。 它们也与接口配置文件和以前的 keyfile 中定义的变量相同。 此网卡的设备名称是 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.

(David Both, CC BY-SA 4.0)

Method 字段的另一个可用选项是 Disabled。 我将 IPV6 设置为 Disabled,因为我不使用 IPV6。

设置完这些值后,单击 Save 按钮会立即创建新的 keyfile。 更改现有 keyfile 同样容易。 但是,必须重启 NetworkManager 才能使这些配置更改生效。

就创建新的 NetworkManager keyfile 所涉及的时间和工作量而言,GUI 连接编辑器远胜于其他选项。 它提供了一个易于使用的界面,并提供了足够的信息来帮助您了解所需的数据。

结论

Fedora 36 改变了使用旧式、已弃用的接口配置文件的情况。 对于新安装的 Fedora 36,除非显式安装了 NetworkManager-initscripts-ifcfg-rh 软件包,否则这些文件将不起作用。 这是一个警告信号,表明将来将完全忽略对这些已弃用的 ifcfg 脚本的所有支持。

幸运的是,从任何现有的 ifcfg 脚本进行迁移都非常简单,并且使用三种可用工具之一创建新的脚本也不难。 我更喜欢 GUI NetworkManager 连接编辑器工具,因为它清晰易懂。 我可以使用 nmtui 工具,该工具与 GUI 版本的功能相同,但用户界面有点笨拙。 如果可以避免,我尽量不使用 nmcli 工具。 它确实有效,但很繁琐,需要大量的阅读和实验才能获得正确的命令语法以及创建完全可用的 keyfile 的所有正确参数。

所以现在就开始迁移吧。 我做到了,而且很简单。

接下来要阅读的内容
David Both
David Both 是开源软件和 GNU/Linux 的倡导者、培训师、作家和演讲者。 他自 1996 年以来一直从事 Linux 和开源软件的工作,自 1969 年以来一直从事计算机工作。 他是“系统管理员的 Linux 哲学”的坚定支持者和传播者。

1 条评论

很棒的文章,很棒的截图,我真的很喜欢你的桌面主题!

Creative Commons License本作品根据 Creative Commons Attribution-Share Alike 4.0 International License 获得许可。
© . All rights reserved.