千家信息网

Linux下如何安装并使用NMState网络管理器

发表于:2025-01-19 作者:千家信息网编辑
千家信息网最后更新 2025年01月19日,这篇文章将为大家详细讲解有关Linux下如何安装并使用NMState网络管理器,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。NMState 是一个网络管理器,允许你
千家信息网最后更新 2025年01月19日Linux下如何安装并使用NMState网络管理器

这篇文章将为大家详细讲解有关Linux下如何安装并使用NMState网络管理器,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

NMState 是一个网络管理器,允许你按照声明式方法配置主机。这意味着你通过一个北向的声明式 API 定义所需的配置状态,这个工具通过南向的提供者provider应用配置。

目前 NMState 支持的唯一的提供者是 NetworkManager,它是为 Fedora Linux 提供网络功能的主要服务。不过,NMState 的开发计划中将逐渐增加其他提供者。

配置方法:命令式与声明式

网络管理有时候是一项非常复杂的任务,这取决于环境的规模和多样性。在 IT 的早期,网络管理依赖于网络管理员在网络设备上手动执行命令。如今,基础设施即代码Infrastructure as Code(IaC)允许以不同的方式将这些任务自动化。z这基本上有两种方法:命令式或声明式。

在命令式方法中,你会定义"如何"达到所需的配置状态。而在声明式范式里则定义了"什么"是所需的配置状态,所以它不确定哪些步骤是必需的,也不确定它们必须以何种顺序执行。这种方法目前正在聚集更多的人员参与,你可以在目前使用的大多数管理和编排工具上找到它。

NMState:一个声明式的工具

NMState 是一个网络管理器,允许你按照声明式方法配置主机。这意味着你通过一个北向的声明式 API 定义所需的配置状态,这个工具通过南向的提供者provider应用配置。

目前 NMState 支持的唯一的提供者是 NetworkManager,它是为 Fedora Linux 提供网络功能的主要服务。不过,NMState 的开发计划中将逐渐增加其他提供者。

关于 NMState 的进一步信息,请访问其项目 站点 或 GitHub 仓库。

安装

NMState 在 Fedora Linux 29+ 上可用,需要在系统上安装并运行 NetworkManager 1.26 或更高版本。下面是在 Fedora Linux 34 上的安装情况:

$ sudo dnf -y install nmstate...输出节略...Installed: NetworkManager-config-server-1:1.30.4-1.fc34.noarch      gobject-introspection-1.68.0-3.fc34.x86_64      nispor-1.0.1-2.fc34.x86_64              nmstate-1.0.3-2.fc34.noarch python3-gobject-base-3.40.1-1.fc34.x86_64                python3-libnmstate-1.0.3-2.fc34.noarch          python3-nispor-1.0.1-2.fc34.noarch      python3-varlink-30.3.1-2.fc34.noarchComplete!

这样,你可以使用 nmstatectl 作为 NMState 的命令行工具。请参考 nmstatectl -helpman nmstatectl 以了解关于这个工具的进一步信息。

使用 NMstate

首先要检查系统中安装的 NMState 版本:

$ nmstatectl version1.0.3

检查一个网络接口的当前配置,例如 eth0 的配置:

