Portál AbcLinuxu, 30. října 2025 05:24
Po delší době bych chtěl udělat upgrade softwaru (kernel, ovladače, programy), který používáme na routery v naší síti, ze začátku šlo vše skoro hladce, tedy když nepočítám to, že některé volby v jádře nedovolily systému nastartovat například ve VMware, nebo ve VirtualBoxu (ten chodil až se zapnutým SMP a pamětí nastavenou maximálně na 4GB, 64GB mu dělalo obrovský problém).
Po cca dvou dnech jsem nasadil celý systém do ostrého provozu, ovšem nestačil jsem se divit, vypadával mi jeden kernel panic za druhým a ve virtuálních strojích se nic takového nedělo, zkusil jsem tedy nasadit starší jádro (včetně ovladačů) a vše opět fungovalo normálně.
Hned ze začátku mi bylo jasné, že problém bude někde v madwifi ovladačích, které si s každou novou verzí připraví novou chuťovku v podobě kernel panicu za speciálních nikým nedokumentovaných okolností, ovšem že tyto okolnosti najdu 2 v aktuální stabilní verzi a 3 v trunk verzi jsem tedy z počátku opravdu netušil.
Protože mi kamarád, který má obchod na prodej PC dovezl dvě hračky, které jsem si objednal přímo na testování, tak jsem dlouho nelenil, obě PC jsem složil na stole a začal jsem simulovat některé normální situace.
Nejprve jsem použil aktuální nejnovější stable ovladač 0.9.3.2, hned po prvním staru jsem ale zjistil, že při nahození v režimu master (ap) je to jistý kernel-panic. Zkusil jsem tedy starší verzi 0.9.3 o které jsem věděl že chodila dobře, musel jsem najít patch, díky kterému jí zkompiluji s kernelem 2.6.22.5, poté jsem to zkusil znovu a tentokrát opravdu vše fungovalo normálně, až na jednu maličkost o té ale později.
Začal jsem tedy pátrat který patch způsobil takto závažné problémy, po cca 14 kompilacích jsem zjistil, že tento problém způsobuje patch, který měl vyřešit ticket 1388. Po jeho odstranění ve verzi 0.9.3.2 vše šlapalo jako hodinky. Až na jednu maličkost.
Po delším testování jsem našel další jistý kernel panic, ne tak snadno reprodukovatelný, ale přesto velmi častý. Začal jsem nejdřív simulovat různé situace, kdy se tak děje a kdy ne, přišel jsem na to, že se tak stává hlavně pokud používám AP v režimu WDS a klient v režimu WDS se nově připojí, nebo změní rychlost, ne vždy, ale třeba každé 3 připojení. Tento bug se projevuje jak ve verzi 0.9.3, tak ve verzi 0.9.3.2 a existuje i ticket 1516, který ho asi popisuje. Pokud tedy znáte nějaké AP s madwifi ve WDS režimu a chcete mu způsobit ošklivý kernel panic, nic vám v tom nezabrání :)
Zkusil jsem tedy nejnovější trunk verzi madwifi ovladače, nejprve však DFS, která trpěla ještě větší nestabilitou, než původní verze 0.9.3.2. Kernel panic při nahození karty v režimu AP byl naprosto běžný i po odstranění výše zmíněného patche, tak se při větších přenosech stávalo, že DFS verze detekovala radar naprosto chybně (u mě doma a vždy na stejném kanále, na jakém se vysílalo) při velké zátěži, po této detekci se spojení na daném kanále přerušilo. Hledat chyby se mi už opravdu nechtělo, takže jsem to vzdal a přešel na trunk verzi.
Trunk verz 2702, s touto verzí se mi zaseknout kernel sice nepodařilo, podotýkám že až po odstranění patche z ticketu 1388, jinak padala hned po startu karty, respektive už také podařilo, ale nejedná se o běžnou situaci (přepínání xr režimu pře iwpriv), ale nedařilo se mi navázat spojení, takže data neprotékala.
Podíval jsem se tedy do výpisu jaké patche v poslední době šly do trunk verze, hned ten poslední byl dost divný, takže jsem zkusil předposlední verzi a hurá, už žádné časté zasekávání jádra, už žádné další libovolné restarty, po odstranění patche z ticketu 1388 a jedné drobné úpravě mohu verzi 2695 prohlásit za opravdu stabilní (relativně vzato).
Už zbýval jen jediný problém, po instalaci aktuální verze jsem zjistil, že přenosová rychlost poklesla o cca 35%, z původních 4,2MB/s jedním směrem na 3,3MB/s, hledal jsem co se změnilo, nakonec jsem našel že to dělá asi aktivní doth režim, stačil tedy příkaz iwpriv ath0 doth 0 a už to zase jede krásné 4MB/s.
Co z tohoto zápisu plyne, že vývojáři ovladačů jsou zase jen lidi, někteří horší, někteří lepší a že podobnou zkušenost nikomu z vás nepřeji.
PS: O problému "udev v Debianu vs madwifi" už raději ani psát nebudu, už takhle je to ho opravdu dost.
Přikládám obrázky a ukázkový skript, který používám pro nahození atheros karet, jednotlivé parametry si určitě doplníte:
dev=ath"`echo $name | perl -ne 'print $1 if (/ath([0-9])/);'`"
if [ $dev = "ath" ]; then
echo "Wrong file name, please rename file to format *athX*"
exit 1
fi
# Nastaveni karet
. "$1"
echo -n "Starting $dev..."
# musime provest slozitou kontrolu na chybny udev v debianu, chyba se tyka jen madwifi!
if [ -e "/etc/udev/persistent-net-generator.rules" ]; then
while read LINE; do
if [ "`echo \"$LINE\" | cut -c 1`" != "#" ]; then
if [ "`echo \"$LINE\" | grep -i ath | grep \"*\"`" != "" ]; then
if [ "`echo \"$LINE\" | grep \"persistent_net_generator_end\"`" != "" ]; then
if [ "`echo \"$LINE\" | grep 802`" == "" ]; then
break
fi
elif [ "`echo \"$LINE\" | grep KERNEL`" != "" ]; then
pom1=true
fi
fi
fi
done < "/etc/udev/persistent-net-generator.rules"
if [ $pom1 ]; then
echo "Soubor /etc/udev/persistent-net-generator.rules je chybny!"
echo "Pro spravnou funkci madwifi ovladcu bude soubor upraven!"
rm -f /tmp/persistent-net-generator.rules
while read LINE2; do
if [ "`echo \"$LINE2\" | cut -d, -f1`" == "NAME==\"?*\"" ]; then
echo "$LINE2" >> /tmp/persistent-net-generator.rules
break
else
echo "$LINE2" >> /tmp/persistent-net-generator.rules
fi
done < "/etc/udev/persistent-net-generator.rules"
echo '' >> /tmp/persistent-net-generator.rules
echo '# ignore interfaces of the madwifi driver' >> /tmp/persistent-net-generator.rules
echo 'KERNEL=="ath*", GOTO="persistent_net_generator_end"' >> /tmp/persistent-net-generator.rules
while read LINE2; do
if [ "`echo \"$LINE2\" | cut -d, -f1`" == "NAME==\"?*\"" ]; then
pom2=true
elif [ $pom2 ]; then
echo "$LINE2" >> /tmp/persistent-net-generator.rules
fi
done < "/etc/udev/persistent-net-generator.rules"
rm -f "/etc/udev/persistent-net-generator.rules"
if [ -e "/etc/udev/persistent-net-generator.rules" ]; then
/etc/init.d/set_readonly stop
mv "/tmp/persistent-net-generator.rules" "/etc/udev/persistent-net-generator.rules"
/etc/init.d/set_readonly start
else
mv "/tmp/persistent-net-generator.rules" "/etc/udev/persistent-net-generator.rules"
fi
echo > "/etc/udev/rules.d/z25_persistent-net.rules"
fi
fi
# normalne pokracujeme dal
case $MODE in
ap|master)
MODE="ap"
;;
sta|managed)
MODE="sta"
;;
adhoc|ad-hoc)
MODE="adhoc"
;;
*)
;;
esac
# madwifi si s kazdou novou verzi pripravi novou lahudku,
# takze tento skript muze zpusobit pad PC!
#
# nejprve musime overit jestli neni karta v nejakem bridgi
if [ "`brctl show | grep $dev`" != "" ]; then
I="0"
# danou kartu odpojime ze vsech bridgu
while [ "$I" -lt "10" ]; do
brctl delif br$I $dev &>/dev/null
((I++))
done
fi
# z interfaces zjistime, jestli nektera karta neni v bridgi
while read LINE; do
if [ "`echo $LINE | awk '{print \$1}' | cut -c 1`" != "#" ]; then
# radek s bridge_ports je vzdy az po rozhrani
if [ "`echo $LINE | grep \"bridge_ports\" | grep $dev`" != "" ]; then
BR_DEV="$BDEV"
elif [ "`echo $LINE | awk '{print \$2}' | grep \"br\" | grep -Eo [[:digit:]]+`" != "" ]; then
BDEV="`echo $LINE | awk '{print \$2}'`"
fi
fi
done < /etc/network/interfaces
# vypneme predchozi rozhrani
$ifdown $dev &>/dev/null
$ifconfig $dev down &>/dev/null
$wlanconfig $dev destroy &>/dev/null
sleep 0.5
N=`echo $dev | cut -c4`
WIFI="`ls -1 /proc/sys/dev/ | grep wifi | sed -n \`expr 1 + $N\`p`"
$wlanconfig $dev create wlandev $WIFI wlanmode $MODE 1>/dev/null
sleep 0.5
if [ "`echo $CHANNEL | cut -d- -f1`" -gt 14 ] && [ "$W_MODE" != "0" ]; then
$iwpriv $dev mode 1
else
$iwpriv $dev mode $W_MODE
fi
# rezim turbo neni v CR povolen
if [ "$TURBO" == "1" ]; then
$iwpriv $dev turbo 1
else
$iwpriv $dev turbo 0
fi
# zlepsuje stabilitu ovladace
$iwpriv $dev xr 0
# zlepsuje stabilitu spojeni, tyka se asi jen 802,11g
$iwpriv $dev protmode 0
# zlepsuje rychlost spojeni, tim ze neskenujeme na pozadi
$iwpriv $dev bgscan 0
# specialni nastaveni zlepsujici rychlost o 100% pro madwifi spoj
if [ "$CONNECTION" == "madwifi" ]; then
# atheros superA/G adaptive radio zlepsuje rychlost i stabilitu spojeni
$iwpriv $dev ar 1
# zlepsuje pruchod videa/audio a voip
$iwpriv $dev wmm 1
# rezim burst zlepsuje rychlost spoje
$iwpriv $dev burst 1
# fast frame zlepsuje rychlost spoje velmi znatelne
$iwpriv $dev ff 1
else
$iwpriv $dev ar 0
$iwpriv $dev wmm 0
$iwpriv $dev burst 0
$iwpriv $dev ff 0
fi
# rezim doth extremne zhorsuje prenosove rychlosti, pro A je rozdil 3 vs 4 MB/s
# tento rezim je zapnut az v ovladacich madwifi-ng trunk, neni zapnuty ve stable vetvi
$iwpriv $dev doth 0
# wds rezim, pouziti hlavne pro bridge, dovolime bridge jen s ethernetem!
if [ "$WDS" == "1" ] || [ "$BR_DEV" != "" ]; then
$iwpriv $dev wds 1
else
$iwpriv $dev wds 0
fi
# essid
$iwconfig $dev essid $ESSID
# wep klic
$iwconfig $dev key $KEY
# rychlost
$iwconfig $dev rate $RATE
# nastaveni anteny na karte
if [ "$ANTENNA" == "1" ] || [ "$ANTENNA" == "" ]; then
echo 0 > /proc/sys/dev/$WIFI/diversity
echo 1 > /proc/sys/dev/$WIFI/txantenna
echo 1 > /proc/sys/dev/$WIFI/rxantenna
elif [ "$ANTENNA" == "2" ]; then
echo 0 > /proc/sys/dev/$WIFI/diversity
echo 2 > /proc/sys/dev/$WIFI/txantenna
echo 2 > /proc/sys/dev/$WIFI/rxantenna
fi
# nastaveni ack, cts a slottime pro vzdalenejsi spoje
if [ "`echo $DISTANCE | grep km`" != "" ]; then
DISTANCE="`echo $DISTANCE | cut -d \"k\" -f1`"
DISTANCE="`expr $DISTANCE \* 1000`"
elif [ "`echo $DISTANCE | grep m`" != "" ]; then
DISTANCE="`echo $DISTANCE | cut -d \"m\" -f1`"
fi
SLOTTIME="`expr \( 9 + \( $DISTANCE / 300 \) \) + \( \( $DISTANCE % 300 \) \> \( 1 / 2 \) \)`"
ACKTIMEOUT="`expr $SLOTTIME \* 2 + 3`"
CTSTIMEOUT="`expr $SLOTTIME \* 2 + 3`"
echo $SLOTTIME > /proc/sys/dev/$WIFI/slottime
echo $ACKTIMEOUT > /proc/sys/dev/$WIFI/acktimeout
echo $CTSTIMEOUT > /proc/sys/dev/$WIFI/ctstimeout
# nastaveni kanalu
if [ "`echo \"$CHANNEL\" | grep -`" == "" ]; then
# pro karty v rezimu sta nenastavujeme kanal
if [ "$MODE" != "sta" ]; then
$iwconfig $dev channel $CHANNEL
fi
else
$athchans -i $dev "$CHANNEL"
fi
if [ "$BR_DEV" != "" ]; then
# rozhrani pro bridge uz existuje, takze jen pridame kartu
if [ "`brctl show | grep $BR_DEV`" != "" ]; then
brctl addif $BR_DEV $dev
fi
# podstatne zrychli start bridge
brctl setfd $BR_DEV 0
$ifconfig $dev up
else
$ifconfig $dev up
if [ "`cat /etc/network/interfaces | grep $dev`" != "" ]; then
$ifup $dev
fi
fi
# vykon lze nastavit az po nahozeni karty
$iwconfig $dev txpower $TXPOWER # Velmi problematicke nastaveni
echo "done."
Tiskni
Sdílej:
Takze 5g ted nejede, nastesti jsme se spolupracojici siti vymysleli zalozni reseni.
Zitra odpoledne se budu snazit slozit komp ve kterym jedna z tech karet neumre.
Zdenek
Kde jste k nim získal tip, že je máte zapnout? Zítra je mám v plánu vyzkoušet, ale podle dokumentace je většina z nich stejně v default zapnutá (pokud to hw podporuje).
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.