sobota 28. srpna 2010

Lenovo S10-3 a Ubuntu 10.04 - jak obejít nefunkčnosti

Zakoupil jsem minulý týden novou hračku a to netbook Lenovo IdeaPad S10-3 v tom nejzákladnějším provedení. Ihned jsem tam nainstaloval Ubuntu a následující text je pouze o funkčnosti v tomto operačním systému.
Mé dojmy jsou vesměs kladné, až na jednu zásadní věc a pár drobností. Největší slabinou je displej, ten je opravdu příšerný, na toto zvyklý nejsem. Nejspíš asi jako kterýkoli jiný v této cenové kategorii, ale nemohu moc srovnávat. Jde především o pozorovací úhly, tedy spíš jeden jediný úhel, protože jakýkoli jiný je nepoužitelný. Dost to namáhá oči, při každém posunutí hlavy, musíte patřičně naklonit displej a na nějaké koukání, kdy osa spojující obě oči není rovnoběžná s horizontální osou displeje můžete zapomenout, protože každé oko dostane úplně jiný obraz a nejméně jedno nepoužitelný. Také je displej dost pomalý v překreslování a samozřejmě odporně lesklý :) O něco méně mě trápí tlačítka touchpadu, která jsou z úsporných důvodů integrována přímo v samotné aktivní ploše. V praxi jsou neobyčejně tuhá a při použití se člověk (alespoň než si zvykne) neubrání tomu, že si při snaze o stisknutí tlačítka pohne s kurzorem - musíte opravdu mačkat hranu touchpadu. Nebo je raději moc nepoužívat. Scrollování pomocí dvou prstů a zoomování, jak to jde s originálními ovladači v předinstalovaných Windows 7 Starter, nefunguje. Vertikální scroll funguje podle očekávání, dá se v nastavení Ubuntu vypnout a zrovna tak se dá aktivovat scrolling horizontální. Jinak je toto Lenovo velmi příjemně tiché a vlastně jsem celkově dost spokojený :) ...



Ubuntu 10.04 Lucid na tomto strojku funguje velmi dobře, svižně (což se nedá říct o Windows 7 Starter - to je vážně utrpení, ale největší zásluhu na svižnosti má v Ubuntu Compiz, který sejme z procesoru starost o vykreslování oken), boot trvá od zapnutí až na plochu do 40s, přičemž od grubu po přihlašovací okno je to polovina, grafika včetně 3D akcelerace desktopu, wifi, bluetooth, web kamera, uspání i probuzení, tlačítka pro ovládání hlasitosti a přehrávání audia, zkrátka to nejdůležitější funguje. Bohužel ale ani nejnovější kernel 2.6.34 zatím nezprovozní všechny vymoženosti tohoto netbooku, respektive nepřinese v tomto ohledu oproti distribučnímu 2.6.32 žádnou změnu. Přesto tu ale jedna změna je - po probuzení jsem musel s původním kernelem stisknout tlačítko Power na víku netbooku, aby se rozsvítil displej (chvíli mi trvalo, než jsem na to přišel), s 2.6.34 se již rozsvítí automaticky. Nefunkčnost se týká části speciálních tlačítek pro zapínání/vypínání některých komponent počítače: bezdrátové sítě, touchpadu, ovládání jasu, přepínání na externí monitor, a dále nefunguje vestavěný mikrofon (externí ano, ale šumí jako blázen). Většinu jsem obešel a zprovoznil.

Takže nyní to důležité, proč jsem tento příspěvek začal psát - jak zprovoznit nefunkčí tlačítka, resp. zajistit jejich funkce a přenést je funkční klávesové zkratky.

Ve skriptech používám ubuntí notifikační systém Notify-OSD. Řádky s příkazy notify-send můžete smazat, pokud nechcete notifikaci o změně stavu, v opačném případě, pokud nemáte, doinstalujte balík libnotify-bin:

$ sudo apt-get install libnotify-bin

V souvislosti s Notify-OSD doporučuji využít upravený balík, který umožňuje nastavení parametrů zobrazení, i poslouchá mnou použitý příkaz notify-send s přepínačem -t, kterým je možno přímo ze skriptu určit dobu zobrazení informace. Těch deset sekund, které má Ubuntu na pevno nastavené je vážně úlet.  Sám jsem si nastavil jako základ sekundy tři, při indikaci dosaženého maxima a minima jasu v následujícím skriptu dávám jednu. Více >zde<

