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!
Eerste versie: sep 2000. Later enkele overbodige gedeelten verwijderd.
Laatste update: wo mei 8 08:30:18 CEST 2002