Wolę wyłączyć większość rzeczy związanych z automatyczną konfiguracją sieci i demonem zarządzania połączeniami i sam sobie z tym poradzić. Oto skrypt (bash), który będzie utrzymywał połączenie tak długo, jak sieć będzie w pobliżu i nie będziesz mieć problemów ze sterownikiem Wi-Fi lub problemami z zasilaniem; pomysł polega na pingowaniu routera co N sekund, a jeśli to się nie powiedzie, podłącz ponownie:
#!/bin/bash
# make sure we aren't running already
what=`basename $0`
for p in `ps h -o pid -C $what`; do
if [ $p != $$ ]; then
exit 0
fi
done
# source configuration
. /etc/wifi.conf
exec 1> /dev/null
exec 2>> $log
echo $(date) > $log
# without check_interval set, we risk a 0 sleep = busy loop
if [ ! "$check_interval" ]; then
echo "No check interval set!" >> $log
exit 1
fi
startWifi () {
dhclient -v -r
# make really sure
killall dhclient
iwconfig $wlan essid $essid
dhclient -v $wlan
}
ifconfig $eth down
ifconfig $wlan up
startWifi
while [ 1 ]; do
ping -c 1 $router_ip & wait $!
if [ $? != 0 ]; then
echo $(date)" attempting restart..." >> $log
startWifi
sleep 1
else sleep $check_interval
fi
done
Tak więc, /etc/wifi.conf
w tym przypadku może zawierać:
router_ip=192.168.0.1
log=/var/log/wifi.log
wlan=wlan0
eth=eth0
essid=someNetwork
check_interval=5
Wszystko to zakłada otwartą, niezaszyfrowaną sieć (w przeciwnym razie konieczne będzie dodanie odpowiednich poleceń). Zastosowałem to podejście na różnych maszynach linuxowych, w tym pi, i działa ono bezbłędnie; utrzyma system w trybie online przez czas nieokreślony, nawet jeśli okresowo przejdzie w tryb uśpienia (czego pi nie może zresztą).
Przyzwoity okres sprawdzania wynosi 3-5 sekund; ta aktywność w ogóle nie wpłynie znacząco na zasoby systemowe.
Koniecznie trzeba wyłączyć automatycznej konfiguracji sieci pierwszy ,. w tym ifplugd
i inne demony sieciowe, w przeciwnym razie będzie to zakłócać Twoje wysiłki:
Jak mogę wyłączyć automatycznie skonfigurowaną sieć w Raspbian?
Faktycznie użyłem apt-get remove ifplugd
.
Aby rozpocząć pracę w sieci podczas rozruchu (ponieważ używam pi bez głowy), mam ten zestaw do uruchomienia na raspbian z /etc/rc.local
:
wifi_mod=`lsmod | grep 8192cu`
if [ "$wifi_mod" ]; then
echo "Starting wifi..."
/usr/bin/nice -n -10 /usr/local/bin/wifi &
else
echo "Starting ethernet..."
/sbin/ifconfig eth0 up
/sbin/dhclient eth0
fi
/usr/local/bin/wifi
jest skrypt. Jeśli nie wiesz, po co nice
, przeczytaj man nice
.
Chodzi o if
to, że jeśli mój klucz Wi-Fi jest podłączony do pi, moduł 8192cu zostanie w tym momencie załadowany przez jądro - więc wifi powinno się uruchomić. Jeśli nie, to zakłada się, że sieć Ethernet jest podłączona i powinna być używana (jeśli tak nie jest, dhclient po prostu zawiedzie i nie będzie dostępu do sieci).
Aby to zadziałało, prawdopodobnie będziesz musiał
W ten sposób dostaje się bezgłowe pi do sieci podczas rozruchu i utrzymuje ją tam. Jeśli chcesz zmienić sposób na et podczas pracy bez logowania, możesz zrobić coś z regułami udev w celu wyciągnięcia klucza Wi-Fi.