Ovládání jasu displeje

Update 17.3.2011: s kernelem 2.6.35.27 v Ubuntu 10.10 již ovládání jasu funguje standardními klávesami.

Na ovládání jasu jsem nenašel jinou metodu, než přímé ovládání grafického adaptéru pomocí příkazu setpci. Nejdříve si zjistíte adresu vaší grafické karty na PCI sběrnici:

$ lspci | grep VGA

číselný řetězec na začátku vypsaného řádku je to, co hledáte. V mém případě je adresa 00:02.0 a příkaz, kterým ovládnu jas displeje pak vypadá takto:

$ sudo setpci -s 00:02.0 F4.B=<00-FF>

Za rovnítko zadáváte hodnotu jasu v uvedeném rozsahu v šestnáctkové soustavě. Vynecháte-li rovnítko s hodnotou, dostanete naopak aktuální nastavení jasu. Lenovo S10-3 využívá grafiku Intel GMA3150, ale tato metoda funguje i na dalších Intel grafikách.
Příkaz je nutné spouštět s právy roota a pokud ho budete chtít použít bez nutnosti zadávat pokaždé heslo, bude nutné udělit mu výjimku v souboru /etc/sudoers. Toto je velmi důležitý soubor a jeho editace se provádí výhradně příkazem:

$ sudo visudo

Pokud při editaci uděláte syntaktickou chybu, budete na to při ukládání upozorněni, je třeba po zadání "e" chybu opravit, jinak nebude možné používat příkazy sudo, su, gksudo, gksu, zkrátka nedostanete se k právům administrátora (roota). Pokud takový soubor přesto uložíte, nezbyde než spustit systém v recovery módu, přihlásit se jako root a soubor opravit odtud.
V sudoers můžete udělit výjimku na jakékoliv použití příkazu setpci, což paranoidnější a opatrnější povahy může trochu znervóznit. Dají se specifikovat i konkrétní podoby příkazu, jak uvidíte dále, ale v tomto případě se mi to nepodařilo, kontrolní mechanismus s tím měl problém.
Přidejte na konec souboru sudoers následující řádek:

user ALL=NOPASSWD: /usr/bin/setpci

user nahraďte svým uživatelským jménem, pokud chcete dát tuto možnost všem, zapište místo jména ALL.

A nyní k vlastnímu skriptu, který mám uložený v adresáři ~/bin:

brightness.sh
#!/bin/bash

level=`sudo setpci -s 00:02.0 F4.B|tr "[:lower:]" "[:upper:]"`
level=`echo "ibase=16; obase=A; $level"|bc`

case "$1" in
   'up') level=`echo "$level + 16" | bc`
       [[ $level -gt 255 ]] && level=255 && notify-send -t 300 -i notifications-display-brightness-full "Jas je na maximu"
       level=`echo "ibase=A; obase=16; $level"|bc`
       eval "sudo setpci -s 00:02.0 F4.B=$level"
    ;;
   'down') level=`echo "$level - 16" | bc`
       [[ $level -lt 15 ]] && level=15 && notify-send -t 300 -i notification-display-brightness-off "Jas je na minimu"
       level=`echo "ibase=A; obase=16; $level"|bc`
       eval "sudo setpci -s 00:02.0 F4.B=$level"
   ;;
esac
exit 0

Skript se spouští s parametrem up, nebo down, podle toho, zda chcete přidávat, nebo ubírat jas displeje. Stačí si spouštění skriptu přidat na klávesové zkratky, třeba na Mod4+Up a Mod4+Down a máte to skoro jako originál. Jen OSD zatím indikuje pouze dosažení maximální a minimální hodnoty jasu, lépe to zatím neumím.


Vypínání touchpadu
Docela důležité, pokud chce člověk něco napsat a nemít přitom ruce ve vzduchu. Touchpad se dá ovládat v Gnome přes GConf:

Vypnutí:
$ gconftool-2 -g /desktop/gnome/peripherials/touchpad/touchpad_enabled -t boolean false

Zapnutí:
$ gconftool-2 -g /desktop/gnome/peripherials/touchpad/touchpad_enabled -t boolean true

Jde to udělat i drastičtějším způsobem odebíráním a přidávaním modulu psmouse, to by mělo fungovat v jakémkoliv desktopovém prostředí:

