X window a terminálový server na FreeBSD

29. 6. 2007
Doba čtení: 8 minut

Sdílet

V minulém článku o terminál serveru jsme si ukázali, jak z FreeBSD udělat jednoduchý terminálový server s textovou konzolí. To ale dnes většině uživatelů už nestačí a pro spoustu běžně používaných aplikací chceme a potřebujeme nějaké to pěkné GUI. Dnes si tedy předvedeme, jak rozběhat X window a některé aplikace.

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+backspa­ce 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:

bitcoin_skoleni

[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)

Odkazy:

Autor článku

Petr Macek studoval aplikovanou informatiku na Jihočeské univerzitě, pracuje jako síťový specialista ve firmě Kostax, s. r. o. Baví ho především FreeBSD, sítě a monitoring Cacti.