$ nmstatectl show eth02021-06-29 10:28:21,530 root         DEBUG    NetworkManager version 1.30.42021-06-29 10:28:21,531 root         DEBUG    Async action: Retrieve applied config: ethernet eth0 started2021-06-29 10:28:21,531 root         DEBUG    Async action: Retrieve applied config: ethernet eth2 started2021-06-29 10:28:21,532 root         DEBUG    Async action: Retrieve applied config: ethernet eth0 finished2021-06-29 10:28:21,533 root         DEBUG    Async action: Retrieve applied config: ethernet eth2 finished---dns-resolver: config: {} running:   search: []   server:   - 192.168.122.1route-rules: config: []routes: config: [] running: - destination: fe80::/64   metric: 100   next-hop-address: ''   next-hop-interface: eth0   table-id: 254 - destination: 0.0.0.0/0   metric: 100   next-hop-address: 192.168.122.1   next-hop-interface: eth0   table-id: 254 - destination: 192.168.122.0/24   metric: 100   next-hop-address: ''   next-hop-interface: eth0   table-id: 254interfaces:- name: eth0 type: ethernet state: up ipv4:   enabled: true   address:   - ip: 192.168.122.238     prefix-length: 24   auto-dns: true   auto-gateway: true   auto-route-table-id: 0   auto-routes: true   dhcp: true ipv6:   enabled: true   address:   - ip: fe80::c3c9:c4f9:75b1:a570     prefix-length: 64   auto-dns: true   auto-gateway: true   auto-route-table-id: 0   auto-routes: true   autoconf: true   dhcp: true lldp:   enabled: false mac-address: 52:54:00:91:E4:4E mtu: 1500

正如你在上面看到的,这个网络配置显示了四个主要部分:

  • dns-resolver:这部分是这个接口的名字服务器配置。
  • route-rules:它说明了路由规则。
  • routes:它包括动态和静态路由。
  • interfaces:这部分描述了 ipv4 和 ipv6 设置。

修改配置

你可以在两种模式下修改所需的配置状态:

  • 交互式:通过 nmstatectl edit 编辑接口配置。这个命令调用环境变量 EDITOR 定义的文本编辑器,因此可以用 yaml 格式编辑网络状态。完成编辑后,NMState 将应用新的网络配置,除非有语法错误。
  • 基于文件的:使用 nmstatectl apply 应用接口配置,它从先前创建的 yaml 或 json 文件中导入一个所需的配置状态。

下面几节告诉你如何使用 NMState 来改变网络配置。这些改变可能会对系统造成破坏,所以建议在测试系统或客户虚拟机上执行这些任务,直到你对 NMState 有更好的理解。

这里使用的测试系统有两个以太网接口,eth0eth2

$ ip -br -4 alo               UNKNOWN        127.0.0.1/8eth0             UP             192.168.122.238/24eth2             UP             192.168.122.108/24
互动配置模式的例子

使用 nmstatectl edit 命令将 eth0 接口的 MTU 改为 9000 字节,如下所示:

$ sudo nmstatectl edit eth0---dns-resolver: config: {} running:   search: []   server:   - 192.168.122.1route-rules: config: []routes: config: [] running: - destination: fe80::/64   metric: 100   next-hop-address: ''   next-hop-interface: eth0   table-id: 254 - destination: 0.0.0.0/0   metric: 100   next-hop-address: 192.168.122.1   next-hop-interface: eth0   table-id: 254 - destination: 192.168.122.0/24   metric: 100   next-hop-address: ''   next-hop-interface: eth0   table-id: 254interfaces:- name: eth0 type: ethernet state: up ipv4:   enabled: true   address:   - ip: 192.168.122.123     prefix-length: 24   auto-dns: true   auto-gateway: true   auto-route-table-id: 0   auto-routes: true   dhcp: true ipv6:   enabled: true   address:   - ip: fe80::c3c9:c4f9:75b1:a570     prefix-length: 64   auto-dns: true   auto-gateway: true   auto-route-table-id: 0   auto-routes: true   autoconf: true   dhcp: true lldp:   enabled: false mac-address: 52:54:00:91:E4:4E mtu: 9000

在保存并退出编辑器后,NMState 应用新的网络期望状态:

