包括Arch Linux在内的诸多Linux发行版,默认的DHCP客户端是dhcpcd。但它并不是放之四海都适用,我在不同的电脑使用时,就遭遇严重的问题。而换用另一款DHCP客户端——dhclient后,竟然都能迎刃而解。
区别dhcpcd和dhclient
在发行版中,dhcpcd默认以守护进程的方式运行,并注册成一个系统服务。即使没有安装NetworkManager等网络管理工具,只要服务启动且网络环境适宜,就能自动配置好DHCP。用介质安装Arch Linux那会,你永远也忘不了插上网线就能马上开始敲命令安装的快感(前提是你的路由器打开了DHCP功能)。
dhclient则相反,一次性运行,在需要的时候调用,在Arch Linux中不会注册服务。NetworkManager会在联网时自动调用它,来为本机获取IP地址。
实际上,dhclient是BSD系统的默认DHCP客户端,它也可以像dhcpcd那样当作守护进程使用——dhclient -d
。这种用法被一些教程视为首选,但在拥有NetworkManager等网管工具的情况下没有必要这么做。
我碰到的问题1:与KDE不兼容
之前在ThinkPad X200安装Arch Linux + KDE的时候,只要一连接无线热点,则KDE Plasma桌面就会崩溃,非常影响使用。后来一查,就是dhcpcd导致的问题,可能是当时KDE、NetworkManager与dhcpcd的交互机制没写好。
我也懒得深究原因,得知还有另一款DHCP客户端——dhclient,于是果断换掉。
关闭无线开关,插上网线,运行以下命令更换(注意保持网络连接后再运行):
1 |
|
此时,重新打开无线,连接正常,KDE没有再崩溃。干脆就把dhcpcd也卸载了。
我碰到的问题2:与个别OpenWRT路由器不兼容
我手上有一台刷了OpenWRT的路由器,默认打开了DHCP和DHCPv6客户端。然而,几台手机都能连得上,就是现在用的ThinkPad R400连不上——同样是Arch Linux。KDE报错“接口错误”。
打开内核日志,出现类似下面的内容:
1 |
|
也参考了以下的Arch Linux论坛帖子:
- Random “deauthenticating by local choice (Reason: 3=DEAUTH_LEAVING)”
- wlan deauth immediately after auth by local choice (reason=3)
很遗憾,下面的讨论无一例外云里雾里,要么是固件问题,要么是系统配置问题……总之离我的情况相去甚远。
之后又给电脑上的WLAN接入点设置了静态IPv4地址,又尝试取消路由器的热点加密,仍然未果,情况一模一样。
看似山穷水尽了,结合上文,我灵机一动——会不会也是dhcpcd的锅?这次连接失败,就是卡在无法通过DHCP获取网络地址这一关。
索性按上文的方法,卸掉dhcpcd,换成dhclient,问题解决!连接相较于其他接入点要慢,但起码能愉快连上了。
总结
不要死死抱着dhcpcd不放。
dhcpcd使用起来固然方便,可是有些网络连接问题,比如莫名其妙无法获取IP地址而无法联网的问题,有可能就与dhcpcd有关,不妨尝试换成dhclient。
目前NetworkManager似乎只支持dhcpcd和dhclient。还有一款DHCP客户端是ISC DHCP,不能确定NetworkManager是否支持它。
- 本文作者: 爱拼安小匠
- 本文链接: https://anclark.github.io/2022/06/13/Struggle_with_Linux/Prefer_dhclient/
- 版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-ND 3.0(署名-非商用-禁止演绎 3.0) 许可协议。转载请注明出处!