问题描述
操作系统
Ubuntu 20.04.6 LTS (GNU/Linux 4.19.115 aarch64)
前置条件
已经在/etc/netplan目录中添加了设备网口enaphyt4i0的netplan配置yaml文件,文件内容如下:
network:
version: 2
ethernets:
enaphyt4i0:
dhcp6: false
dhcp4: false
addresses: [ 192.168.29.22/24 ]
问题现象
通过netplan命令应用配置,未提示错误和警告,但是设备网口enaphyt4i0的ip地址未生效。
背景知识
netplan介绍
官网链接:https://netplan.io/
Netplan 是一个实用程序,用于在 linux 系统上轻松配置网络。您只需创建所需网络接口的 YAML 描述以及每个网络接口应配置为执行的操作即可。根据此描述,Netplan 将为您选择的渲染器工具生成所有必要的配置。
其工作原理是:Netplan 读取由管理员、安装程序、云映像实例化或其他操作系统编写的网络配置(配置位置:/etc/netplan/*.yaml)。在早期启动期间,Netplan 会生成特定于后端的配置文件,以将设备的控制权移交给特定的网络守护程序。
当前netplan支持NetworkManager和Systemd-networkd的两种后端。
netplan的操作命令是:netplan,具体操作可以参考命令的帮助说明。
systemd-networkd介绍
systemd
Systemd 是 Linux 系统工具,用来启动守护进程,已成为大多数发行版的标准配置。
Systemd的设计初衷是解决传统linux使用init进程作为启动管理的串行、启动脚本复杂的弊端,其目标是为系统的启动和管理提供一套完整的解决方案。
Systemd 的优点是功能强大,使用方便,缺点是体系庞大,非常复杂。事实上,现在还有很多人反对使用 Systemd,理由就是它过于复杂,与操作系统的其他部分强耦合,违反"keep simple, keep stupid"的Unix 哲学。
systemd的命令是:systemctl,具体操作可以参考命令的帮助说明。
systemd-networkd
systemd-networkd是systemd 210版增加的简单的网络管理器,它在Linux系统的后台运行,管理网络配置。它可以在插入网络设备时检测网络设备,甚至可以创建虚拟网络设备。这个工具对于复杂的网络配置特别有用,比如服务器和容器。
systemd-networkd服务通过如下明令使能:
systemctl enable systemd-networkd.service
systemctl start systemd-networkd.service
设备启动时会自动加载网络配置,网络设备的配置以.network作为后缀,有三个存放位置:
- 系统网络目录(/usr/lib/systemd/network)
- 运行时网络目录(/run/systemd/network)
- 本机网络目录(/etc/systemd/network)。
所有的Network文件(无论位于哪个目录中),统一按照文件名的字典顺序处理。 对于不同目录下的同名Network文件,仅以优先级最高的目录中的那一个为准。 具体说来就是:/etc/ 的优先级最高、 /run/ 的优先级居中、/usr/lib/ 的优先级最低。 如果系统管理员想要屏蔽 /usr/lib/ 目录中的某个Network文件, 那么最佳做法是在 /etc/ 目录中创建一个指向 /dev/null 的同名符号链接, 即可彻底屏蔽 /usr/lib/ 目录中的同名文件。
networkctl
Networkctl 是一个命令行实用程序,用于查看网络设备及其连接状态的摘要。它允许您查询和控制 Linux 网络子系统。它是 Ubuntu 18.04 新版本 systemd 中的新命令之一。它显示 systemd-networkd 看到的网络链接的状态。
注意:在运行networkctl之前,请确保systemd-networkd正在运行,否则您将得到不完整的输出,并显示以下错误:
WARNING: systemd-networkd is not running, output will be incomplete.
networkctl命令的帮助信息如下:
networkmanager介绍
NETworkManager是一款功能强大的网络管理与问题排除工具,该工具完全开源,可以帮助广大研究人员轻松管理目标网络系统并排除网络疑难问题。
networkmanager的命令是:nmcli,具体操作可以参考命令的帮助说明。
问题定位过程
打开netplan的debug模式,查看过程日志
在netplan命令中添加–debug选项,查看netplan的执行过程日志:
发现netplan的执行过程无异常,问题应该在后端阶段。
修改netplan的yaml配置文件改为使用networkmanager作为后端
服务器版ubuntu的netplan的默认后端为systemd-networkd,桌面版ubuntu的netplan默认后端为NetworkManager。
在yaml文件中指定后端为NetworkManager:
network:
version: 2
renderer: NetworkManager
ethernets:
enaphyt4i0:
dhcp6: false
dhcp4: false
addresses: [ 192.168.29.22/24 ]
修改后问题未解决,通过nmcli后发现一些系列问题,如需要使能NetworkManager服务、NetworkManager与网口之间未连接等。
暂时否决该路线,继续定位systemd-networkd的方案中的问题。
聚焦于systemd-networkd阶段
查找netplan的输出systemd-networkd的输入文件
运行netplan后,会根据/etc/netplan中的配置在systemd-networkd的/run/systemd/network目录生成后端的配置文件:
注:如果后端使用NetworkManager时,会在/run/NetworkManager/system-connections/目录中生成后端的配置文件:
通过查看/run/systemd/network/10-netplan-enaphyt4i1.network 可以发现systemd-networkd的配置文件没有问题。
查看系统日志
通过命令cat /var/log/syslog查看执行netplan apply的后端阶段时systemd-networkd的提示信息:
可以看到网络配置已经下发,但是要等待连接完成才能生效:
Network configuration changed, trying to establish connection.
networkctl命令查看systemd-networkd对网口的管理状态
通过该命令发现,enaphyt4i0处于正在配置中阶段,但是其状态是no-carrier
未连接物理介质的状态。
问题分析
systemd-networkd需要等待网络设备状态就绪后才真正把网络配置(ip地址)设置成功(mtu值得设置限制不受连接状态影响,但是需要网口处于down状态)
解决方案
连接网口enaphyt4i0的网线后,netplan配置生效。