2021-06-29 11:29:05,726 root         DEBUG    Nmstate version: 1.0.32021-06-29 11:29:05,726 root         DEBUG    Applying desire state: {'dns-resolver': {'config': {}, 'running': {'search': [], 'server': ['192.168.122.1']}}, 'route-rules': {'config': []}, 'routes': {'config': [], 'running': [{'destination': 'fe80::/64', 'metric': 102, 'next-hop-address': '', 'next-hop-interface': 'eth0', 'table-id': 254}, {'destination': '0.0.0.0/0', 'metric': 102, 'next-hop-address': '192.168.122.1', 'next-hop-interface': 'eth0', 'table-id': 254}, {'destination': '192.168.122.0/24', 'metric': 102, 'next-hop-address': '', 'next-hop-interface': 'eth0', 'table-id': 254}]}, 'interfaces': [{'name': 'eth0', 'type': 'ethernet', 'state': 'up', 'ipv4': {'enabled': True, 'address': [{'ip': '192.168.122.238', 'prefix-length': 24}], 'auto-dns': True, 'auto-gateway': True, 'auto-route-table-id': 0, 'auto-routes': True, 'dhcp': True}, 'ipv6': {'enabled': True, 'address': [{'ip': 'fe80::5054:ff:fe91:e44e', 'prefix-length': 64}], 'auto-dns': True, 'auto-gateway': True, 'auto-route-table-id': 0, 'auto-routes': True, 'autoconf': True, 'dhcp': True}, 'lldp': {'enabled': False}, 'mac-address': '52:54:00:91:E4:4E', 'mtu': 9000}]}--- output omitted ---2021-06-29 11:29:05,760 root         DEBUG    Async action: Update profile uuid:2bdee700-f62b-365a-bd1d-69d9c31a9f0c iface:eth0 type:ethernet started2021-06-29 11:29:05,792 root         DEBUG    Async action: Update profile uuid:2bdee700-f62b-365a-bd1d-69d9c31a9f0c iface:eth0 type:ethernet finished

现在,使用 ip 命令和 eth0 的配置文件来检查 eth0MTU 是不是 9000 字节。

$ ip link show eth02: eth0:  mtu 9000 qdisc fq_codel state UP mode DEFAULT group default qlen 1000   link/ether 52:54:00:91:e4:4e brd ff:ff:ff:ff:ff:ff   altname enp1s0$ sudo cat /etc/NetworkManager/system-connections/eth0.nmconnection[sudo] password for admin:[connection]id=eth0uuid=2bdee700-f62b-365a-bd1d-69d9c31a9f0ctype=ethernetinterface-name=eth0lldp=0permissions=[ethernet]cloned-mac-address=52:54:00:91:E4:4Emac-address-blacklist=mtu=9000[ipv4]dhcp-client-id=macdhcp-timeout=2147483647dns-search=method=auto[ipv6]addr-gen-mode=eui64dhcp-duid=lldhcp-iaid=macdhcp-timeout=2147483647dns-search=method=autora-timeout=2147483647[proxy]
基于文件的配置模式的例子

让我们使用基于文件的方法来设置一个新的配置状态。这里我们禁用 eth2 接口的 IPv6 配置。

首先,创建一个 yaml 文件来定义 eth2 接口的期望状态。使用 nmstatectl show 来保存当前设置,然后使用 nmstatectl edit 来禁用 IPv6。

$ nmstatectl show eth2 > eth2.yaml$ vi eth2.yaml---dns-resolver: config: {} running:   search: []   server:   - 192.168.122.1route-rules: config: []routes: config: [] running: - destination: fe80::/64   metric: 101   next-hop-address: ''   next-hop-interface: eth2   table-id: 254 - destination: 0.0.0.0/0   metric: 101   next-hop-address: 192.168.122.1   next-hop-interface: eth2   table-id: 254 - destination: 192.168.122.0/24   metric: 101   next-hop-address: ''   next-hop-interface: eth2   table-id: 254interfaces:- name: eth2 type: ethernet state: up ipv4:   enabled: true   address:   - ip: 192.168.122.108     prefix-length: 24   auto-dns: true   auto-gateway: true   auto-route-table-id: 0   auto-routes: true   dhcp: true ipv6:   enabled: false   address:   - ip: fe80::5054:ff:fe3c:9b04     prefix-length: 64   auto-dns: true   auto-gateway: true   auto-route-table-id: 0   auto-routes: true   autoconf: true   dhcp: true lldp:   enabled: false mac-address: 52:54:00:3C:9B:04 mtu: 1500