Vypnutí:
$ sudo modprobe -r psmouse

Zapnutí:
$ sudo modprobe psmouse

Tyto příkazy je potřeba spouštět s právy roota a pokud budete chtít tuto metodu použít bez nutnosti zadávat pokaždé heslo, bude opět nutné udělit výjimku v souboru /etc/sudoers (viz výše). Do něj přidejte následující řádky:

user ALL=NOPASSWD: /sbin/modprobe psmouse
user ALL=NOPASSWD: /sbin/modprobe -r psmouse

user nahraďte svým uživatelským jménem, nebo ALL pro všechny uživatele. Tímto si zajistíte možnost spouštět tyto dva konkrétní příkazy bez zadávání hesla pro sudo.

Následující skripty pro první i druhou metodu, umožní jednou klávesovou zkratkou vypínat a zapínat touchpad. Řádky s notify-send můžete smazat, pokud nechcete notifikaci o změně stavu, v opačném případě, pokud nemáte, doinstalujte balík libnotify-bin:

$ sudo apt-get install libnotify-bin

touchpad-switch.sh
#!/bin/bash

if [[ `gconftool-2 -g /desktop/gnome/peripherals/touchpad/touchpad_enabled` == "true" ]]; then
   gconftool-2 -s /desktop/gnome/peripherals/touchpad/touchpad_enabled -t boolean false
   notify-send -i ~/.icons/touchpad_disabled.svg "Touchpad byl vypnut"
 else
   gconftool-2 -s /desktop/gnome/peripherals/touchpad/touchpad_enabled -t boolean true
   notify-send -i ~/.icons/touchpad_enabled.svg "Touchpad byl zapnut"

exit 0

nebo ta druhá varianta (v GConf samozřejmě touchpad musí být povolen)

touchpad-switch-modprobe.sh
#!/bin/bash

if [[ `lsmod|grep psmouse` ]]; then
   sudo modprobe -r psmouse
   notify-send -i ~/.icons/touchpad_disabled.svg "Touchpad byl vypnut"
 else
   sudo modprobe psmouse
   notify-send -i ~/.icons/touchpad_enabled.svg "Touchpad byl zapnut"
fi
exit 0

Skript si uložte opět třeba do ~/bin/ a pak na něj nasměrujte klávesovou zkratku podle libosti. Původní Fn+F6 nefunguje, já jsem ji nahradil Mod4+F6. Ikony pro notifikaci jsem našel dole na této stránce a uložil do ~/.icons.

Vypínání wifi
Napájení wifi samozřejmě ovlivňuje spotřebu počítače a tak je dobré ji vypnout, pokud není potřeba. Z panelu Gnome lze pouze wifi odpojit, ale napájená je stále a tudíž spotřebovává energii. Řešení je ale jednoduché, stačí nainstalovat program rfkill a napsat skript, který přiřadíte třeba ke klávesové zkratce Mod4+F5:

wifi-switch.sh
#!/bin/bash

if [[ `rfkill list wifi | grep Hard | grep yes` ]]; then
   notify-send -i dialog-warning "WiFi je vypnuto mechanicky" "Použijte přepínač na netbooku"
   exit 1
fi
if [[ `rfkill list wifi | grep Soft | grep yes` ]]; then
   rfkill unblock wifi
   [[ `rfkill list wifi | grep Soft | grep no` ]] && notify-send -i notification-network-wireless-full "WiFi zapnuto"
 else
   rfkill block wifi
   [[ `rfkill list wifi | grep Soft | grep yes` ]] && notify-send -i notification-network-wireless-disconnected "WiFi vypnuto"
fi
exit 0

Vypínání bluetooth
Ten je možno vypínat přímo na panelu, ale po restartu je vždy automaticky zapnutý, ostatně stejně jako wifi, takže se může hodit příkaz, kterým BT modul vypnete třeba po startu systému, pokud ho většinou nepotřebujete. Program rfkill zvládne i bluetooth, takže skript pro klávesovou zkratku bude skoro stejný, jako pro wifi:

bluetooth-switch.sh
#!/bin/bash


if [[ `rfkill list wifi | grep Hard | grep yes` ]]; then
   notify-send -i dialog-warning "Bluetooth je vypnuto mechanicky" "Použijte přepínač na netbooku"
   exit 1
