我在 Linux 发行版中使用 3 个 NetworkManager 连接配置文件,所有连接配置文件都引用相同的以太网接口:enp3s0
。我正在使用这些连接来管理:
- 默认静态 IP 配置
- 设置新的静态 IP 配置
- 请求 DHCP 地址
在问题的其余部分我将使用这个术语联系意思是这个词连接配置文件。
要更改以太网配置,我会更改连接的优先级,因此,如果我想启用默认静态 IP 配置,我会设置高于静态 IP 配置和 DHCP 配置的优先级。
阅读该段落“设置 3 个连接的属性”在问题的继续中获取有关连接优先级设置的详细信息。
问题
如果我在启动时通过systemd
服务启动的 bash 脚本创建连接,则一切正常,但如果我在启动完成后执行 bash 脚本,则 NetworkManager 及其连接配置文件无法正确管理 IP 配置。转到该段落“问题”在问题末尾获取错误的详细描述。
问题的其余部分提供了理解问题所需的所有详细信息。
我对问题的长度表示歉意,但需要很多信息。
创建 3 个 NetworkManager 连接配置文件
nmcli
为了创建连接,我使用如下所示的命令:
# for default static
nmcli c add ifname enp3s0 type ethernet con-name ethernet_default_ipstatic
# for ethernet_ipstatic
nmcli c add ifname enp3s0 type ethernet con-name ethernet_ipstatic
# for ethernet_dhcp
nmcli c add ifname enp3s0 type ethernet con-name ethernet_dhcp
执行完路径中的前面的命令后/etc/NetworkManager/system-connections
,将出现 3 个文件,名为:
ethernet_default_ipstatic.nmconnection
ethernet_ipstatic.nmconnection
ethernet_dhcp.nmconnection
设置 3 个连接的属性
前面的命令创建了 3 个具有默认属性的连接,因此创建它们后需要设置它们的属性。为了这个目标,我仍然使用nmcli
如下所示的命令。
对于ethernet_default_ipstatic
连接设置以下属性:
nmcli con mod ethernet_default_ipstatic ipv4.method manual ipv4.addresses 192.168.1.1/24 ipv6.method disabled
上一个命令为连接设置以下属性:
- ipv4.method = 手动(此设置 IP 静态而不是 DHCP)
- IP 地址 192.168.1.1,网络掩码 255.255.255.0(无网关)
- IPV6 已禁用
- 自动连接属性保持默认 yes
- 优先属性仍然是默认 0
对于ethernet_ipstatic
属性是:
nmcli con mod ethernet_ipstatic ipv4.method manual ipv4.addresses 192.168.1.1/24 ipv4.gateway 192.168.1.100 ipv4.may-fail no ipv6.method disabled connection.autoconnect no connection.autoconnect-priority -1
上一个命令为连接设置以下属性:
- ipv4.method = 手动(此设置 IP 静态而不是 DHCP)
- IP地址192.168.1.1,网络掩码255.255.255.0,网关192.168.1.100
- IPV6 已禁用,自动连接否,优先级-1
对于ethernet_dhcp
属性是:
nmcli con mod ethernet_dhcp ipv4.method auto ipv4.addresses '' ipv4.gateway '' ipv4.may-fail no ipv4.dhcp-timeout 20 ipv6.method disabled connection.autoconnect no connection.autoconnect-priority -1 connection.autoconnect-retries 3
上一个命令为连接设置以下属性:
- ipv4.method = auto(设置 DHCP 而不是静态 IP 地址)
- IP地址'',网关''
- IPV6 已禁用,自动连接否,优先级-1
默认配置
通过前面的命令,连接ethernet_default_ipstatic
比其他连接具有优先级,因此以太网接口enp3s0
配置有 IP static 192.168.1.1/24
。
nmcli
由服务执行命令
nmcli
如果我通过以下服务 ( ) 在启动时执行先前的命令,则一切正常my_custom_nm_service.service
:
[Unit]
Description=Init NetworkManager Ethernet Connections
Requires=NetworkManager.service
After=NetworkManager.service
Before=network.target
[Service]
Type=oneshot
ExecStart=/home/<username>/script_services/init_connections.sh
User=<username>
[Install]
WantedBy=multi-user.target
其中init_connections.sh
执行之前的nmcli
命令。
笔记。在单元文件中注意选项的存在:
- 需要=NetworkManager.service
- 之后=NetworkManager.service
- 之前=network.target
问题
如果启动完成后我通过命令删除所有连接,nmcli con del
然后执行脚本,init_connections.sh
我将获得系统的不可预测的 IP 配置。
发生的典型错误配置如下:
- 活动连接(由
nmcli con
命令显示)ethernet_default_ipstatic
因此系统应具有静态 IP 地址192.168.1.1/24
- 但系统已通过 DHCP 服务器获取 IP 地址
init_connections.sh
当服务执行脚本时,就会执行在网络.target之前,但老实说,我不知道这种差异对于理解问题是否重要。
答案1
我发现问题:要正确设置默认配置,我需要执行nmcli con up
如下命令:
nmcli con up "ethernet_default_ipstatic" iface enp3s0
也表明这个帖子。
笔记。此时此刻,对我来说,了解为什么脚本的执行init_connections.sh
在服务启动时运行良好并不重要my_custom_nm_service.service
。我真正感兴趣的是在启动过程结束时运行脚本。
为了完整起见,我编写了测试步骤。
1)删除服务
my_custom_nm_service.service
我已禁用启动脚本执行的服务init_connections.sh
2)删除所有连接
启动完成后,我通过以下脚本删除了所有连接(delete_connections.sh
):
nmcli c del ethernet_default_ipstatic
nmcli c del ethernet_ipstatic
nmcli c del ethernet_dhcp
3)创建3个连接:出现故障
执行脚本init_connections.sh
:
nmcli con add ifname enp3s0 type ethernet con-name ethernet_default_ipstatic
nmcli con mod ethernet_default_ipstatic ipv4.method manual ipv4.addresses 192.168.1.1/24 ipv6.method disabled
nmcli con add ifname enp3s0 type ethernet con-name ethernet_ipstatic
nmcli con mod ethernet_ipstatic ipv4.method manual ipv4.addresses 192.168.1.1/24 ipv4.gateway 192.168.1.100 ipv4.may-fail no ipv6.method disabled connection.autoconnect no connection.autoconnect-priority -1
nmcli con add ifname enp3s0 type ethernet con-name ethernet_dhcp
nmcli con mod ethernet_dhcp ipv4.method auto ipv4.addresses '' ipv4.gateway '' ipv4.may-fail no ipv4.dhcp-timeout 20 ipv6.method disabled connection.autoconnect no connection.autoconnect-priority -1 connection.autoconnect-retries 3
执行脚本后,我的Linux系统出现了问题中描述的问题:
nmcli con
命令告诉活动连接是ethernet_default_ipstatic
(因为它具有更高的优先级)- IP 地址已由 DHCP 服务器分配
4)解决方案:执行nmcli con up
解决办法是执行命令:
nmcli con up "ethernet_default_ipstatic" iface enp3s0
之后接口enp3s0
就有默认的IP地址