Linux aan je smaak aanpassen

In dit artikel wordt met Linux eigenlijk XFree86/GNU/Linux bedoeld, dus het hele operating system; kernel en alles eromheen.

Okay, we hebben Linux aan de praat, en het werkt allemaal prima, maar Nu Wil Ik... Alles in Linux is aanpasbaar, de enige grens is uw eigen verbeelding of tijd :-)

Programma's automatisch opstarten

Als ik inlog in X

KDE, Gnome en vele windowmanagers bieden hier eenvoudige voorzieningen voor, KDE heeft bijvoorbeeld een map Autostart. Wanneer u echter geen van beide desktops gebruikt, of de vrijheid wil hebben te wisselen tussen verschillende desktops, kunt u de opstartbestanden handmatig bewerken.

Wanneer u grafisch inlogt wordt het bestand ~/.xinitrc of bij sommige distributies ~/.xsession uitgevoerd. Dit is een shellscript, waarin u commando's kunt plaatsen. Logt u in op de tekstconsole, en start u X dan met startx, dan wordt xinitrc uitgevoerd.

Het laatste commando moet in principe de window- of sessionmanager opstarten. Een eenvoudig ~/.xinitrc is:

bbmail &
dfm &
xterm -geometry 80x40 -fn 6x13 &
exec blackbox

Eerst worden bbmail, dfm en xterm opgestart. Denk om de &-tekens, die zorgen ervoor dat uw programma's in de achtergrond gestart worden. Anders zou het shell-script erop blijven wachten. Het laatste commando exec blackbox, start de windowmanager. Het commando exec zorgt ervoor dat het huidige proces (dit script) wordt vervangen door de windowmanager blackbox. Zo wordt geen geheugenruimte meer ingenomen door een onnodig geworden proces.

Na exec blackbox geen &-teken! Dan zou immers het shellscript afsluiten, en derhalve zou X weer stoppen.

Gebruikt u Gnome, en wilt u in het Gnome control-center de windowmanager kunnen kiezen, dan zou .xinitrc er alsvolgt uit kunnen zien:

# een of ander planner programma
pland &
exec gnome-session

Wilt u bij inloggen direct online gaan en mail ophalen:

ppp-on && fetchmail -a pop.myprovider.nl &
exec whatever-wm

waarbij uiteraard ppp-on een scriptje moet zijn dat de verbinding met de provider legt.

Zie voor meer voorbeelden: man startx en man xinit.

Als ik inlog op een tekstconsole

Wanneer u alleen op de tekstconsole werkt, kunt u programma's automatisch laten starten door ze in het bestand .bashrc (voor bash, of .cshrc voor csh) te plaatsen. De meeste shells lezen ook .profile en /etc/profile.

Bij het opstarten van de computer

Dit is wat ingewikkelder. Het opstartproces van Linux kan verregaand aangepast worden. Eerst zullen we zo simpel mogelijk uit de doeken doen hoe het werkt:

Als de kernel gestart wordt, test het alle hardware op de computer, mount het het root-filesystem en start vervolgens het programma /sbin/init.

Dit programma leest het bestand /etc/inittab dat de startvolgorde regelt, en het blijft ook draaien (als proces nummer 1) totdat de computer weer wordt afgesloten of herstart. Zie ook man init en man inittab.

In /etc/inittab zien we onder andere een regel als:

id:3:initdefault:

en:

si:I:bootwait:/sbin/init.d/boot

Dit laatste script (/sbin/init.d/boot, bij SuSE, op sommige systemen heet dit anders, bijvoorbeeld /etc/rc) is het eerste shellscript dat gestart wordt door init. Wijzig dit script liever niet zelf, maar zet low-level zaken die u direct na het opstarten van de computer (zoals bijvoorbeeld hdparm, voor het instellen van harddisk functies) in het bestand boot.local, dat door boot gerund wordt.

