嵌入式Linux 3.18开机自动启动WiFi配置求助
看起来你已经做了基础的init.d脚本配置,但没生效大概率是启动时机不对(WiFi模块延迟识别)或者脚本/链接的配置不符合sysvinit规范。我来一步步帮你解决:
一、先排查init.d脚本的基础问题
首先确保你的脚本满足sysvinit的基本要求:
- 开头必须有shebang:
#!/bin/sh - 包含启动/停止的逻辑(即使停止逻辑是空的,也要有对应的case分支)
- 拥有可执行权限:执行
chmod +x /etc/init.d/your-wifi-script.sh
另外,脚本里的wpa_supplicant和dhcpcd最好用绝对路径,避免开机时环境变量没加载导致找不到命令。你可以用which wpa_supplicant和which dhcpcd获取绝对路径,替换脚本里的命令。
二、核心解决:等待WiFi模块就绪
因为你的WiFi模块需要3-4秒才能被识别,直接开机执行脚本肯定会失败。给脚本加一段等待逻辑,直到WiFi接口(比如wlan0)出现:
# 等待WiFi接口wlan0就绪,最多等10秒 MAX_WAIT=10 wait_count=0 while [ $wait_count -lt $MAX_WAIT ]; do # 检查wlan0是否存在 if ip link show wlan0 > /dev/null 2>&1; then echo "WiFi interface wlan0 is ready" break fi sleep 1 wait_count=$((wait_count + 1)) done # 如果超时,直接退出 if [ $wait_count -eq $MAX_WAIT ]; then echo "Error: WiFi interface not found after $MAX_WAIT seconds" exit 1 fi # 下面放你的wpa_supplicant和dhcpcd配置命令 # 比如: # wpa_supplicant -B -i wlan0 -c /etc/wpa_supplicant/wpa_supplicant.conf # dhcpcd wlan0
三、正确设置sysvinit启动链接
手动创建rc.d链接容易出错,建议用系统自带的update-rc.d工具(如果你的系统支持)来配置启动顺序:
update-rc.d your-wifi-script.sh defaults 99
这里的99是启动优先级,数字越大启动越晚,确保在大部分系统服务之后执行,给WiFi模块足够的识别时间。
如果你的系统不支持update-rc.d,手动创建链接时要把符号链接放在高序号的启动目录里,比如运行级别3(多用户命令行)的话:
ln -s /etc/init.d/your-wifi-script.sh /etc/rc.d/rc3.d/S99wifi-auto
S代表启动,99是优先级,同样让它晚启动。
四、更优雅的替代方案(推荐)
如果你的系统支持systemd(虽然Kernel 3.18比较老,但部分嵌入式系统可能已经适配),可以写一个systemd服务文件,精准等待WiFi设备就绪:
- 创建
/etc/systemd/system/wifi-auto.service文件:
[Unit] Description=Auto Configure WiFi Connection After=network.target sys-subsystem-net-devices-wlan0.device Wants=sys-subsystem-net-devices-wlan0.device [Service] Type=oneshot ExecStart=/etc/init.d/your-wifi-script.sh RemainAfterExit=yes [Install] WantedBy=multi-user.target
这个配置会等到wlan0设备被内核识别后才执行脚本,完美解决延迟问题。
- 启用并启动服务:
systemctl daemon-reload systemctl enable wifi-auto.service
如果不支持systemd,还可以用udev规则,当WiFi设备被添加时自动触发脚本:
创建/etc/udev/rules.d/99-wifi-auto.rules:
ACTION=="add", SUBSYSTEM=="net", KERNEL=="wlan0", RUN+="/etc/init.d/your-wifi-script.sh"
这样只要内核识别到wlan0接口,就会自动执行你的配置脚本,完全不用管开机顺序。
最后验证
重启板卡后,你可以通过dmesg | grep wlan0查看WiFi模块的识别时间,再通过ps aux | grep wpa_supplicant和ip addr show wlan0确认服务是否正常运行。
内容的提问来源于stack exchange,提问作者Khilav

