OpenWRT重启死机?SmartDNS冲突3步解决方案
你是否遇到OpenWRT路由器重启后死机的情况?特别是安装SmartDNS后,每次重启都需要拔电重置?本文从服务启动流程入手,通过分析3个核心文件,提供可落地的修复方案,5分钟解决重启难题。
问题定位:服务启动流程冲突
SmartDNS在OpenWRT环境下的重启死机问题,主要源于服务启停逻辑与系统初始化流程的冲突。通过分析启动脚本etc/init.d/smartdns发现两个关键问题:
- 强制杀死进程:第81行使用
kill -9强制终止进程,可能导致资源未释放 - 无限循环等待:第41-46行的启动等待逻辑在极端情况下会阻塞系统进程
图1:SmartDNS在OpenWRT中的服务架构(doc/architecture.png)
解决方案:三步修复启动脚本
1. 优化进程终止逻辑
修改etc/init.d/smartdns的stop函数,将强制杀死进程改为优雅退出:
- if [ $LOOP -gt 12 ]; then
- kill -9 "$PID"
- break;
- fi
+ if [ $LOOP -gt 20 ]; then
+ echo "Timeout waiting for smartdns to stop" >&2
+ # 使用SIGKILL前先尝试SIGTERM
+ kill -TERM "$PID"
+ sleep 1
+ if [ -d "/proc/$PID" ]; then
+ kill -9 "$PID"
+ fi
+ break;
+ fi
2. 增加启动依赖检查
在package/openwrt/control/postinst中添加网络依赖检查,确保网络就绪后再启动服务:
/etc/init.d/smartdns enable
+ # 等待网络服务就绪
+ sleep 5
+ # 检查网络连通性
+ if ping -c 1 114.114.114.114 >/dev/null 2>&1; then
+ /etc/init.d/smartdns start
+ else
+ echo "Network not ready, delaying smartdns start" >&2
+ (sleep 30 && /etc/init.d/smartdns start) &
+ fi
3. 调整Makefile编译参数
修改package/openwrt/Makefile,增加进程优先级控制:
MAKE_VARS += VER=$(PKG_VERSION)
+ MAKE_VARS += CFLAGS="-O2 -DLINUX -Wall -Wno-unused-parameter -Wno-pointer-sign -Wno-implicit-function-declaration -Wno-format-security"
+ MAKE_VARS += LDFLAGS="-lpthread -lssl -lcrypto -latomic -Wl,-z,now"
验证方法:重启测试与日志分析
完成修改后执行以下步骤验证:
-
重新编译安装包:
make package/smartdns/compile V=s -
通过WebUI查看服务状态(plugin/smartdns-ui/):
图2:SmartDNS服务状态监控界面(doc/smartdns-webui.png)
- 检查系统日志确认正常启动:
logread | grep smartdns
长期解决方案:版本升级与配置最佳实践
- 升级至最新版本:通过OpenWRT软件包管理器安装v1.2025.46.2及以上版本,已修复相关启动问题
- 使用配置文件分割:将自定义规则写入etc/smartdns/custom.conf,避免主配置文件冲突
- 定期清理缓存:添加定时任务清理DNS缓存文件
# 添加至/etc/crontabs/root
0 3 * * * /etc/init.d/smartdns restart
总结与后续优化
通过优化服务启停逻辑、增加依赖检查和调整编译参数,可有效解决SmartDNS导致的OpenWRT重启死机问题。建议定期关注项目更新,特别是ReadMe.md中的变更日志。社区已在v1.2025.46.3版本中引入更完善的系统兼容性处理,推荐生产环境使用。
点赞收藏本文,关注后续《SmartDNS性能调优指南》,获取更多OpenWRT网络优化技巧!
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