Na het runnen van het boot script, gaat init naar het `initdefault' runlevel (3 in dit voorbeeld). Afhankelijk van het runlevel wordt het systeem in een bepaalde configuratie opgestart. Meestal is de indeling alsvolgt:

Runlevel Functie
N Dit is het runlevel bij het opstarten
S Single-user mode zonder netwerk. Bedoeld om in alle rust systeem-updates te kunnen doen, zonder dat gebruikers in kunnen loggen
1 Multi-user zonder netwerk
2 Multi-user met netwerk
3 Bij SuSE: Multi-user met netwerk en xdm (grafische login). Bij de meeste andere distributies wordt dit in runlevel 5 gedaan
4 en 5 Gereserveerd
6 Reboot. De computer wordt herstart
0 Halt. De computer wordt afgesloten

De verschillende runlevels en hun functie.

Willen wij nu bepaalde programma's alleen in bepaalde runlevels opstarten, dan kunnen wij in speciale subdirectories (met de namen rc<x>.d, waarbij <x> staat voor het gewenste runlevel) van de directories /sbin/init.d/ of /etc/rc.d/, scriptjes plaatsen die dit doen. Deze scriptjes worden door init gestart met de parameter `start'. Wordt er van runlevel gewisseld, en komt het gelijknamige script niet voor in de rc-directory van het nieuwe runlevel, dan wordt het script aangeroepen met de parameter `stop'.

Om de volgorde van starten en afsluiten van de scriptjes in de rc-directories te bepalen, worden hun namen voorafgegaan door Snn of Knn. <nn> is hierbij een nummer, waarop de scriptjes gesorteerd worden. S staat voor start, K staat voor `kill'. Het is gewoonte om al deze bestandsnamen als symlinks te maken naar één enkel script dat een directory lager staat.

Dit systeem wordt `System V Init' genoemd. Niet alle distributies bedienen zich hiervan. Een mogelijkheid is ook dat alle programma's vanuit /etc/inittab worden gestart. Zie dat bestand voor verdere informatie.

Tijd voor een voorbeeld! Wij maken startscriptjes voor de offline-proxy Wwwoffle.

Wij maken een scriptje met de naam wwwoffle in de directory /sbin/init.d:

#!/bin/sh
case "$1" in
  start)
    echo "Starting WWWOFFLE daemon"
    /usr/local/sbin/wwwoffled || echo "Failed!" ;;
  stop)
    echo "Shutting down WWWOFFLE daemon"
    /usr/local/bin/wwwoffle -kill ;;
esac

Dit is een simpel voorbeeld. Bekijk andere scriptjes of een eventueel aanwezig sjabloon (skeleton) om te zien hoe je het een beetje in de huisstijl van je distributie kan doen.

Nu willen wij dat deze wwwoffle daemon gestart wordt in de runlevels 2 en 3. We willen dat hij als een van de laatste programma's wordt gestart, en als een van de eerste weer wordt afgesloten bij het afsluiten van de computer, of bijvoorbeeld het wisselen naar runlevel S.

Maak daartoe 4 symlinks aan, vanuit dezelfde directory:

# ln -s ../wwwoffle rc2.d/S30wwwoffle
# ln -s ../wwwoffle rc3.d/S30wwwoffle
# ln -s ../wwwoffle rc2.d/K10wwwoffle
# ln -s ../wwwoffle rc3.d/K10wwwoffle

Kijk goed en denk even na... dit zou het moeten doen! Wwwoffle wordt netjes gestart als we in runlevel 2 of 3 zijn, en anders weer netjes afgesloten.

Een mooie achtergrond op mijn desktop

De achtergrond van het bureaublad wordt in X terminologie root window genoemd. Er zijn een verschillende programma's om de root window mee te bewerken:

xsetroot

Met xsetroot -solid <kleur> kan de achtergrond van een effen kleur worden voorzien.

Kader: Kleuren in X

Kleuren kunnen namen hebben (voor namen zie het bestand /usr/X11R6/lib/X11/rgb.txt of het programma xcolors) of met hexadecimale getallen worden aangeduid op de volgende manier:

rgb:<roodwaarde>/<groenwaarde>/<blauwwaarde>

Hexadecimale getallen tellen van 0 tot en met 15, waarbij de getallen 10 t/m 15 worden weergegeven met de letters a t/m f. De rgb waardes kunnen elk uit 1 t/m 4 hexadecimale cijfers bestaan. Rood is dan: rgb:f/0/0. Blauw: rgb:0/0/f. Merk op dat f de hoogste waarde is (decimaal 15). Wil men kleuren nauwkeuriger specificeren, gebruike men meer hexadecimale cijfers: rgb:f834/c934/0180 geeft een warm-gele kleur. De hexadecimale schrijfwijze mag ook alsvolgt: #RGB, #RRGGBB, #RRRGGGBBB of #RRRRGGGGBBBB. Zie verder: man X, sectie COLOR NAMES.