fi
if [[ `rfkill list bluetooth | grep Soft | grep yes` ]]; then
   rfkill unblock bluetooth
   [[ `rfkill list bluetooth | grep Soft | grep no` ]] && notify-send -i /usr/share/icons/ubuntu-mono-dark/status/24/bluetooth-active.svg "Bluetooth zapnuto"
else rfkill block bluetooth
   [[ `rfkill list bluetooth | grep Soft | grep yes` ]] && notify-send -i /usr/share/icons/ubuntu-mono-dark/status/24/bluetooth-active.svg "Bluetooth vypnuto"
fi
exit 0

První test ve skriptu není chyba, pro detekci mechanického vypnutí je třeba se řídit podle wifi, protože vypínač je společný a bluetooth se za těchto okolností v systému vůbec neobjeví.


Přepínání na externí monitor
Napsal jsem i skript pro přepínání obrazu na externí monitor, ale problém je v pochybné "umělé inteligenci" grafického systému. Pro přepínání jedním tlačítkem, je nutné, nejdříve zjistit, v jakém stavu je zobrazování v danou chvíli, což se dá zjistit přes xrandr. Potíž je v tom, že pokud připojíte externí monitor a spustíte detekci, systém si všimne, že je monitor připojený a okamžitě přepne zobrazování do dvoumonitorového režimu. To má za následek pád Compizu. Nenašel jsem zatím řešení, jak se tomuto vyhnout a tak první přepnutí zahrnuje vizuální masakr při reaktivaci Compizu. To není zrovna elegantní a tak mám prozatím klávesové zkratky dvě, jednu pro přepnutí na externí monitor a druhou zpět, se kterými nejsou problémy:

Přepnutí na externí monitor:
$ xrandr --output VGA1 --auto --output LVDS1 --off

Přepnutí zpět na interní monitor:
$ xrandr --output VGA1 --off --output LVDS1 --auto

Příkazy jsem přiřadil na Mod4+F3 a Ctrl+Mod4+F3. Pokusím se ještě změnit výchozí chování grafiky, aby se dal použít skript, který umí mimo jiné i to, že nepřepne na externí monitor, když žádný připojený není.

