包括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,于是果断换掉。
关闭无线开关,插上网线,运行以下命令更换(注意保持网络连接后再运行):
123456# 安装dhclientsudo pacman -S dhclient# 停用dhcpcd服务sudo systemctl disable dhcpcd # 禁止开机自启sudo systemctl stop dhcpcd # 关闭服务
此时,重新打开无线,连接正常,KDE没有再崩溃。干脆就把dhcpcd也卸载了。
我碰到的问题2:与个别OpenWRT路由器不兼容我手上有一台刷了OpenWRT的路由器,默认打开了DHCP和DHCPv6客户端。然而,几台手机都能连得上,就是现在用的ThinkPad R400连不上——同样是Arch Linux。KDE报错“接口错误”。
打开内核日志,出现类似下面的内容:
1234567891011[ 325.430498] wlp2s0: authenticate with 00:3a:9a:32:62:d3[ 325.433405] wlp2s0: send auth to 00:3a:9a:32:62:d3 (try 1/3)[ 325.435168] wlp2s0: authenticated[ 325.437533] wlp2s0: associate with 00:3a:9a:32:62:d3 (try 1/3)[ 325.439710] wlp2s0: RX AssocResp from 00:3a:9a:32:62:d3 (capab=0x431 status=0 aid=4)[ 325.440978] wlp2s0: associated[ 325.618536] wlp2s0: Limiting TX power to 14 dBm as advertised by 00:3a:9a:32:62:d3[ 347.007641] wlp2s0: deauthenticating from 00:3a:9a:32:62:d3 by local choice (Reason: 3=DEAUTH_LEAVING)[ 347.023798] IPv6: ADDRCONF(NETDEV_UP): wlp2s0: link is not ready[ 347.025937] IPv6: ADDRCONF(NETDEV_UP): wlp2s0: link is not ready[ 692.002060] IPv6: ADDRCONF(NETDEV_UP): wlp2s0: link is not ready
也参考了以下的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) 许可协议。转载请注明出处!