Met

xsetroot -fg red -bg orange -mod 16 16

maakt u van uw bureaublad een oubollig tafelkleedje. De -mod x y optie maakt een rasterpatroontje. Experimenteer met verschillende waarden!

Met xsetroot kan ook de standaard cursor aangepast worden: Met

xsetroot -cursor_name left_ptr

krijgt u een kleine pijl als cursor.

Cursornamen kunt u vinden in /usr/X11/include/X11/cursorfont.h, waarbij het voorvoegsel XC_ voor elke cursornaam weggelaten kan worden. Zie verder man xsetroot.

Andere programma's

Andere programma's die de achtergrond kunnen instellen zijn: XV, qiv, display (van ImageMagick), wmsetbg, Esetroot, xsetbg, xli, enz.

Verder zijn er ook nog vele leuke programma's die een dynamische achtergrond maken. Ik noem hier enkele:

XStarfish:

Dit programma, oorspronkelijk geschreven voor MacOS, berekent met behulp van willekeurig gekozen wiskundige (o.a. goniometrische) functies een schitterende achtergrond, die eruit kan zien als een wolkenpatroon (elke keer anders) of een ander prachtig effect.

Tip: Laat het programma werken met een lage prioriteit, dan merk je niets van de zware berekeningen:

nice -19 xstarfish -s full

laat het programma rustig op de achtergrond zijn werk doen. Homepage van xstarfish: http://www.redplanetsw.com/starfish/.

xearth:

Toont een aardoppervlak in de root window.

xsnow:

Waarschuwing! Alleen tijdens de kerstdagen gebruiken!

Deze voorbeeld commando's kunt u naar eigen wens aanpassen (eigen plaatjes uiteraard) en in uw .xinitrc opnemen (zie Als ik inlog in X). Verschillende windowmanagers (o.a. WindowMaker, Enlightenment) brengen hun eigen programmaatjes mee om de achtergrond in te stellen, en ook in KDE en Gnome gebeurt dit netjes via menuutjes.

Prutsen met X Resources

Het X Window Systeem biedt de mogelijkheid een database van instellingen bij te houden, die applicaties naar believen kunnen raadplegen. Deze database kan opties bevatten die direct voor een hele reeks applicaties gelden, voor één gehele applicatie, of zelfs voor één enkel deel van een applicatie.

Om dit te begrijpen moeten we iets dieper ingaan op de manier waarop het X Window Systeem georganiseerd is. Elke X-applicatie heeft tenminste 1 hoofdwindow. Deze window bestaat uit allerlei "widgets" (een samentrekking van "window" en "gadget"). Widgets zijn bijvoorbeeld knoppen, aankruisvakjes, invoervelden en wat niet al. In X terminologie heten deze sub-windows ook windows. Deze windows worden gestructureerd volgens een boom-systeem. Alle widgets in de hoofdwindow zijn kinderen van de hoofdwindow zelf. Een dialoogwindow is ook een kind van de hoofdwindow; en de widgets in (bijvoorbeeld) een dialoogbox zijn weer kinderen van de dialoogwindow, die weer een kind is van... etc. etc.

Het programma Editres

editres is een programma dat deze boomstructuur zichtbaar maakt. Niet alle programma's ondersteunen echter het editres-protocol, maar bijvoorbeeld programma's die de Athena widget set of Motif (of LessTif) gebruiken wel. Start editres op en selecteer uit het "Commands" menu de optie "Get Tree". Klik vervolgens op het programma waarvan je de boomstructuur van widgets wilt zien. Selecteer een item uit de boomstructuur en kies uit het "Commands" menu de optie "Show Resource Box." Hier zie je de opties die voor de geselecteerde widget kunnen gelden.

Widgets, classes en bindings

Een enkele widget heeft een naam, vaak pad (path) genaamd, bijvoorbeeld:

