NetworkManager
概述
参考:
NetworkManager daemon 是管理网络的守护进程。该守护进程尝试通过管理主网络连接和其他网络接口(如以太网,WiFi 和移动宽带设备),使网络配置和操作尽可能轻松自动。 除非禁用该行为,否则 NetworkManager 将在该设备的连接可用时连接任何网络设备。 有关网络的信息通过 D-Bus 接口导出到任何感兴趣的应用程序,提供丰富的 API,用于检查和控制网络设置和操作。
Connection
参考:
NetworkManager 将所有网络配置抽象成 Connection(连接),这些 Connection 的配置中包含网络配置(比如 IP 地址、网关等)。当 NetworkManager 激活网络设备上的 Connection 时,将为这个网络设备应用配置文件中的内容,并建立活动的网络连接。所以,可以创建多个 Connection 来关联到一个网络设备上;这样,它们就可以灵活地具有用于不同网络需求的各种网络配置。
用白话说就是:Connection 就是“网络配置”,网络设备(device)关联并使用“网络配置”来实现联网。而 NetworkManager 就是管理这些 Connection 的。Connection 可以表示一个概念,也可以表示一个配置文件。
Connection 插件
NetworkManager 通过 Plugins(插件) 的方式来管理 Connection 配置文件。在不同的 Linux 发行版中,所使用的插件各不相同,但是默认情况下,NetworkManager 使始终启用名为 keyfile 的插件,这是一个通用插件,当其他插件无法支持某些类型的 Connection 配置时,keyfile 插件将会自动提供支持。keyfile 插件会将 Connection 文件保存到 /etc/NetworkManager/system-connections/、/usr/lib/NetworkManager/system-connections/、/run/NetworkManager/system-connections/ 这三个目录中。
可以在 /etc/NetworkManager/NetworkManager.conf 文件中配置想要使用的插件,插件用于读写系统范围的连接配置文件。当指定多个插件时,将从所有列出的插件中读取 Connections。写入 Connections 时,会要求插件按照此处列出的顺序保存连接;如果第一个插件无法写出该连接类型(或无法写出任何连接),则尝试下一个插件。如果没有插件可以保存连接,则会向用户返回错误。
可用插件的数量是特定于发行版的。所有可用的插件详见 Manual(手册) 中 Plugins 章节
keyfile
- keyfile 插件是支持 NetworkManager 拥有的所有连接类型和功能的通用插件。它以 .ini 格式在 /etc/NetworkManager/system-connections 文件中写入连接配置。
- 有关文件格式的详细信息,请参阅 nm-settings-keyfile(5)。
- keyfile 插件存储的连接文件可能包含纯文本形式的 passwords、secrets、private keys,因此它将仅对 root 用户可读,并且插件将忽略除 root 用户或组之外的任何用户或组可读或可写的文件。
- 有关如何避免以纯文本形式存储密码,请参阅 nm-settings(5) 中的“秘密标志类型”。
- 此插件始终处于活动状态,并将自动用于存储其他插件不支持的连接。
ifcfg-rh
- 此插件用于 Fedora 和 Red Hat Enterprise Linux 发行版,用于从标准 /etc/sysconfig/network-scripts/ifcfg-* 文件读取和写入配置。它目前支持读取 Ethernet, Wi-Fi, InfiniBand, VLAN, Bond, Bridge, Team 这几种类型的连接。启用 ifcfg-rh 隐式启用 ibft 插件(如果可用)。这可以通过添加 no-ibft 来禁用。
- 有关 ifcfg 文件格式的更多信息,请参见 /usr/share/doc/initscripts/sysconfig.txt 和 nm-settings-ifcfg-rh(5)。
ifupdown
- This plugin is used on the Debian and Ubuntu distributions, and reads Ethernet and Wi-Fi connections from /etc/network/interfaces.
- This plugin is read-only; any connections (of any type) added from within NetworkManager when you are using this plugin will be saved using the keyfile plugin instead.
ibft, no-ibft
- These plugins are deprecated and their selection has no effect. This is now handled by nm-initrd-generator.
ifcfg-suse, ifnet
- These plugins are deprecated and their selection has no effect. The keyfile plugin should be used instead.
Connection D-Bus
NetworkManager 还会将这些 Connection 配置导出到 D-Bus 上,比如,通过 busctl 命令,可也获取 Connection 中的内容:
[root@ansible dispatcher.d]# busctl get-property org.freedesktop.NetworkManager /org/freedesktop/NetworkManager/Devices/2 org.freedesktop.NetworkManager.Device Interface
s "ens33"
所以,真正的底层实现,是通过 D-bus 中的网络设备配置文件来实现的
Connection 关联文件
默认情况下,由 keyfile 插件管理 INI 格式的 Connection 配置文件。并默认保存在 /etc/NetworkManager/system-connections/ 目录中。
注意:
- 在 RedHad 相关的发行版中,NetworkManager 会运行名为 ifcfg-rh 的插件,插件会将 /etc/NetworkManager/system-connections/ 目录中的 Connection 配置文件翻译成老式配置文件格式,并保存在 /etc/sysconfig/network-scripts/ 目录中
- 所以,在 RedHad 中,是无法从 /etc/NetworkManager/system-connections/ 目录中找到连接配置文件
- 若想禁用 ifcfg-rh 插件,只需要在 /etc/NetworkManager/NetworkManager.conf 文件中的 main 部分添加 plugins=keyfile 即可
在 D-Bus API 上的 Connection 配置中,将 INI 中的 Sections(部分) 称为 Settings(设置),Setting 即是 Properties(属性) 的集合。所以,很多文档,都将 Connection 表示为一组特定的、封装好的、独立的 Settings(集合) 集合。Connection 由一个或多个 Settings 组成。
Settings用于描述一个 Connection。每个 Setting 都具有一个或多个 **Property(属性)** 。Setting 与 Property 中间以点 . 连接。每个 Setting.Property 都会有一个值。
一个 Connection 有哪些 Settings,Setting 又有哪些 Property,以及这些 Property 都有什么作用,详见 Connection 配置详解
下面的命令,可以从 D-Bus API 中获取配置文件所在路径
# CentOS 中使用 ifcfg-rh 插件
~]# busctl get-property org.freedesktop.NetworkManager /org/freedesktop/NetworkManager/Settings/4 org.freedesktop.NetworkManager.Settings.Connection Filename
s "/etc/sysconfig/network-scripts/ifcfg-enp25s0f3"
# CentOS 中不使用 ifcfg-rh 插件
~]# busctl get-property org.freedesktop.NetworkManager /org/freedesktop/NetworkManager/Settings/4 org.freedesktop.NetworkManager.Settings.Connection Filename
s "/etc/NetworkManager/system-connections/eth1"
可以看到,使用不同的插件,配置文件所在路径是不同的
用白话说:如果说 Connection 是一个配置文件的话,Setting 就是配置文件中的 context(配置段,或称为"配置环境"),Property(属性) 是该配置环境下的 keyword(关键字,或称为"键"、"字段")。所以,一般情况下,Connection 也可以描述为由一个或多个 Property(属性) 组成。我们都把 Setting.Property 简称为 属性。其实 Setting 就是很多产品的配置文件中的 Context。
配置文件示例
~]# cat /etc/NetworkManager/system-connections/ens3.nmconnection
[connection]
id=ens3
uuid=8f8541bc-4893-418b-98d4-fbc7433747cf
type=ethernet
interface-name=ens3
permissions=
[ethernet]
mac-address-blacklist=
[ipv4]
address1=172.19.42.248/24,172.19.42.1
dns-search=
method=manual
[ipv6]
addr-gen-mode=stable-privacy
dns-search=
method=auto
[proxy]
如果通过 nmcli 命令查看这个 Connection,格式如下:
~]# nmcli connection show eth0
connection.id: ens3
connection.uuid: 8f8541bc-4893-418b-98d4-fbc7433747cf
connection.type: 802-3-ethernet
connection.interface-name: eth0
.........
ipv4.method: manual
ipv4.dns: 223.5.5.5
ipv4.addresses: 172.19.42.248/24
ipv4.gateway: 172.19.42.1
.......
第一列中的 connection 与 ipv4 就是 Setting。其中 id、uuid、type、interface-name 都是 connection 这个 Setting 的 Property,而 method、dns 等等都是 ipv4 这个 Setting 的 Property。第二列就是同一行 Property 对应的值。
NetworkManager API
NetworkManager 提供了一个 API,用来管理 Connection、检查网络配置等。nmcli 命令行工具 是官方提供的用于使用 API 的客户端应用程序。
也可以手动管理 Connection 文件,就跟出现 NetworkManager 之前一样,手动配置 /etc/sysconfig/network-scripts 目录下的网络设备配置文件,然后重启 deamon 进程以便加载这些文件即可。
注意:
- 一个网络设备(device)可以关联多个 connection,但是同一时间只能有一个与该网络设备(device)关联 connection 处于 active 状态。这就可以让一个网卡(device)同时具备多个配置,可以随时切换。
- NetworkManager 默认不会识别到配置文件的更改 并会继续使用旧的配置数据。如果更改 /etc/NetworkManager/system-connections/ 目录下的配置文件,那么需要让 NetworkManager 再次读取已经改动过的配置文件,如果想要确保这件事,需要执行如下几条命令
- nmcli connection reload # 让 Connection 重新加载以读取配置文件
- nmcli connection up ConnectionName # 再次启动指定的 Connection,这里的 up 也有 restart 的意思
NetworkManager 关联文件
/etc/NetworkManager/ #
- ./conf.d/ # 类似 include 功能,是 NetworkManager.conf 文件的内容片段。
- ./NetworkManager.conf # NetworkManager 程序的运行时配置文件
- ./system-connections/ # 每个 Connection 的配置文件保存路径。
- 在 RedHad 中,该路径被修改到 /etc/sysconfig/network-scripts/ 上去了。
/run/NetworkManager/ #
- ./system-connections/ # 自动生成的 Connection 的配置文件保存路径。
/usr/lib/NetworkManager/ #
- ./system-connections/ #
常见问题
LACP 在 NetworkManager 管理的 Bonding 不工作
https://github.com/systemd/systemd/issues/15208
当 systemd 版本在 242、243、245 时,NetworkManager 对于 802.3ad 模式的 Bonding 在发送 LACP 包是可能会产生异常
如果通过 NetworkManager 创建的 Bond 网络设备失效,有如下几种可用的解决方式:
- 通过 ip 命令先删除网络设备,再通过 ip 命令添加即可。
- ip link set bond1 down
- ip link del bond1
- ip link add bond1 type bond mod 802.3ad
反馈
此页是否对你有帮助?
Glad to hear it! Please tell us how we can improve.
Sorry to hear that. Please tell us how we can improve.