Jak pracuje X11
Základem je X server. Je to program, který se stará o vykreslování oken a obsluhuje vstupní zařízení – klávesnici a myš. Beží prostě tam, kde je připojena klávesnice, myš a kde se zobrazují data (výstupní zařízení). X server dělá dvě důležité činnosti. První z nich je, že vykresluje grafické prvky na obrazovku. O to, co se bude zobrazovat, se stará x klient (aplikace). Ta říká X serveru, co a kam vykreslit.
Druhý úkol X serveru je zpracovávání událostí. Ke každému oknu se vztahují události vstupních zařízení (pohyb myši, stisk klávesy, …) O těchto událostech upozorňuje x klienta. To se děje pomocí X protokolu. Klient si toto vyhodnotí a pošle x serveru nové vykreslení.
Toto je použitelné jen v některých případech, např. pokud aplikace běží jen v jednom okně, jehož velikost se nemění. Ale v našem případě chceme víc – Firefox si může otvírat další okna, některá chceme minimalizovat, a tak dále. Proto zde máme ještě window manager.
Je to vlastne běžný x klient, který se nám stará o přesun a změnu velikosti oken, dále může například vytvářet menu, panel, pozadí,… Window managerů je spousta – AfterStep, twm,…
Další součástí je display manager. Může to být xdm, gdm, kdm. DM se stará o přihlašování do GUI. Po úspěšném je spuštěn příslušný wm. Poslední důležitou součástí je protokol xdmcp, který se stará o komunikaci mezi x serverem a display managerem.
Toto vše nám může běžet na jednom stroji, ale to nebude náš případ. My potřebujeme na slabém HW spustit x server, který se pomocí xdmcp spojí s display managerem terminálového serveru a na něm budeme spouštět x klienty (naše aplikace).
Na serveru poběží i window manager. Pro tento případ jsem zvolil pawm. Je to malé, rychlé prostředí, které umí zobrazovat ikony, panel a dovolí přepínat mezi aplikacemi. Pro naše účely je to naprosto ideální. Další výhodou je, že je součástí portů ve FreeBSD. Pro prohlížení www stránek použijeme prohlížeč Firefox. Bylo by i možné pustit Firefox bez window manageru, ale asi by to nebylo to pravé. Bez správy více oken, posouvání a minimalizování je brouzdání dost nepohodlné.
Dále jsem použil gdm. Pro jednoduché účely by bylo možné použít i xdm, ale v našem případě potřebuje autologin a to xdm už nezvládá.
Praktická část
Takže si nainstalujeme X:
$ cd /usr/ports/x11/xorg $ make install clean
Přidáme gdm:
$ cd /usr/ports/x11/gdm $ make install clean
a nakonec si nainstalujeme pawm:
$ cd /usr/ports/x11-wm/pawm $ make install clean
Z aplikací nainstalujeme již zmiňovaný firefox:
$ cd /usr/ports/www/firefox $ make install clean
Tím máme v adresáři /etc/X11R6
celá X. Jsou dvě možnosti, jak je zprostředkovat klientům. První je nasdílet přes NFS. To bych jim musel ale dát k dispozici celé /usr
. To já nechci. Druhá možnost je nakopírování této adresářové struktury do /diskless_root
:
$ cp -r /usr/X11R6 /diskless_root/usr
Je nutná ještě jedna drobnost – /usr
máme v režimu RO, ale kvůli přepínání klávesnic potřebujeme mít právo zápisu do adresáře compiled. Proto si jej nalinkujeme do /tmp
:
$ cd /usr/X11R6/lib/X11/xkb/compiled/ $ mv compiled compiled.old $ ln -s /tmp compiled
Konfigurace Xorg
Ještě by to chtělo nakonfigurovat Xorg. Ale prozatím jej budeme řešit jen pro vlastní server. Tento krok není nutností, ale pro snadné nastavení gdm se to hodí.
Jak postupovat? Jako uživatel root spustíme:
$ Xorg -configure
Do domovského adresáře uživatele, se vygeneruje xorg.conf.new
. Pokud se tak nestane, prohledejte logy a závadu opravte. Tento soubor si potom upravte k obrazu svému. Detailní ladění X je nad rámec tohoto článku.
Upravený soubor znovu zkusíme spustit pomocí Xorg -config /cesta/k/Xorg.conf.new
. Až budete s konfiguračním souborem hotovi, zkopírujte jej do /etc/X11
.
Konfigurace PAWM
Založíme si uživatele určeného pro autologin, např. student. V jeho domovském adresáři pak založíme adresář .pawm
. Do něj připravíme zástupce na terminál, Firefox a další aplikace (to už je na vás). Soubory se jmenují app_nazevaplikace
.
Nutné je dodržet app_
na začátku. Obsah souboru:
terminal.xpm
100 10
Xterm terminal
xterm
První řádek je název ikonky, ta je uložena v adresáři /usr/X11R6/share/pawm/icons
. Druhý řádek je poloha ikonky v pixelech. Třetí je potom nadpis ikonky a poslední řádek říká, co se spouští.
Ikonka Firefoxu vypadá podobně:
firefox.xpm
500 10
Firefox
firefox -P `echo $DISPLAY | cut -d : -f1`
K poslednímu řádku se vrátíme později.
Nezapomeňte nakopírovat příslušné ikonky:
$ cp /usr/local/lib/firefox/icons/default.xpm /usr/X11R6/share/pawm/icons
Vlastní konfugrace pawm je v /usr/X11R6/etc/pawm.conf
. Je dobře komentovaná, nastavte si vše dle vašich potřeb. Já nastavil zákaz automatického schovávání panelu – méně zkušené uživatele by to mohlo plést, a dále jsem vypnul panelovou ikonku, která slouží k ukončení pawm.
Na stránkách výrobce je ještě několik pluginů – např. zobrazovač pozadí. Pokud si chcete vzhled vylepšit, pod článkem najdete příslušné odkazy. Tím máme nakonfigurované prostředí pawm.
Pokud chceme opravdu jen spouštět pawm a neřešit další desktopy, upravte soubor /usr/local/etc/gdm/Xsession
. Zapište do něj jen
#!/bin/sh
exec pawm
Abychom vyzkoušeli, jak prostředí vypadá, zkusíme jej spustit pod daným uživatelem:
$ su student $ exec pawm
Pokud je vše správně, objeví se plocha s panelem a našimi ikonkami. Pomoci ctrl+alt+backspace můžeme X ukončit.
Konfigurace GDM
Pokud máte prostředí odladěno, půjdeme na nastavení gdm. Aby bylo možné využít v gdm autologin, je nutné přidat soubor do adresáře /etc/pam.d
. Uvidíte soubor gdm, který bude vypadat hodně podobně:
# PAM configuration for the "gdm" service
#
# auth
auth required pam_nologin.so no_warn
#auth sufficient pam_krb5.so no_warn try_first_pass
#auth sufficient pam_ssh.so no_warn try_first_pass
auth required pam_unix.so no_warn try_first_pass
# account
#account required pam_krb5.so
account required pam_unix.so
# session
#session optional pam_ssh.so
session required pam_permit.so
My přidáme ještě gdm-autologin:
auth required pam_nologin.so
auth required pam_permit.so
account required pam_unix.so
session required pam_permit.so
Více o této problematice se dozvíte přímo na stránkách gnome.
Server musí při startu spustit i gdm. To pak čeká na požadavky terminálů. Protože jsme jej instalovali z portů, vše je již připraveno a stačí jen do /etc/rc.conf
přidat gdm_enable="YES"
. Při startu serveru už se nám spustí skript /usr/local/etc/rc.d/gdm
a vše zařídí.
Gdm je sympatický v tom, že jeho konfigurace jde „naklikat“ a nemusíme ručně zasahovat do konfiguračních souborů. Takže po jeho spuštění vyberte nahoře v menu nastavení, zadejte rootovské heslo, nastavte si autologin a povolte xdmcp požadavky ze sítě. Potom je nutné gdm zrestartovat:
$ /usr/locat/etc/rc.d/gdm restart
Druhou možností konfigurace je spustit si X, spustit si terminál, přepnout se na uživatele root a spustíme přímo gdmsetup.
Pokud netoužíte po autologinu a použijete xdm, stačí jej zkompilovat z portu a udělat malou změnu v konf. souboru, aby xdm zpracovávalo i požadavky ze sítě Stačí odkomentovat (znak !) na řádku
DisplayManager.requestPort: 0
Klientské terminály
Tím máme terminálový server připraven. Konfigurace X klientů je velice jednoduchá a dost podobná. Necháme klienta nabootovat a spustíme shell sh, nastavíme si proměnnou HOME, aby Xorg věděl, kam uložit konfigurační soubor:
$ export HOME=/var
Dál postupujeme stejně jako u serveru. Spustíme:
$ Xorg -configure
Ve /var
vznikne opět Xorg.conf.new
. Ten si upravte a nakopírujte jej na příslušné místo (ale na serveru!):
$ cp /diskless_rw/192.168.12.1/var/log/Xorg.conf.new /diskless_rw/192.168.12.1/etc/X11R6/Xorg.conf
Já ještě přidávám do sekce ServerLayout:
Option "DontZap" "True"
Tím se zabrání uživatelům stiskem ctrl + alt + backspace ukončit X. Dále pak v sekci InputDevice pro klávesnici nastavuji uživatelům českou klávesnici a sekundární anglickou. Přepíná se levým alt + shift (nejobvyklejší zkratka ve Windows) a přepnutí na sekundární je indikováno rozsvícením scroll locku.
Stačí doplnit:
Option "XkbLayout" "cz,us" Option "XkbOptions" "grp:switch,grp:alt_shift_toggle,grp_led:scroll"
Dokončení
Už zbývá jen zajistit automatické spuštění X serveru a jeho připojení k terminálovému serveru. To se provede změnou v souborech rc2
( /diskless_rw/ip.ad.re.sa/etc/rc2
). Místo shellu spustíme X:
#!/bin/sh
/usr/sbin/moused -tauto -p /dev/psm0
X -query 192.168.12.254
Při tvorbě ikonky Firefoxu jsem říkal, že se k ní ještě vrátíme. Jde o ukládání profilu Firefoxu (v něm je uložena historie stránek, cache, panely, …). Každý terminál musí mít svůj profil. Proto se Firefox spouští takhle:
firefox -P `echo $DISPLAY | cut -d : -f1`
Spouštíme firefox rovnou s vybraným profilem. Jméno profilu se odvodí z proměnné DISPLAY. Tady jen malá zmínka – když si do /etc/hosts
nebo do DNS nezadáte jméno terminálu, bude v proměnné DISPLAY použita IP adresa.
Doporučuji nejprve na prvním terminálu spustit Firefox, tím vznikne v adresáři /home/student
adresář .mozilla/firefox
s profilem. Ten si zkopírujeme např. do adresářů aaaaaaaa.diskless-01
, bbbbbbbb.diskless-02
, cccccccc.diskless-03
, … a upravíme soubor profiles.ini
:
[General] StartWithLastProfile=1 [Profile0] Name=vychozi_student IsRelative=1 Path=pxtwytoy.vychozi_student Default=1 [Profile1] Name=diskless-01 IsRelative=1 Path=aaaaaaaa.diskless-01 [Profile2] Name=diskless-02 IsRelative=1 Path=bbbbbbbb.diskless-02 …
Tím je zajištěno, že si každý spustí svůj profil, jinak by Firefox při druhém spuštění na druhém terminálu nadával, že jedna instance už běží. Jednou za čas je vhodné přepsat používané profily výchozím.
Tím je vše hotovo. Ještě třeba můžete lokalizovat Firefox, nahrát do něj pluginy, …. nebo rozběhat další aplikace. To už je ale na vás. Toto řešení mi běží naprosto bez problémů několik měsíců s minimální údržbou (v podstatě jen záloha konfigurace serveru a přidávání/výměna terminálů). Je to myslím vhodná volba na využití starých PC a zpřístupnění internetu dalším uživatelům.
Poděkování
- Michal Kočer (četné připomínky a fakt, že mě dokopal k napsání těchto článků)
- Jiří Mikuláš (trefné připomínky)