Não estou conseguindo usar um FRITZ! WLAN USB Stick N para conectar meu Raspberry Pi 1B à minha rede sem fio. Eu vejo vários problemas, mas não consigo localizar e eliminar a causa raiz. O problema é reproduzível em um Raspberyy Pi 3B.
No final do processo de inicialização, a rede sem fio não está disponível, o dispositivo de rede é mostrado por ifconfig
, mas sem endereço IP. iwconfig
relatórios
wlan0 IEEE 802.11abgn ESSID:off/any
Mode:Managed Access Point: Not-Associated Tx-Power=20 dBm
Retry short limit:7 RTS thr:off Fragment thr:off
Power Management:off
Se eu trouxer wlan0 manualmente com ifup wlan0
, tudo funcionará bem e a máquina se conectará à minha rede (tentando deixar de fora coisas esperançosamente irrelevantes):
wpa_supplicant[854]: Successfully initialized wpa_supplicant
dhclient: Internet Systems Consortium DHCP Client 4.3.1
dhclient: DHCPDISCOVER on wlan0 to 255.255.255.255 port 67 interval 8
wpa_supplicant[855]: wlan0: Associated with xx:xx:xx:xx:xx:xx
wpa_supplicant[855]: wlan0: WPA: Key negotiation completed with xx:xx:xx:xx:xx:xx [PTK=CCMP GTK=CCMP]
[...]
wpa_supplicant[855]: wlan0: CTRL-EVENT-CONNECTED - Connection to xx:xx:xx:xx:xx:xx completed [id=0 id_str=]
dhcpcd[485]: wlan0: carrier acquired
wpa_supplicant[855]: wlan0: CTRL-EVENT-REGDOM-CHANGE init=COUNTRY_IE type=COUNTRY alpha2=DE
dhcpcd[485]: wlan0: adding address xxxx::xxxx:xxxx:xxxx:xxxx
dhcpcd[485]: wlan0: IAID 43:0d:1f:fd
dhcpcd[485]: wlan0: rebinding lease of xxx.xxx.x.xx
dhcpcd[485]: wlan0: soliciting an IPv6 router
dhclient: DHCPREQUEST on wlan0 to 255.255.255.255 port 67
dhclient: bound to xxx.xxx.x.xx -- renewal in 335050 seconds.
No entanto, eu gostaria de deixar o sistema (sem cabeça) inicializar e conectar sem supervisão.
Talvez o problema seja que o pen drive USB muda sua identificação USB após carregar o firmware?
syslog me diz que o stick é reconhecido no início do processo de inicialização (t = 4.2s) com idVendor = 057c e idProduct = 84ff . Logo após (t = 5,3s), é detectado um CD-ROM SCSI com o rótulo "FRITZ! WLAN selfinstall 1.00 PQ: 0 ANSI: 0 CCS". Eu acho que o bastão em si fornece essa unidade para deixar a máquina carregar algum firmware de chip USB.
Em algum ponto entre t = 12s e t = 15,5s, _wpa_supplicant_ tenta exibir o dispositivo de rede, mas falha:
wpa_supplicant[264]: Successfully initialized wpa_supplicant
wpa_supplicant[264]: Could not read interface wlan0 flags: No such device
wpa_supplicant[264]: nl80211: Driver does not support authentication/association or connect commands
wpa_supplicant[264]: Could not read interface wlan0 flags: No such device
wpa_supplicant[264]: WEXT: Could not set interface 'wlan0' UP
wpa_supplicant[264]: wlan0: Failed to initialize driver interface networking[198]: Configuring network interfaces...wpa_supplicant: /sbin/wpa_supplicant daemon failed to start
networking[198]: run-parts: /etc/network/if-pre-up.d/wpasupplicant exited with return code 1
networking[198]: Failed to bring up wlan0.
networking[198]: done.
Muito mais tarde (t = 30s), o dispositivo USB desconecta e reconecta a exibição de idVendor = 057c, idProduct = 8401 . Logo após (t = 34.2s), o dhcpcd tenta novamente, mas não consegue se conectar à rede:
dhcpcd[484]: wlan0: adding address xxxx::xxxx:xxxx:xxxx:xxxx
dhcpcd[484]: wlan0: waiting for carrier
kernel: [ 35.199371] IPv6: ADDRCONF(NETDEV_UP): wlan0: link is not ready
khcpcd[484]: wlan0: carrier acquired
dhcpcd[484]: wlan0: IAID 43:0d:1f:fd
dhcpcd[484]: wlan0: carrier lost
dhcpcd[484]: wlan0: deleting address xxxx::xxxx:xxxx:xxxx:xxxx
Por que isso falha? Eu não consigo ter uma idéia adequada.
Tentei configurar minha solução de fallback: deixar ifup wlan0
sendo chamado como serviço systemd . Criado /etc/systemd/system/fritz.wlan.service para iniciar um script de shell o mais tarde possível:
[Unit]
Description=Fritz WLAN Stick N
After=ntp.target multi-user.target
[Service]
Type=oneshot
ExecStartPre=/bin/sleep 5
ExecStart=/usr/local/bin/fritz.wlan.sh
[Install]
WantedBy=multi-user.target
e um script de shell /usr/local/bin/fritz.wlan.sh:
#!/bin/sh
/bin/sleep 660
iwconfig 2>&1 | grep ESSID:\"xxx > /dev/null || ifup wlan0 2>&1 >> /var/log/fritz.wlan.log
Isso não leva a sucesso. O script é iniciado logo após o multi-user.target. syslog informa que o dispositivo foi criado e que uma concessão de DHCP foi adquirida, mas logo depois, o kernel decide autenticar o dispositivo que desenrola a conexão inteira:
kernel: [ 717.685006] wlan0: deauthenticating from e0:28:6d:37:3e:f5 by local choice (Reason: 3=DEAUTH_LEAVING)
dhcpcd[465]: wlan0: carrier lost
wpa_supplicant[1330]: wlan0: CTRL-EVENT-DISCONNECTED bssid=e0:28:6d:37:3e:f5 reason=3 locally_generated=1
Hrmph. Mais tarde, systemd informa que o processo de inicialização foi concluído. Não mais cedo. Bem, no entanto.
systemd[1]: Started Fritz WLAN Stick N.
systemd[1]: Startup finished in 3.332s (kernel) + 11min 54.388s (userspace) = 11min 57.720s.
Pode ser que o problema apareça quando ifup wlan0
é iniciado por systemd e não por um shell raiz interativo?
cron cria /var/run/fritz.wlan na hora da reinicialização. Outra tarefa cron permite que um script de shell verifique a existência desse arquivo a cada minuto. Para sempre ter um minuto de atraso, este script toca /var/run.fritz.wlan.2 e remove o primeiro arquivo e sai. Ao ser chamado no minuto seguinte com o segundo arquivo existente, o script chama ifup wlan0
, remove o segundo arquivo e sai.
Melhoria seria mesmo remover o cron job que dispara o script a cada minuto.
Ainda assim, gostaria de entender completamente o problema e encontrar uma solução adequada. Alguma sugestão?