21 komentářů:

  1. Velmi dobry clanok ktory mi dost pomohol. Dakujem!A este by som rad zistil ci sa vam nepodarilo rozbehat funkciu :APS. Ak by s tym mal niekto skusenosti prosim napiste mi na speed_17@azet.sk Dakujem....

    OdpovědětVymazat
  2. S APS jsem moc nepokročil, hdaps modul si s tímto Lenovem nerozumí a bohužel jsem žádné řešení nenašel.

    OdpovědětVymazat
  3. Pěkný článek ale potřeboval bych poradit při změně jasu mám vše vytvořeno ale nepodaří se mi spustit skript. Potřeboval bych radu jak ten skript brightness.sh spustit s parametrem up nebo down koukal jsem na wiki ohledně skriptů ale nepomohlo to. dík za radu

    OdpovědětVymazat
  4. Jednak je potřeba nastavit skriptu spustitelný příznak ve vlastnostech souboru a spustí se to takto:
    /cesta/ke/skriptu/brightness.sh up
    nebo down.

    OdpovědětVymazat
  5. dík moc už to funguje. a ještě s tou wifi nainstaloval jsem rfkill uložil ten skript dal mu klávesovou zkratku ale nevím jak poznám že je wifi vyplá pořád totiž když rozkliknu na liště připojení tak tam jsou pořád wifi sítě na výběr.

    OdpovědětVymazat
  6. Pro jistotu jsem skript z této stránky znovu vyzkoušel, jestli jsem tam nezanes nějakou botu a funguje jak má. Zkontroluj, jestli ho nemáš špatně zkopírovaný a pusť ho z terminálu, ať vidíš jestli hlásí nějaký problém. Správně se má ukázat informační bublina o změně stavu wifi a rozhodně po vypnutí NM applet nezobrazuje dostupná připojení. Vypnutí wifi ještě můžeš zkontrolovat kliknutím pravým myšítkem na applet, neměl by bezdrát být zaškrtnutý.

    OdpovědětVymazat
  7. tak když ten skript spustím z terminálu tak to žádnou chybu neudělá ale ani to nevypne wifi prostě beze změny ani žádná bublina s informací. skript sem kontroval jestli není špatně zkopírovanej a je v pořádku.

    OdpovědětVymazat
  8. Tak na bublinu je třeba mít nainstalovabý balík libnotify-bin, pokud ho nemáš, neindikuje stav, ani brightness.sh. V článku je zmíněný i odkaz na instalaci upraveného notifikačního systému, který je vhodnější pro mé skripty, zvláště pak právě pro ten jas. Další věc je, zda funguje samotný rfkill, zkus ho spustit samostatně, jestli to zabere:
    rfkill block wifi

    OdpovědětVymazat
  9. s jadrom 2.6.35-27 už funguje ovládanie jasu displeje

    OdpovědětVymazat
  10. Máš pravdu, udělám doplnění. Akorát příslušné klávesy nefungují, ale alespoň to ovládání bude elegantnější i s adekvátní indikací.

    OdpovědětVymazat
  11. Tak klávesy začaly fungovat také, chtělo to jen další restart. Sakra to Ubuntu se opravdu začíná chovat jak Windows.. Tuhle jsem přetaktoval procesor a Ubuntu si toho všimlo až po druhém restartu systému.

    OdpovědětVymazat
  12. Dobry den. Koupil jsem take pred tydnem stejne PC ale po nainstalovani noveho ubuntu 11.4 mam problem po uspani nejde probudit ( az reboot). Hodne moc vas prosim o radu.

    OdpovědětVymazat
  13. Jde o uspání do RAM nebo na disk (hibernaci)? Zkusil bych se podívat do syslogu, na čem se to seklo, pokud se tedy systém vůbec dostane ke slovu při tom probouzení. Nicméně mně funguje sleep bez problémů, hibernaci nepoužívám, tak ani nevím..

    OdpovědětVymazat
  14. Dekuji za odpoved. Na baterce mam jak dano jak zavru netbook tak se da suspend. Po otevreni jak kdyby dioda zasviti ale obrazovka zustava stale vypla. Jinak v nabitce nemam jinou volbu jak suspend, hibernace neni ani v hard knofliku. Moc linuxu nerozumim kde nuzu najit syslog. Dekuji.

    OdpovědětVymazat
  15. Jo a pokud dam system test sleep tak se taky nezbudi a jelikoz mam ubuntu na usb disku nezjistim kde je asi zavada ale na win to jde ok.

    OdpovědětVymazat
  16. Systémové logy -> Alt+F2 a spustit příkaz 'gnome-system-log'

    OdpovědětVymazat
  17. Je tam toho stasne moc to budu nuset poslat pres mail. Prosim vas toto je muj mail po odeslavi vaseho vam preposlu data. joelupac a @gmail.com dekuji

    OdpovědětVymazat
  18. Daleko lepší bude, když ten dotaz položíte na fóru Ubuntu
    forum.ubuntu.cz
    neboť tam budete mít daleko větší šanci, že odpoví někdo, kdo podobný problém řešil a třeba vyřešil. Z těch logů by mohl být zajímavý syslog a pm-suspend, z času probouzení. Pak bude zajímavý výpis příkazu
    sudo lshw
    který spustíte v terminálu, tam je vidět, co máte konkrétně za hardware, protože různá Lenova s10-3 mohou mít různé komponenty.
    Každopádně já na tyhle diagnostiky na dálku nemám moc trpělivost, ani znalosti, vyřeším si co potřebuju, ale musím to mít všechno pod kontrolou a při ruce :)

    OdpovědětVymazat
  19. OK i tak dekuji

    OdpovědětVymazat
  20. MIKROFON. Jak zprovoznit mikrofon ? Ubuntu 11.04.

    Děkuji za odpoved

    OdpovědětVymazat
  21. Mikrofon jsem bohužel nikdy nezprovoznil, moc jsem ho ani nepotřeboval. Externí fungoval, i když bídně. Momentálně ani neotestuju, jestli se něco nezměnilo, neb je mé S10-3 v křemíkovém nebi..

    OdpovědětVymazat

Zkuste prosím při komentováni používat místo volby Anonymní volbu Název/adresa URL, kde vyplníte nějakou přezdívku, adresu zadávat nemusíte. Vědět, které příspěvky jsou od jednoho člověka, je fajn. Díky.

Pokud by se vám náhodou odeslaný komentář na stránce nezobrazil, vytáhnu ho z koše hned jak si toho všimnu. I Google spam filter se občas sekne.