我有一个奇怪的行为,我自己无法解决。我在 RPi2 上运行 Raspbian Stretch Lite。作为 WiFi 适配器,我使用 Realtek RTL8188EU(驱动程序来自暂存目录)。
默认情况下,它会创建 wlan0 接口,但根本不会尝试连接到接入点。配置正确,因为不同的 WiFi 适配器工作正常。
这是我的/etc/wpa_supplicant/wpa_supplicant.conf
文件:
country=IT
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
ap_scan=1
update_config=1
network={
ssid="ssid"
scan_ssid=1
psk="password"
key_mgmt=WPA-PSK
}
经过多次尝试,我找到了一个有效的命令:
wpa_supplicant -u -Dwext,nl80211 -i wlan0 -c /etc/wpa_supplicant/wpa_supplicant.conf -B
从控制台发出此命令会导致预期的行为(即连接到 AP)。但是如果我将此行放入 systemd 服务中:
$ cat /etc/systemd/system/multi-user.target.wants/wpa_supplicant.service
[Unit]
Description=WPA supplicant
Before=network.target
After=dbus.service
Wants=network.target
[Service]
Type=dbus
BusName=fi.epitest.hostap.WPASupplicant
#ExecStart=/sbin/wpa_supplicant -u -s -O /run/wpa_supplicant
ExecStart=/sbin/wpa_supplicant -u -Dwext,nl80211 -i wlan0 -c/etc/wpa_supplicant/wpa_supplicant.conf -B
[Install]
WantedBy=multi-user.target
Alias=dbus-fi.epitest.hostap.WPASupplicant.service
它不起作用,我的意思是它无法连接。即使我手动(重新)启动 systemd 服务。
从 systemd 启动相同命令时,什么可能会阻止正确的行为?
顺便说一句,如果它可以提供帮助,即使它有效(从控制台手动发出命令后),该命令iw list
也不会输出任何内容。
答案1
将类型更改为 forking 而不是 dbus 对我有用:
[Service]
Type=forking
答案2
问题是“从 systemd 启动相同命令时,什么可能会阻止正确的行为?
wpa_supplicant 作为守护进程运行,为了在不使用包含硬编码连接详细信息的配置文件的情况下建立连接,必须使用客户端向 wpa_supplicant 提供连接详细信息。
客户端可以通过两种方法连接到正在运行的 wpa_supplicant:控制文件接口和 DBUS 方法。
Debian(和 Ubuntu)为 wpa_supplicant 提供的 systemd 单元文件使用“-u”参数启动守护进程,告诉它使用 DBUS 接口。我不明白为什么提供 -O /run/wpa_supplicant 参数,因为未创建此接口,因此客户端无法通过此不存在的控制文件套接字进行连接。作为 wpa_supplicant 源的一部分提供的客户端,即 wpa_cli 和 wpa_gui (Qt4) 不具有 DBUS 功能,因此只能使用套接字文件接口。 systemd 单元文件旨在用于具有网络管理器(通过 DBUS 通信)的系统,以管理网络连接或可能的替代“wicd”。
你手工制作的命令
wpa_supplicant -u -Dwext,nl80211 -i wlan0 -c /etc/wpa_supplicant/wpa_supplicant.conf -B
告诉 wpa_supplicant 使用包含 SSID 和授权详细信息的配置文件,因此当它启动时,它会尝试连接到 SSID 并建立连接。
相比之下,systemd 单元文件只是启动 wpa_supplicant 守护进程,永远等待通过 DBUS 接口发送的消息来告诉它尝试建立什么连接以及如何建立连接。
您可以硬连线 systemd 单元文件以使用固定配置,但您还需要删除对 DBUS 的引用并且不使用 -u 标志。使用 DBUS 接口时,您还需要确保 wpa_supplicant 存在 dbus-1 配置文件,并且该策略允许非 root 用户在需要时进行交互(通常由 /etc/dbus- 中的 netdev 组成员身份允许) 1/system.d/wpa_supplicant.conf。
Manu 上面解释了将“type”从“dbus”更改为 forking,但我建议最好使用“simple”而不是使用“-B”(将守护进程分叉到后台选项),因为 systemd 单位是当它们不分叉时更容易管理(并且无需担心创建和监视分叉进程的 PID 文件)。