当系统配置为在 IEEE 802.11a (5 GHz) 下运行时,我在系统启动时创建接入点时遇到了很多麻烦hostapd
。从命令行手动运行或在 IEEE 802.11g (2.4 GHz) 下运行它都可以正常工作 - 只有当我尝试在启动时创建 AP 时才会失败。
首先,让我向你介绍一些细节。
系统环境
- Debian 8.9 (Jessie) 64 位(
uname
输出见下文) - Wifi 适配器是带有 Atheros AR9280/AR5B95 芯片组的 Azurewave AW-NE785H(支持 802.11a 和 802.11g,支持 AP)
uname -a
产量:Linux HOSTNAME 3.16.0-4-amd64 #1 SMP Debian 3.16.43-2+deb8u2 (2017-06-26) x86_64 GNU/Linux
我正在尝试做什么
我正在尝试创建一个以 802.11a 模式 (5 GHz) 运行并在系统启动时启动的接入点 (AP)。
问题是什么
问题是,当我启动系统时,AP 并未创建,尽管 中有一个 init 脚本/etc/init.d
实际上在启动时运行。更奇怪的是,当我尝试在 IEEE 802.11g 模式 (2.4 GHz) 下运行 AP 时,一切正常,AP 在系统启动时出现。手动启动 也是如此hostapd
,无论是使用service hostapd start
还是hostapd <my-config-file>
。
我目前发现的内容/日志/配置
这是我的hostapd
配置文件(/etc/hostapd/hostapd.cfg
):
interface=wlan0
driver=nl80211
country_code=DE
ieee80211n=1
ieee80211ac=1
wmm_enabled=1
ssid=MYSSID
hw_mode=a
channel=acs_survey
macaddr_acl=0
auth_algs=1
ignore_broadcast_ssid=0
wpa=2
wpa_passphrase=supersecretpassphrasehere
wpa_key_mgmt=WPA-PSK
wpa_pairwise=TKIP
rsn_pairwise=CCMP
dump_file=/tmp/hostapd.dump
logger_syslog=-1
logger_syslog_level=2
logger_stdout=-1
logger_stdout_level=2
这是我的初始化脚本(/etc/init.d/hostapd
):
#!/bin/sh
### BEGIN INIT INFO
# Provides: hostapd
# Required-Start: $remote_fs $network $syslog
# Required-Stop: $remote_fs $network $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Advanced IEEE 802.11 management daemon
# Description: Userspace IEEE 802.11 AP and IEEE 802.1X/WPA/WPA2/EAP
# Authenticator
### END INIT INFO
PATH=/sbin:/bin:/usr/sbin:/usr/bin
DAEMON_SBIN=/usr/sbin/hostapd
DAEMON_DEFS=/etc/default/hostapd
DAEMON_CONF=/etc/hostapd/hostapd.cfg
NAME=hostapd
DESC="advanced IEEE 802.11 management"
PIDFILE=/run/hostapd.pid
LOGFILE=/var/log/hostapd_log
[ -x "$DAEMON_SBIN" ] || exit 0
[ -s "$DAEMON_DEFS" ] && . /etc/default/hostapd
[ -n "$DAEMON_CONF" ] || exit 0
DAEMON_OPTS="-dd -f $LOGFILE -B -P $PIDFILE $DAEMON_OPTS $DAEMON_CONF"
. /lib/lsb/init-functions
case "$1" in
start)
log_daemon_msg "Starting $DESC" "$NAME"
start-stop-daemon --start --oknodo --quiet --exec "$DAEMON_SBIN" \
--pidfile "$PIDFILE" -- $DAEMON_OPTS >/dev/null
log_end_msg "$?"
;;
stop)
log_daemon_msg "Stopping $DESC" "$NAME"
start-stop-daemon --stop --oknodo --quiet --exec "$DAEMON_SBIN" \
--pidfile "$PIDFILE"
log_end_msg "$?"
;;
reload)
log_daemon_msg "Reloading $DESC" "$NAME"
start-stop-daemon --stop --signal HUP --exec "$DAEMON_SBIN" \
--pidfile "$PIDFILE"
log_end_msg "$?"
;;
restart|force-reload)
$0 stop
sleep 8
$0 start
;;
status)
status_of_proc "$DAEMON_SBIN" "$NAME"
exit $?
;;
*)
N=/etc/init.d/$NAME
echo "Usage: $N {start|stop|restart|force-reload|reload|status}" >&2
exit 1
;;
esac
exit 0
hostapd 日志文件
如您所见,我告诉hostapd
将其写入/var/log/hostapd_log
。我再次尝试在启动时提高 AP,以下是我从日志文件中读取的内容(整个内容将近 500 行):
- hostapd 使用预期的配置文件(
/etc/hostapd/hostapd.cfg
) - hostapd 按预期将国家/监管域设置为 DE
- hostapd 按预期开始自动频道选择(
channel=acs_survey
)。- 这里似乎出了问题。驱动程序 (
nl80211
) 报告失败的帧命令 (ret=-22 (Invalid argument)
)
- 这里似乎出了问题。驱动程序 (
- 5 次 ACS 调查扫描均未出现任何错误消息
- ACS 失败并显示以下消息,就是这样。
这是 ACS 发生故障时的日志消息:
ACS: Trying survey-based ACS
ACS: Unable to collect survey data
ACS: All study options have failed
Interface initialization failed
wlan0: interface state ACS->DISABLED
wlan0: AP-DISABLED
ACS: Possibly channel configuration is invalid, please report this along with your config file.
ACS: Failed to start
wlan0: AP-DISABLED
wlan0: Deauthenticate all stations
[cut some lines here]
hostapd_free_hapd_data: Interface wlan0 wasn't started
[cut some more lines here]
Interface wlan0 disabled
当我运行时service hostapd start
(不触摸任何东西),AP 出现,我可以看到 ACS 正常工作(它选择了通道 40)。
谷歌
当然,我搜索了很多关于我的问题的解决方案。我想我把问题缩小到了启动过程本身或系统服务相互干扰的问题。我得到的唯一提示是禁用wpa_supplicant
(我找到的提示说那个人通过禁用解决了这个问题wpa_supplicant
和其他干扰服务遗憾的是,他们从未提及他们禁用的其他服务。
我运行systemctl status wpa_supplicant
并得到以下输出:
● wpa_supplicant.service
Loaded: not-found (Reason: No such file or directory)
Active: inactive (dead)
所以我猜它无论如何都还没激活?
总结
为什么hostapd
配置为在 802.11a 模式下运行并在启动时启动时无法创建接入点,但在启动完成后手动执行完全相同的命令时却可以成功创建接入点?我必须做什么才能实现我想要做的事情?
有没有人成功创建过像我一样的 AP?有什么提示吗?
如果需要任何进一步的详细信息,我很乐意提供。
提前致谢
答案1
看起来像是 hostapd 中的一个错误。我正在使用以下设置来自动重新启动 hostapd 服务:
[Service]
Restart=on-failure
RestartSec=30
# hostapd fails with exit code 0 when ACS is enabled
RestartForceExitStatus=0
(可添加systemctl edit hostapd
)