nedit.main.menuBar.popup_fileMenu.editMenu.paste

Van links naar recht loopt een lijn van hoofdwindow naar de verschillende subwindows. Het knopje "paste" uit het Edit-menu van NEdit heeft dit pad. Het knopje "paste" is een kind van "editMenu", dat weer een tak (child) is van "popup_fileMenu" etc. etc. tot aan "main", dat een tak is van "nedit".

Een widget heeft dus een naam die hem van alle andere widgets onderscheidt. Maar elke widget behoort ook tot een "class", een bepaalde soort. Zo is de class van het knopje "paste" uit het voorbeeld "XmPushButton". Alle andere knopjes uit het editmenu hebben dus andere namen, maar wel dezelfde class. Door naar de class te refereren i.p.v. de naam, kunnen we dus alle knopjes in een edit-menu tegelijk adresseren. Classes beginnen met een hoofdletter.

Het pad, dat via namen of classes loopt, kan tenslotte ook nog verschillende bindingen hebben. Directe bindingen worden met een punt (.) aangegeven, vrije bindingen met een asterisk (*). Vrije bindingen kunnen meerdere niveaus overslaan:

NEdit*XmPushButton

bijvoorbeeld refereert naar alle widgets in NEdit die tot de class XmPushButton behoren.

NEdit*bgMenu*XmPushButton

wijst alleen naar de knopjes waarvan het pad over bgMenu loopt. (bgMenu is in NEdit het contextmenu van het tekstscherm).

NEdit*bgMenu.XmPushButton

echter wijst alleen naar de directe kinderen van bgMenu, voorzover die de class XmPushButton hebben.

Tenslotte kan ook in plaats van een naam of class een vraagteken (?) worden gebruikt:

NEdit*bgMenu.?.XmPushButton

verwijst alleen naar de widgets met class XmPushButton die "kleinkinderen" zijn van bgMenu, d.w.z. er ligt één niveau tussenin.

Resources. Het ~/.Xdefaults bestand

Elke widgetclass heeft een aantal resources, zoals font, color, height en talloze andere. Met behulp van editres kun je hiermee experimenteren. Om een specifieke resource aan te geven plakken we nog een punt (.) achter het windowpad, gevolgd door de resourcenaam, bijvoorbeeld:

netscape.Navigator.form.mainForm.viewParent.scrollerForm.pane.
        scroller.drawingArea.form.pane.scroller.vscroll.troughColor

(één regel). We wijzen naar de resource troughColor (de ondergrond) van de vertikale scrollbar (schuifbalk) van onze Netscape window. Willen we de resource troughColor van alle scrollbars aanspreken, moeten we het pad inkorten, vrije bindingen aanbrengen en de class van schuifbalken gebruiken i.p.v. de naam:

netscape*XmScrollBar.troughColor

In het bestand ~/.Xdefaults (of ~/.Xresources) kunnen resources worden ingevuld. Achter het window-pad met resource een dubbele punt (:) en de waarde:

Netscape*XmScrollBar.troughColor: red

geeft alle schuifbalken van Netscape een rode ondergrond. Experimenteer hiermee en met editres! Ook programma's die editres niet ondersteunen kunnen wel via resources worden beïnvloed. Zie man pages bij betreffende programma's. Het verdient de voorkeur de applicatie niet bij naam (netscape) maar bij class (Netscape) te noemen, dan werken de resources ook wanneer het bestand onder een andere naam gestart is. In resource-files kan commentaar ingevoegd worden, doe dit achter een uitroepteken (!). Voorbeeld van een (deel van mijn) .Xdefaults file:

xv*nolimits:            true

!Rxvt*backgroundPixmap: /home/wilbert/pictures/textures/marble1.xpm
Rxvt*background:        LightYellow2
Rxvt*color7:            rgb:e/e/e
Rxvt*font:              6x13
Rxvt*font1:             5x7
Rxvt*font2:             6x10
Rxvt*font3:             7x13
Rxvt*font4:             9x15

