一、问题背景与影响场景

不少玩树莓派的朋友,不管是用它做家庭NAS、智能家居中枢,还是跑小型开发服务,大概率都遇到过突然断网的情况——本来好好的,改了点网络相关的配置,或者系统自动更了个新,再开机就连不上WiFi、插网线也没反应,连SSH都登不进去。这种情况里,有一类特别常见的原因,就是树莓派自带的网络管理工具dhcpcd,和后来装的NetworkManager起了冲突。

先给大家说清楚这俩工具是啥,为啥会打架。树莓派刚出厂装的Raspberry Pi OS,默认用的是dhcpcd,它的作用就是帮树莓派自动获取IP地址、管理网络连接,就像你手机里“自动连接WiFi”的功能,简单够用,但功能比较基础,比如没法可视化管理多个WiFi、不能一键切换热点模式。

后来很多用户为了方便,会自己装NetworkManager,这是个更强大的网络管理工具,能做的事更多,比如可以用命令行或者图形界面管理多个WiFi、配置VPN、甚至做网络桥接。但问题来了:Raspberry Pi OS默认的网络配置逻辑是围绕dhcpcd设计的,你装了NetworkManager之后,要是没改系统的默认配置,俩工具就会抢着管网络,比如dhcpcd要给网卡设IP,NetworkManager也来设,最后系统不知道听谁的,网络就乱了,直接断网。

这类冲突的常见场景有三个:第一是刚装完NetworkManager没做后续配置就重启;第二是系统自动更新之后,dhcpcd的配置被重置,又和NetworkManager冲突;第三是手动改了dhcpcd的配置文件,不小心和NetworkManager的配置撞了规则。

二、冲突的核心原理与排查方法

2.1 冲突的核心原理

树莓派的网络管理有个优先级逻辑,同一时间只能有一个工具“说了算”,不然就会出现规则打架。dhcpcd和NetworkManager的冲突,本质就是两个工具同时修改网卡的配置,比如IP地址、DNS服务器、网关地址这些关键参数,系统没法判断哪个配置是对的,最后直接把网络搞死。

举个例子,你家的门钥匙有俩主人,一个说“我来锁门”,一个说“我来开门”,结果门要么锁死开不了,要么开着关不上,就是这个道理。

2.2 排查冲突的方法

要是你怀疑是俩工具冲突导致的断网,可以先做两个简单的排查操作: 第一,检查俩工具是不是都在运行。因为树莓派断网之后没法远程连接,所以你得找个显示器、键盘插在树莓派上,或者把树莓派的SD卡拔下来,插在另一台电脑上做操作(后面会说怎么弄)。如果是插显示器键盘的情况,打开终端,输入下面的命令:

# 检查dhcpcd是不是在运行
systemctl status dhcpcd
# 检查NetworkManager是不是在运行
systemctl status NetworkManager

要是两个命令的输出里,都显示“active (running)”,那大概率就是俩工具冲突了。

第二,检查网络配置文件。Raspberry Pi OS默认的网络配置文件是/etc/network/interfaces,这个文件是dhcpcd的核心配置文件,要是这个文件里的配置,和NetworkManager的配置冲突,也会出问题。

三、冲突的修复步骤

修复的核心逻辑很简单:要么彻底卸载NetworkManager,只留dhcpcd;要么彻底禁用dhcpcd,让NetworkManager全权管网络。两个方法选一个就行,别两个都弄。

3.1 方法一:卸载NetworkManager,只留dhcpcd

这个方法适合不需要NetworkManager的高级功能,只想恢复默认网络的朋友,操作简单,不容易出问题。

步骤1:停止并禁用NetworkManager服务 先把正在运行的NetworkManager停掉,再设成开机不启动,命令如下:

# 停止NetworkManager服务
systemctl stop NetworkManager
# 禁用NetworkManager服务,开机不启动
systemctl disable NetworkManager

步骤2:卸载NetworkManager 用apt命令卸载,命令如下:

# 卸载NetworkManager
apt remove --purge network-manager

这里的--purge参数是把NetworkManager的配置文件也一起删掉,避免残留配置影响。

步骤3:恢复dhcpcd的配置 卸载完之后,要把dhcpcd的配置恢复成默认,先打开dhcpcd的配置文件:

# 打开dhcpcd配置文件
nano /etc/dhcpcd.conf

然后把文件里的内容清空,换成默认的配置,默认配置的内容如下:

# 配置dhcpcd的核心参数
# 忽略默认的网络配置文件,避免冲突
denyinterfaces wlan0 eth0
# 配置有线网卡eth0的自动获取IP
interface eth0
# 配置无线网卡wlan0的自动获取IP
interface wlan0
# 配置DNS服务器,用谷歌的公共DNS,稳定
static domain_name_servers=8.8.8.8 8.8.4.4

改完之后按Ctrl+O保存,Ctrl+X退出nano编辑器。

步骤4:重启网络服务,测试网络 重启dhcpcd服务,再重启树莓派,测试网络是不是正常:

# 重启dhcpcd服务
systemctl restart dhcpcd
# 重启树莓派
reboot

重启之后,你可以试试能不能连WiFi,或者插网线能不能上网,要是能正常访问网站,就说明修复成功了。

3.2 方法二:禁用dhcpcd,让NetworkManager全权管网络

