当前位置: 首页 > article >正文

netplan是如何操控NetworkManager的? 笔记250324

netplan是如何操控NetworkManager的?


Netplan 控制 NetworkManager 的过程主要包括以下几个步骤:

  1. 解析配置文件:用户通过编辑 /etc/netplan/*.yaml 文件定义网络配置。

  2. 生成 NetworkManager 配置:当执行 sudo netplan apply 时,Netplan 解析 YAML 文件并生成对应的 NetworkManager 配置文件,通常位于 /etc/NetworkManager/system-connections/ 目录下。

  3. 通知 NetworkManager 重载配置:Netplan 向 NetworkManager 发送信号,指示它重新加载配置文件,使得新的网络设置生效。 NetworkManager 按照生成的配置文件进行网络接口的配置和管理。










netplan通过以下方式操控NetworkManager:

  1. 工作原理:netplan读取位于/etc/netplan/目录下的YAML格式的配置文件,这些配置文件描述了网络接口的配置。netplan会将这些配置文件解析并转换为NetworkManager能够理解的配置格式,然后将这些配置应用到NetworkManager中。

  2. 配置文件转换:netplan在/run/NetworkManager/conf.d/目录下生成特定于NetworkManager的配置文件。这些配置文件定义了网络接口的IP地址、网关、DNS等配置。当执行netplan apply命令时,netplan会读取/etc/netplan/下的配置文件,生成相应的NetworkManager配置文件,并通知NetworkManager重新加载配置。

  3. 命令执行:通过netplan apply命令,netplan会将配置应用到NetworkManager,使新的网络配置生效。此外,还可以使用netplan get命令查询当前的配置内容。

  4. 网络接口管理:NetworkManager会根据netplan生成的配置文件来管理网络接口,包括配置IP地址、设置路由、管理虚拟网络设备等。NetworkManager还提供了更多的功能和灵活性,例如自动检测和配置网络连接、Wi-Fi管理、VPN支持等。

例如,在配置一个静态IP时,可以在/etc/netplan/下创建一个YAML文件,指定要配置的网卡以及相关的IP地址、网关和DNS等信息,然后执行netplan apply命令,netplan会将这些配置转换为NetworkManager的配置文件并应用,从而实现静态IP的配置。










Netplan 通过 YAML 配置抽象动态生成后端配置的方式操控 NetworkManager,实现网络管理的统一化和简化。以下是其核心机制与操作流程:


     一、配置转换与生成

  1. YAML 配置解析
    Netplan 读取 /etc/netplan/*.yaml 中的 YAML 文件,解析用户定义的网络参数(如 IP 地址、DNS、路由等),并根据 renderer: NetworkManager 的声明,生成 NetworkManager 兼容的配置。

  2. 生成 NetworkManager 的 Keyfile 配置
    Netplan 将 YAML 配置转换为 NetworkManager 的 Keyfile 格式(默认存储路径为 /run/NetworkManager/system-connections/),这些文件包含接口的详细网络参数。
    示例:

    # Netplan YAML 配置
    network:
      version: 2
      renderer: NetworkManager
      ethernets:
        enp0s3:
          dhcp4: no
          addresses: [192.168.1.10/24]
          gateway4: 192.168.1.1
    
    # 生成的 NetworkManager Keyfile 配置(/run/NetworkManager/system-connections/netplan-enp0s3.nmconnection)
    [connection]
    id=netplan-enp0s3
    type=ethernet
    interface-name=enp0s3
    
    [ipv4]
    method=manual
    address1=192.168.1.10/24,192.168.1.1
    dns=8.8.8.8;
    

     二、服务控制与配置生效

  1. 触发 NetworkManager 重载配置
    执行 netplan apply 时,Netplan 会调用 nmcli 命令通知 NetworkManager 重新加载生成的配置文件,使新配置生效。

    # 底层操作等效于
    nmcli connection reload
    nmcli connection up <生成的连接名>
    
  2. 配置持久化
    Netplan 生成的 Keyfile 配置默认存储在 /run/(临时目录),需手动保存到 /etc/NetworkManager/system-connections/ 以实现持久化。


     三、功能覆盖与特性支持

  1. 图形界面整合
    Netplan 通过生成 Keyfile 配置,与 NetworkManager 的图形界面(如 GNOME 网络设置)无缝兼容。用户在图形界面修改网络参数后,Netplan 会优先读取并应用这些动态生成的配置。

  2. 高级功能支持
    Netplan 支持通过 YAML 配置 NetworkManager 管理的以下功能:
    WiFi 连接:定义 SSID、密码、安全协议等。
    VPN 配置:通过 networkmanager.connection.uuid 关联 VPN 连接。
    动态与静态 IP 混合配置:例如同时启用 DHCP 和静态地址。


     四、调试与注意事项

  1. 查看生成的配置

    ls /run/NetworkManager/system-connections/  # 临时配置
    ls /etc/NetworkManager/system-connections/  # 持久化配置
    
  2. 日志与状态查询

    journalctl -u NetworkManager  # 查看 NetworkManager 日志
    nmcli connection show         # 显示当前激活的连接
    
  3. 关键区别(与 systemd-networkd 对比)
    接口激活行为:NetworkManager 默认自动激活有物理连接的接口,而 systemd-networkd 需显式配置 optional: false
    配置文件路径:NetworkManager 使用 Keyfile,systemd-networkd 使用 .network 文件。











Netplan 通过生成 NetworkManager 可识别的配置文件,间接控制网络配置,其操作流程可分为以下关键步骤:

1. 配置文件解析阶段

  • Netplan 读取 /etc/netplan/*.yaml 中的 YAML 格式配置(如定义以太网静态 IP、WiFi 认证信息等)
  • 通过 netplan generate 命令将配置转换为 NetworkManager 的 keyfile 格式(存储在 /run/netplan/*.nmconnection

2. 配置注入机制

  • 生成的文件包含 NetworkManager 所需的完整参数(示例片段):
    [connection]
    id=Wired-Connection
    type=ethernet
    [ipv4]
    addresses=192.168.1.100/24
    gateway=192.168.1.1
    dns=8.8.8.8;
    
  • 这些文件被符号链接到 /etc/NetworkManager/system-connections/ 目录,触发 NetworkManager 的监控机制

3. 服务交互流程

  • NetworkManager 通过 nmcli 或 D-Bus 接口检测到新配置
  • 执行 netplan apply 时会调用 NetworkManager.reload() 方法刷新配置缓存
  • 对于动态配置(如 WiFi),NetworkManager 会根据 keyfile 中的 ssidpsk 自动发起连接请求

4. 状态同步机制

  • NetworkManager 将连接状态写入 /run/NetworkManager/state
  • Netplan 通过 networkd-dispatcher 监听网络状态变化,实现配置生效后的自动化操作(如服务重启)

典型配置示例

network:
  version: 2
  renderer: NetworkManager
  wifis:
    mywifi:
      dhcp4: true
      access-points:
        "Home-SSID":
          password: "s3cr3t"

该配置会生成包含预共享密钥(PSK)的 WiFi 连接配置文件,NetworkManager 在扫描到对应 SSID 时自动完成认证。

对比直接控制

  • 不同于直接调用 nmcli 命令,Netplan 通过声明式配置实现了配置版本控制
  • 支持多后端渲染(可同时管理 NetworkManager 和 systemd-networkd)
  • 提供配置校验机制(如 netplan try 预览配置效果)

通过这种设计,Netplan 在保持 NetworkManager 原有功能完整性的同时,提供了更简洁、可维护的网络配置管理方式。










Netplan 通过将 YAML 配置文件转换为 NetworkManager 的 Keyfile 格式,并通过 nmcliNetworkManager 服务动态加载配置来管理网络。以下是详细流程:


     1. 配置文件定义
用户需在 /etc/netplan/ 目录下的 YAML 文件中明确指定 renderer: NetworkManager,例如:

network:
  version: 2
  renderer: NetworkManager  # 指定使用 NetworkManager
  ethernets:
    eth0:
      dhcp4: true
  wifis:
    wlan0:
      access-points:
        "MyWiFi":
          password: "s3cr3tp@ss"
      dhcp4: true

     2. 配置转换
当执行 netplan generatenetplan apply 时,Netplan 将 YAML 配置转换为 NetworkManager 的 Keyfile 格式(默认路径为 /etc/NetworkManager/system-connections/),例如:
生成文件 netplan-wlan0-MyWiFi.nmconnection,内容如下:

[connection]
id=MyWiFi
type=wifi
interface-name=wlan0
uuid=12345678-1234-5678-1234-567812345678  # 自动生成唯一标识

[wifi]
mode=infrastructure
ssid=MyWiFi

[wifi-security]
key-mgmt=wpa-psk
psk=s3cr3tp@ss

[ipv4]
method=auto

[ipv6]
method=ignore

     3. 触发 NetworkManager 重载
Netplan 通过以下步骤激活配置:

  1. 生成 Keyfile:将 YAML 转换为 .nmconnection 文件。
  2. 设置权限:确保文件权限为 600(仅 root 可读写),避免 NetworkManager 拒绝加载。
  3. 通知 NetworkManager
    • 调用 nmcli connection reload 重新加载配置。
    • 若接口需重新激活,执行 nmcli connection up <name>
  4. 服务依赖:确保 NetworkManager 服务运行(systemctl enable --now NetworkManager)。

     4. 关键特性与交互

  • 混合渲染器支持
    可在同一 Netplan 文件中为不同接口指定不同渲染器(如有线用 networkd,无线用 NetworkManager)。
  • 动态连接管理
    NetworkManager 负责 Wi-Fi、VPN、移动网络等复杂场景,Netplan 仅生成静态定义。
  • 持久化与临时配置
    • 持久化配置:保存到 /etc/NetworkManager/system-connections/
    • 临时配置:可通过 nmcli 直接修改(但需注意 Netplan 重新应用时会覆盖)。

     5. 调试与验证

  • 检查生成的 Keyfile
    sudo cat /etc/NetworkManager/system-connections/netplan-eth0.nmconnection
    
  • 查看 NetworkManager 连接状态
    nmcli connection show
    nmcli device status
    
  • 查看日志
    journalctl -u NetworkManager -f  # 实时日志
    

     示例:YAML 到 NetworkManager Keyfile 的转换
Netplan YAML:

network:
  version: 2
  renderer: NetworkManager
  ethernets:
    eth0:
      addresses: [192.168.1.10/24]
      gateway4: 192.168.1.1
      nameservers:
        addresses: [8.8.8.8, 1.1.1.1]

生成的 /etc/NetworkManager/system-connections/netplan-eth0.nmconnection:

[connection]
id=netplan-eth0
type=ethernet
interface-name=eth0
uuid=abcd1234-abcd-1234-abcd-1234abcd1234

[ipv4]
address1=192.168.1.10/24,192.168.1.1
dns=8.8.8.8;1.1.1.1;
method=manual

[ipv6]
method=ignore

     6. 与 NetworkManager 的协作细节

  • 自动连接控制
    通过 autoconnect: true/false 在 YAML 中定义是否自动激活连接。
  • Wi-Fi 和复杂场景
    Netplan 支持 Wi-Fi、VLAN、网桥等配置,但复杂功能(如 VPN)仍需直接使用 nmcli 或 GUI 工具。
  • 冲突处理
    如果手动通过 nmcli 修改连接,Netplan 重新应用时会覆盖这些更改(除非手动配置被标记为 autoconnect: false)。

     关键点总结

  • 抽象层角色:Netplan 作为配置生成器,简化了 NetworkManager 的 Keyfile 编写。
  • 静态配置为主:适合定义基础网络连接,动态功能仍需依赖 NetworkManager 自身工具。
  • 权限与路径:生成的 Keyfile 必须符合 NetworkManager 的安全要求(权限 600)。

通过这种方式,Netplan 为用户提供了统一的 YAML 配置入口,同时充分利用了 NetworkManager 的灵活性和动态管理能力。










Netplan 通过配置文件和生成的配置与 NetworkManager 进行交互和控制。以下是其核心机制和步骤:


     1. 配置文件定义
用户通过编写 YAML 格式的 Netplan 配置文件(通常位于 /etc/netplan/ 目录下),并明确指定 renderer: NetworkManager,告知 Netplan 将网络配置传递给 NetworkManager。关键点:

  • renderer 参数:必须设置为 NetworkManager,例如:
    network:
      version: 2
      renderer: NetworkManager
      ethernets:
        enp0s3:
          dhcp4: yes
          addresses: [192.168.1.100/24]
          gateway4: 192.168.1.1
          nameservers:
            addresses: [8.8.8.8, 8.8.4.4]
    

     2. 生成配置文件
当用户执行 sudo netplan generate 时:

  • Netplan 解析 YAML 配置,并将其转换为 NetworkManager 可识别的格式
  • 生成的配置文件:Netplan 会将配置写入 /etc/NetworkManager/system-connections/ 目录下的 .nmconnection 文件(即 NetworkManager 的连接配置文件)。例如:
    [connection]
    id=enp0s3
    type=ethernet
    interface-name=enp0s3
    
    [ipv4]
    method=manual
    addresses=192.168.1.100/24
    gateway=192.168.1.1
    dns=8.8.8.8;8.8.4.4
    

     3. 应用配置
执行 sudo netplan apply 后:

  • 触发 NetworkManager 重新加载配置:Netplan 会通知 NetworkManager 重新读取 /etc/NetworkManager/system-connections/ 目录下的配置文件。
  • 动态应用网络设置:NetworkManager 根据新配置文件动态更新网络接口(如分配 IP、设置路由、DNS 等),无需重启系统。

     4. 与 NetworkManager 的交互细节

  • 配置文件覆盖
    • Netplan 生成的 .nmconnection 文件会覆盖 NetworkManager 原有的手动配置(如通过 nmcli 或图形界面设置的内容)。
    • 如果多个 Netplan 配置文件配置同一接口,Netplan 会合并配置(可能存在冲突,需注意优先级)。
  • 动态修改
    • 使用 netplan set 命令可以直接修改配置并自动生成或更新 .nmconnection 文件。例如:
      sudo netplan set ethernets.enp0s3.dhcp4=true
      
      这会直接修改对应的 .nmconnection 文件中的 ipv4.method=auto

     5. 服务依赖与冲突处理

  • 确保 NetworkManager 启用并运行
    sudo systemctl enable NetworkManager --now
    
  • 禁用其他网络管理工具
    • 如果同时安装了 systemd-networkd,需禁用它以避免冲突:
      sudo systemctl stop systemd-networkd
      sudo systemctl disable systemd-networkd
      
    • 确保 NetworkManager 是唯一管理网络的服务(参考知识库[3])。

     6. 核心交互流程总结

  1. 用户配置:编写 Netplan 的 YAML 文件并指定 renderer: NetworkManager
  2. 生成配置netplan generate 将 YAML 转换为 NetworkManager 的 .nmconnection 文件。
  3. 应用配置netplan apply 触发 NetworkManager 重新加载配置并生效。
  4. 服务管理:确保 NetworkManager 正在运行,且无其他网络管理工具干扰。

     注意事项

  • 配置优先级
    • Netplan 的配置文件按文件名排序(如 01-netcfg.yaml 优先于 02-netcfg.yaml)。
    • 若手动修改 NetworkManager 的配置文件(.nmconnection),需注意与 Netplan 生成的配置冲突。
  • 动态更新
    • 修改 Netplan 配置后需手动执行 netplan apply,或重启 NetworkManager 服务:
      sudo systemctl restart NetworkManager
      
  • 调试与验证
    • 检查 NetworkManager 状态:
      nmcli networking on
      nmcli connection show
      
    • 验证接口配置是否生效:
      nmcli device show enp0s3
      

     示例流程

# 1. 编写配置文件(如 /etc/netplan/01-netcfg.yaml)
network:
  version: 2
  renderer: NetworkManager
  ethernets:
    enp0s3:
      dhcp4: no
      addresses: [192.168.1.100/24]
      gateway4: 192.168.1.1
      nameservers:
        addresses: [8.8.8.8]

# 2. 生成并应用配置
sudo netplan generate
sudo netplan apply

# 3. 验证 NetworkManager 是否生效
nmcli connection show
nmcli device status

     知识库关联要点

  • 知识库[1]:说明 NetworkManager 的启用和 nmcli 工具的使用,Netplan 生成的配置会通过 nmcli 的底层机制生效。
  • 知识库[2]:提到 netplan set 命令可以直接修改配置并生成文件,无需手动编辑 YAML。
  • 知识库[3]:强调 Netplan 与 NetworkManager 的协作关系,需避免与其他工具(如 systemd-networkd)冲突。

通过上述机制,Netplan 作为配置前端,将用户友好的 YAML 配置转化为 NetworkManager 的连接文件,实现对网络的集中管理和动态控制。











     1. 配置解析与后端选择

  • YAML定义:用户通过/etc/netplan/*.yaml文件声明网络需求(如接口、IP、路由等),并通过renderer: NetworkManager指定后端。
  • 示例配置
    network:
      version: 2
      renderer: NetworkManager
      ethernets:
        enp0s3:
          dhcp4: true
    

     2. 生成NetworkManager原生配置

  • 文件生成:执行netplan apply时,Netplan将YAML配置转换为NetworkManager可识别的.nmconnection文件,存储在/etc/NetworkManager/system-connections/目录下。
  • 配置文件示例
    [connection]
    id=netplan-enp0s3
    type=ethernet
    interface-name=enp0s3
    
    [ipv4]
    method=auto
    
    [ethernet]
    mac-address=00:11:22:33:44:55
    

     3. 触发NetworkManager重载

  • 服务控制:Netplan通过DBus向NetworkManager发送reload指令(等效于nmcli connection reload),强制重新加载所有连接配置。
  • 生效验证:可通过nmcli connection show查看生成的连接名称(如netplan-enp0s3),确认配置已生效。

     4. 优先级与冲突处理

  • 声明式管理:Netplan生成的配置标记为managed by netplan,手动通过nmcli修改可能被后续netplan apply覆盖。
  • 查看状态:使用networkctl status(systemd-networkd)或nmcli device status确认当前活跃的后端。

     关键技术细节

  • 原子化操作:Netplan通过nmcli--offline模式生成配置文件,避免直接操作实时连接,确保配置事务一致性。
  • 多后端兼容:同一系统可混合使用NetworkManager(桌面环境)与systemd-networkd(服务器服务),通过renderer字段按需分配接口。

     典型问题排查

  1. 配置未生效

    • 检查renderer是否设为NetworkManager
    • 执行journalctl -u NetworkManager查看服务日志
  2. 权限问题

    • 确保netplan applysudo执行,否则无法写入/etc/NetworkManager/
  3. 手动修改冲突

    • 避免混用nmtui和Netplan,或在YAML中明确所有配置项

通过以上流程,Netplan以声明式配置驱动NetworkManager,实现网络管理的简化和标准化。




















http://www.kler.cn/a/599461.html

相关文章:

  • 车载以太网网络测试 -23【TCPUDP通信示例】
  • 蓝桥杯——嵌入式学习日记
  • 借助AI Agent实现数据分析
  • Python虚拟环境:从入门到实战指南
  • 在 ASP.NET Core 中实现限流(Rate Limiting):保护服务免受滥用与攻击
  • ABB机器人更换机器人本体编码器电池的具体步骤
  • 蓝桥杯,冬奥大抽奖
  • 中间件解析漏洞之Tomcat集合
  • 操作系统必知的面试题
  • Maven 构建配置文件
  • 计算机操作系统(四) 操作系统的结构与系统调用
  • 盖泽 寻边器 帮助类
  • C#中状态机Stateless初使用
  • 建库字符集选择`utf8mb4` + `utf8mb4_unicode_ci` 组合
  • 解决 IntelliJ IDEA 方法断点导致程序无法运行的问题
  • python面试高频考点(深度学习大模型方向)
  • 【AndroidRTC-10】webrtc是如何确定双端的编解码类型?
  • C/C++蓝桥杯算法真题打卡(Day10)
  • RAG优化:python从零实现时间管理大师Self-RAG
  • 剑指 Offer II 117. 相似的字符串