保存新的配置后,用它来应用新的状态:

$ vi eth2.yaml---dns-resolver: config: {} running:   search: []   server:   - 192.168.122.1route-rules: config: []routes: config: [] running: - destination: fe80::/64   metric: 101   next-hop-address: ''   next-hop-interface: eth2   table-id: 254 - destination: 0.0.0.0/0   metric: 101   next-hop-address: 192.168.122.1   next-hop-interface: eth2   table-id: 254 - destination: 192.168.122.0/24   metric: 101   next-hop-address: ''   next-hop-interface: eth2   table-id: 254interfaces:- name: eth2 type: ethernet state: up ipv4:   enabled: true   address:   - ip: 192.168.122.110     prefix-length: 24   auto-dns: true   auto-gateway: true   auto-route-table-id: 0   auto-routes: true   dhcp: false ipv6:   enabled: false lldp:   enabled: false mac-address: 52:54:00:3C:9B:04 mtu: 1500

你可以检查看到 eth2 接口没有配置任何 IPv6:

$ vi eth2.yaml---dns-resolver: config: {} running:   search: []   server:   - 192.168.122.1route-rules: config: []routes: config: [] running: - destination: fe80::/64   metric: 101   next-hop-address: ''   next-hop-interface: eth2   table-id: 254 - destination: 0.0.0.0/0   metric: 101   next-hop-address: 192.168.122.1   next-hop-interface: eth2   table-id: 254 - destination: 192.168.122.0/24   metric: 101   next-hop-address: ''   next-hop-interface: eth2   table-id: 254interfaces:- name: eth2 type: ethernet state: up ipv4:   enabled: true   address:   - ip: 192.168.122.110     prefix-length: 24   auto-dns: true   auto-gateway: true   auto-route-table-id: 0   auto-routes: true   dhcp: false ipv6:   enabled: false lldp:   enabled: false mac-address: 52:54:00:3C:9B:04 mtu: 1500
临时应用改变

NMState 的一个有趣的功能允许你临时配置一个期望的网络状态。如果你对这个配置感到满意,你可以事后提交。否则,当超时(默认为 60 秒)过后,它将回滚。

修改前面例子中的 eth2 配置,使它有一个 IPv4 静态地址,而不是通过 DHCP 动态获得。

$ vi eth2.yaml---dns-resolver: config: {} running:   search: []   server:   - 192.168.122.1route-rules: config: []routes: config: [] running: - destination: fe80::/64   metric: 101   next-hop-address: ''   next-hop-interface: eth2   table-id: 254 - destination: 0.0.0.0/0   metric: 101   next-hop-address: 192.168.122.1   next-hop-interface: eth2   table-id: 254 - destination: 192.168.122.0/24   metric: 101   next-hop-address: ''   next-hop-interface: eth2   table-id: 254interfaces:- name: eth2 type: ethernet state: up ipv4:   enabled: true   address:   - ip: 192.168.122.110     prefix-length: 24   auto-dns: true   auto-gateway: true   auto-route-table-id: 0   auto-routes: true   dhcp: false ipv6:   enabled: false lldp:   enabled: false mac-address: 52:54:00:3C:9B:04 mtu: 1500

现在,使用选项 no-commit 临时应用这个配置,让它只在 30 秒内有效。这可以通过添加选项 timeout 来完成。同时,我们将运行 ip -br a 命令三次,看看配置在 eth2 接口的 IPv4 地址是如何变化的,然后配置就会回滚。