Netscape*fontList:      -adobe-helvetica-medium-r-normal-*-10-*
!Netscape*fontList:     -*-lucida-medium-r-*-*-*-100-*-*-*-*-*-*
XTar*fontList:                  -adobe-helvetica-medium-r-normal--10-*-*-*-*-*
XTar*FileList.fontList:         fixed
XTar*XmText.fontList:           -adobe-courier-medium-r-normal-*-12-*-*-*-*-*
XTar.geometry:                  600x500
XTar*mappings:                  .gif    xv %s\n\
                                .jpg    xv %s\n\
                                .tif    xv %s\n\
                                .tiff   xv %s\n\
                                .pbm    xv %s\n\
                                .ppm    xv %s\n\
                                .png    xv %s\n\
                                .pnm    xv %s\n\
                                .pgm    xv %s\n\
                                .xbm    xv %s\n\
                                .xpm    xv %s\n\
                                .bm     xv %s\n\
                                .xwd    xwud -n %s\n\
                                .htm    rxvt -e lynx %s\n\
                                .html   rxvt -e lynx %s\n\
                                .mpg    mpeg_play %s\n\
                                .mpeg   mpeg_play %s\n\
                                .ps     gv %s\n\
                                .dvi    xdvi %s

Hier zien we ook meteen wat lettertype grappen. Lees voor meer informatie over het specificeren van lettertypen onder X het kader Lettertypen in X.

Lettertypen in X

Lettertypen worden op verschillende manieren aangeduid. De eerste is een volledige naam (de X Logical Font Description, "XLFD") bestaande uit de volgende velden:

Foundry Meestal de firma naam die het lettertype geleverd heeft.
Family Familie (times, helvetica, bookman etc)
Weight Gewicht. Heeft waarden als bold, medium, black, regular.
Slant i=cursief, o=oblique (iets minder cursief bij sommige lettertypen), r=roman (rechtop)
Set Width normal of semicondensed. Bij sommige lettertypen wordt hiermee de breedte beïnvloed.
Adstyl Een extra veld voor stijl parameters. Veel waarden zijn mogelijk bij bepaalde lettertypen, zoals sans, light, plain, heavy etc.
PixelSize Pixelgrootte voor bitmap-lettertypen
PointSize Puntgrootte voor schaalbare lettertypen (True Type, Type 1)
resX Oplossend vermogen in X richting (meestal 75 of 100)
resY Oplossend vermogen in Y richting (meestal 75 of 100)
spc Geen idee!
Average Width Beïnvloedt de gemiddelde breedte
Registry-Encoding De karakterset

Lettertypen in X.

Met het programma xfontsel of (handiger) gtkfontsel kun je al deze velden op hun werking beproeven. Klik op Select en je kunt de complete font-naam ergens plakken met de middelste muisknop. Alle velden worden voorafgegaan door een min-teken (-). Als je velden vrij wilt laten geef ze dan een sterretje (*). Wil je de laatste velden allemaal vrij laten, mogen de sterretjes weggelaten worden.

De tweede manier is een korte naam te gebruiken zoals 6x13. Er wordt dan een fixed-width font (lettertype met vaste tekenbreedte) gekozen. Het programma xlsfonts laat je alle beschikbare namen zien. Tip: doe

xlsfonts | less

om ze op je gemak langs te lezen.

Bij vrijwel alle applicaties kun je het gebruikte lettertype veranderen. Met bijvoorbeeld het commando:

xterm -fn '-*-lucidatypewriter-medium-r-*-*-*-120-*'

krijg je een xterm met een schrijfmachine lettertype, puntgrootte 120 (12). In de shell kun je lettertypenamen beter tussen enkele aanhalingstekens zetten, omdat de shell altijd filenamen probeert te substitueren als er wildcards (?, [ ] en *) in de invoer zitten. Tekst tussen enkele aanhalingstekens wordt niet geexpandeerd.

De waarden in het ~/.Xdefaults bestand worden normaal gesproken ingelezen bij het inloggen in X. Maar als je tijdens de lopende sessie de ~/.Xdefaults hebt gewijzigd, kun je het opnieuw laden met:

xrdb -merge ~/.Xdefaults

Zie ook man X en man xrdb. Veel plezier!

© 2002 Wilbert Berendsen. Deze tekst is beschikbaar onder de GNU Free Documentation License.
Eerste versie: sep 2000. Later enkele overbodige gedeelten verwijderd.
Laatste update: wo mei 8 08:30:18 CEST 2002