나에게는 혼자서는 해결할 수 없는 이상한 행동이 있습니다. 저는 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
dbus 대신 포크로 유형을 변경하면 저에게 효과적이었습니다.
[Service]
Type=forking
답변2
문제는 "systemd에서 동일한 명령을 실행할 때 올바른 동작을 방해할 수 있는 것은 무엇입니까?"입니다.
wpa_supplicant는 데몬으로 실행되며 하드 코딩된 연결 세부 정보가 포함된 구성 파일을 사용하지 않고 연결을 설정하려면 클라이언트를 사용하여 wpa_supplicant에 연결 세부 정보를 제공해야 합니다.
클라이언트는 제어 파일 인터페이스와 DBUS 방법이라는 두 가지 방법을 통해 실행 중인 wpa_supplicant에 연결할 수 있습니다.
wpa_supplicant를 위해 Debian(및 Ubuntu)에서 제공하는 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 인터페이스를 통해 어떤 연결을 시도하고 어떻게 설정해야 하는지 알려주는 메시지를 영원히 기다립니다.
고정된 구성을 사용하도록 시스템 장치 파일을 하드와이어할 수 있지만 DBUS에 대한 참조를 제거하고 -u 플래그를 사용하지 않아야 합니다. DBUS 인터페이스를 사용할 때 wpa_supplicant에 대한 dbus-1 구성 파일이 존재하는지, 필요한 경우 정책이 루트가 아닌 사용자의 상호 작용을 허용하는지 확인해야 합니다(일반적으로 /etc/dbus-1/system의 netdev 그룹 멤버십에 의해 허용됨). .d /wpa_supplicant.conf.
Manu는 위에서 "type"을 "dbus"에서 분기로 변경한다고 설명했지만 "-B"(포크 데몬을 백그라운드 옵션으로)를 사용하는 대신 "simple"을 사용하는 것이 더 낫다고 제안합니다. 왜냐하면 systemd 단위는 더 쉽지 않을 때 사용되기 때문입니다. 포크할 때 관리합니다(포크된 프로세스에 대한 PID 파일 생성 및 모니터링에 대해 걱정할 필요가 없습니다).