这个方法适合需要用NetworkManager的高级功能,比如管理多个WiFi、配置VPN的朋友,操作稍微复杂一点,但后续用起来更方便。

步骤1:停止并禁用dhcpcd服务 先把dhcpcd停掉,再设成开机不启动,命令如下:

# 停止dhcpcd服务
systemctl stop dhcpcd
# 禁用dhcpcd服务,开机不启动
systemctl disable dhcpcd

步骤2:修改NetworkManager的配置,让它接管所有网卡 打开NetworkManager的配置文件:

# 打开NetworkManager的配置文件
nano /etc/NetworkManager/NetworkManager.conf

然后找到[main]这一段,在下面加一行:

# 让NetworkManager接管所有网卡
plugins=keyfile
managed=true

改完之后保存退出。

步骤3:配置NetworkManager的网络连接 要是你之前连过WiFi,NetworkManager会自动识别,但要是没连过,或者需要配置有线网络,就用nmcli命令来配置。比如配置WiFi连接,命令如下:

# 配置WiFi连接,SSID是你的WiFi名称,password是你的WiFi密码
nmcli dev wifi connect "你的WiFi名称" password "你的WiFi密码"

要是配置有线网络,命令如下:

# 配置有线网卡eth0自动获取IP
nmcli con add type ethernet con-name "有线连接" ifname eth0
# 配置有线网卡的DNS服务器
nmcli con mod "有线连接" ipv4.dns "8.8.8.8 8.8.4.4"
# 激活有线连接
nmcli con up "有线连接"

步骤4:重启NetworkManager服务,测试网络 重启NetworkManager服务,再重启树莓派,测试网络是不是正常:

# 重启NetworkManager服务
systemctl restart NetworkManager
# 重启树莓派
reboot

重启之后,测试网络正常,就说明修复成功了。

3.3 远程修复方案(没法插显示器键盘的情况)

要是你没法插显示器键盘,只能把SD卡拔下来插在另一台电脑上,也能修复。操作步骤如下: 第一,把SD卡插在电脑上,找到SD卡里的根分区(就是树莓派系统的根目录)。 第二,要是你选方法一(卸载NetworkManager),就打开根分区里的/etc/dhcpcd.conf文件,改成默认配置,然后删除根分区里的/etc/systemd/system/multi-user.target.wants/NetworkManager.service文件(这个文件是NetworkManager的开机启动文件)。 第三,要是你选方法二(禁用dhcpcd),就打开根分区里的/etc/systemd/system/multi-user.target.wants/dhcpcd.service文件,把里面的内容改成:

# 禁用dhcpcd服务
[Unit]
Description=dhcpcd
After=network.target

[Service]
Type=simple
ExecStart=/bin/true

[Install]
WantedBy=multi-user.target

然后打开根分区里的/etc/NetworkManager/NetworkManager.conf文件,改成和方法二里的配置一样。 改完之后把SD卡插回树莓派,开机测试网络。

四、修复后的验证与后续注意事项

4.1 修复后的验证方法

修复完之后,你可以用两个方法验证网络是不是正常: 第一,用ping命令测试,比如ping百度的IP:

# ping百度的IP,测试网络连通性
ping 180.101.49.11

要是能收到回复,说明网络连通正常。 第二,用ping命令测试域名解析,比如ping百度的域名:

# ping百度的域名,测试域名解析正常
ping www.baidu.com

要是能收到回复,说明域名解析也正常,网络完全没问题。

4.2 后续的注意事项

修复完之后,为了避免再次出现冲突,要注意三个点: 第一,不要同时装dhcpcd和NetworkManager,选一个用就行。要是你装了NetworkManager,一定要禁用dhcpcd;要是你用dhcpcd,就不要装NetworkManager。 第二,改网络配置的时候,一定要用你选的那个工具来改。比如你选了NetworkManager,就用nmcli命令来改网络配置,不要改dhcpcd的配置文件;要是你选了dhcpcd,就改dhcpcd的配置文件,不要用NetworkManager来改。 第三,系统更新之后,要检查一下俩工具的状态。要是系统更新之后,dhcpcd又被设成开机启动了,就再禁用一次。

五、两种方案的优缺点对比

5.1 卸载NetworkManager,只留dhcpcd的优缺点

优点:操作简单,不容易出问题,适合新手,后续维护成本低。 缺点:功能比较基础,没法管理多个WiFi,没法配置VPN,不能可视化管理网络。

5.2 禁用dhcpcd,让NetworkManager全权管网络的优缺点

优点:功能强大,能管理多个WiFi,能配置VPN,能可视化管理网络,适合有高级需求的用户。 缺点:操作稍微复杂一点,要是配置不当,容易出问题,后续维护成本高。

六、应用场景总结

这种冲突导致的断网,主要出现在树莓派的用户身上,不管是新手还是老玩家,都可能遇到。新手可能是不知道俩工具会冲突,装了NetworkManager之后没改配置;老玩家可能是改了配置,或者系统更新之后出了问题。

修复的核心就是统一网络管理工具,要么用dhcpcd,要么用NetworkManager,不要让俩工具抢着管网络。新手建议选卸载NetworkManager的方案,操作简单,不容易出问题;有高级需求的用户,建议选禁用dhcpcd的方案,后续用起来更方便。