kategorie:

menu:


Ošklivý hack

13.04.2009   ::    topic: Linux

Taky občas máte pocit že váš systém je živý organizmus, který si žije svým vlastním životem? Já tento pocit posledních pár dní měl. Začalo to tím že mi přestal fungovat NetworkManager. Jak jsem později zjistil, bylo to nejspíše způsobeno aktualizací HAL. Při snaze problém napravit postupně přestávaly fungovat další součásti systému. Vrcholem bylo když mi modul grafiky (který jsem aktualizoval před 14 dny) začal z ničeho nic při odhlašování způsobovat kernel panic na mém TuxOnIce 2.6.27 jadérku! To už byl vážně vrchol. Problémy které jsem řešil se jádra vůbec netýkaly…

Panikařící ovladač grafiky jsem vyřešil jednoduše. Zkompiloval jsem nové jádro 2.6.29.1 . Zatím mi dělá radost, uspávání a hibernace mi konečně chodí bez TuxOnIce patchů. Subjektivně bych i řekl že boot, uspávání a probouzení je o něco rychlejší než u všech předchozích jader.

NetworkManager

(K)NetworkManager je krásný nástroj, který umožňuje přecházet s notebookem mezi různými wifi sítěmi bez nutnosti uživatelského zásahu. Na jeho opravení, pokud se něco pokazí, je ale potřeba pořádný kus černé magije. Už jenom najít jeho logy (/var/log/dae­mon.log), všechny souvisecící scripty a konfigurační soubory, které jsou rozházené po celém systému je záležitost na celé odpoledne. Sám o sobě NetworkManager není nijak extra velký. To co jej dělá poměrně komplikovaným je způsob jakým pracuje a množtví nástrojů které k tomu používá. Především často nechce spolupracovat s konrétními verzemi jiných programů. Tyto závislosti nezjistíte jinak než že jej vyzkoušíte a pročtete bugzilly.

Informace o stavu síťových zařízeních si získává z hardware abstraction layer (HAL) přez systém zasílání zpráv D-Bus. Pro jejich konfiguraci používá ifupdown scripty, pro získání konfigurace z dhcp serveru nástroj dhclient. Pro připojování k šifrovaným wifi sítím používá wpasupplicant. Navíc ještě umožňuje spravovat modemová připojení (ppp), VPN sítě (OpenVPN, VPNc) a kdo ví co ještě. Stačí aby jedna z těchto komponent přestala spolupracovat a jste bez připojení.

HAL

U mě byl prvotní problém v tom, že nový HAL (Intrepid) neposkytoval informace o síťových zařízeních a tak to vypadalo jako bych žádná neměl. Instalace HALu a NetworkManageru (svn864988) z repozitářů Jaunty problém vyřešila. Naskytl se ale nový problém. Při stisku libovolné klávesy pod Xorg serverem se příslužný znak vypsal 3×! Po chvilce googlení jsem našel zakopaného psa. V nových verzích se totiž přesouvá starost o detekci vstupních zařízení (klávesnice, myš) z beder Xorg na HAL (+udev pravidla). Já ale měl detekci kávesnice povolenou jak v Xorg tak v HAL. Xorg měl tedy klávesnici zaregistrovanou několikrát a jeden stisk obsluhoval víckrát. Nedetekování vstupních zařízení Xorgem je v nové verzi defaultní, já jí měl ale explicitně povolednou, protože jsem Xorg aktualizoval zhruba před 14 dny ještě se starým HAL. Jedná se o volbu AllowEmptyInputServerFlags.

Po přenastavení Xorg se vše zdálo být vpořádku. Později se ale ukázalo že klávesnice registrovaná pomocí HAL má naprosto zpřeházené mapování některých kláves a jiné vůbec nefungují! Řešení bylo vrátit starost o detekci zařízení zpět na Xorg. Nejdříve jsem přenastavil Xorg:

Section "ServerFlags"
    Option "AIGLX"      "on"
    Option "Xinerama"   "false" # direct rendrering is not supported, when xinerama is enabled
    Option "DontZap"    "false" # enable ctrl+alt+backspace shortcut for restart X

    Option "AllowEmptyInput" "false"
                ## true - kdyz je novy HAL, jinak se klavesy pisou trikrat
                ## false - stary HAL, jinak klavesnice a mys neodpovida
EndSection

Poté pravidly v souboru /etc/hal/fdi/po­licy/keyboard_mou­se.fdi řekl ať HAL pro klávesnice a myši používá neexitující driver:

<?xml version="1.0" encoding="ISO-8859-1"?>
<deviceinfo version="2.0">
    <device>
        <match key="info.capabilities" contains="input.mouse">
            <merge key="input.x11_driver" type="string">nonexist</merge>
        </match>
    </device>
    <device>
        <match key="info.capabilities" contains="input.keyboard">
            <merge key="input.x11_driver" type="string">nonexist</merge>
            <!-- disable keyboards for HAL, it is provide by Xorg -->
        </match>
    </device>
</deviceinfo>

Není to nijak krásné řešení, v logu Xorgu se poté objevují chyby o neexistujícím ovladači, funguje to ale dobře. Já v pátek odpoledne neměl sílu vymýšlet něco elegantnějšího…

Závěr

O problémech s wifi sítěmi a jak jsem nakonec nainstaloval NetworkManager z Debianu Sid se už raději rozepisovat nebudu. Beztak tyhle žvásty asi nikdo číst nebude. Tak snad jen jednu radu na závěr: NEVRTEJTE SE V TOM CO FUNGUJE!