$ ip -br a && sudo nmstatectl apply --no-commit --timeout 30 eth2.yaml && sleep 10 && ip -br a && sleep 25 && ip -br alo               UNKNOWN        127.0.0.1/8 ::1/128eth0             UP             192.168.122.238/24 fe80::5054:ff:fe91:e44e/64eth2             UP             192.168.122.108/242021-06-29 17:29:18,266 root         DEBUG    Nmstate version: 1.0.32021-06-29 17:29:18,267 root         DEBUG    Applying desire state: {'dns-resolver': {'config': {}, 'running': {'search': [], 'server': ['192.168.122.1']}}, 'route-rules': {'config': []}, 'routes': {'config': [], 'running': [{'destination': 'fe80::/64', 'metric': 101, 'next-hop-address': '', 'next-hop-interface': 'eth2', 'table-id': 254}, {'destination': '0.0.0.0/0', 'metric': 101, 'next-hop-address': '192.168.122.1', 'next-hop-interface': 'eth2', 'table-id': 254}, {'destination': '192.168.122.0/24', 'metric': 101, 'next-hop-address': '', 'next-hop-interface': 'eth2', 'table-id': 254}]}, 'interfaces': [{'name': 'eth2', 'type': 'ethernet', 'state': 'up', 'ipv4': {'enabled': True, 'address': [{'ip': '192.168.122.110', 'prefix-length': 24}], 'dhcp': False}, 'ipv6': {'enabled': False}, 'lldp': {'enabled': False}, 'mac-address': '52:54:00:3C:9B:04', 'mtu': 1500}]}--- output omitted ---Desired state applied:---dns-resolver: config: {} running:   search: []   server:   - 192.168.122.1route-rules: config: []routes: config: [] running: - destination: fe80::/64   metric: 101   next-hop-address: ''   next-hop-interface: eth2   table-id: 254 - destination: 0.0.0.0/0   metric: 101   next-hop-address: 192.168.122.1   next-hop-interface: eth2   table-id: 254 - destination: 192.168.122.0/24   metric: 101   next-hop-address: ''   next-hop-interface: eth2   table-id: 254interfaces:- name: eth2 type: ethernet state: up ipv4:   enabled: true   address:   - ip: 192.168.122.110     prefix-length: 24   dhcp: false ipv6:   enabled: false lldp:   enabled: false mac-address: 52:54:00:3C:9B:04 mtu: 1500Checkpoint: NetworkManager|/org/freedesktop/NetworkManager/Checkpoint/7lo               UNKNOWN        127.0.0.1/8 ::1/128eth0             UP             192.168.122.238/24 fe80::5054:ff:fe91:e44e/64eth2             UP             192.168.122.110/24lo               UNKNOWN        127.0.0.1/8 ::1/128eth0             UP             192.168.122.238/24 fe80::5054:ff:fe91:e44e/64eth2             UP             192.168.122.108/24

从上面可以看到,eth2 的 IP 地址从 192.168.122.108 暂时变成了 192.168.122.110,然后在超时结束后又回到了 192.168.122.108

关于"Linux下如何安装并使用NMState网络管理器"这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

配置 网络 状态 接口 命令 应用 管理 方法 网络管理 工具 提供者 文件 系统 检查 任务 例子 功能 命令式 地址 更多 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 web服务器网站管理助手 江苏服务器阵列卡安装虚拟主机 重庆会计软件开发商家 一站式网络技术开发市场报价 个性化软件开发诚信服务 金果数据库 临夏邮储银行网络安全 网络安全评估方案报告 微软软件开发工程师证件 csol玩一把就连不上服务器 软件开发合同如何确定管辖 旅游软件开发创新创业计划书 软件开发程序员编程工资待遇 抵制饭圈乱象维护网络安全手抄报 怎么清空数据库所有表 哪一个是网络安全法的亮点 新乡网络技术怎么代理 汽车信息安全软件开发公司 数据库建立过程 5g网络安全保护特性测试仪 独门秘籍让数据库升级不再烦恼 国家电网招聘网络安全工程师 数据库 cdn php 数据库 表格 教育部网络安全工作规划 嘉定区网络技术价格查询 浙江碳银互联网科技有限公司官网 网易花雨庭的服务器IP 全国网络安全大赛答题 软件开发员先进事迹
0