4.5. Devfs

En af de nye ting i kerne 2.4.x er devfs, som er et godt alternativ til /dev-katalog-systemet.

4.5.1. Hvad er /dev

/dev's funktion er at strukturere alle mulige (og umulige) enheder, som filer. Hver enkelt fil definerer en enkelt enhed vha. 2 pointere (også kaldet major & minor number). Major angiver enhedens type (f.eks: disk-, terminal-, seriel-enhed), minor angiver den enkelte enhed indenfor den enkelte type (f.eks: tty1, tty2,..., hda1, hda2). Disse 2 pointere benytter kernen til at "slå op" i en drivertabel, for at finde den rigtige driver til en given enhed:


[root@linus /root]# ls -la /dev/hda*
brw------- 1 root root 3, 0 jan 1 1970 /dev/hda
brw------- 1 root root 3, 1 jan 1 1970 /dev/hda1
.
.
[root@linus /root]# ls -la /dev/tty?
crw------- 1 root root 4, 1 maj 24 05:38 tty0
crw------- 1 root root 4, 2 maj 24 05:38 tty1
.
.
Hvor 1. nummer efter gruppe er Major og 2. nummer er Minor.

For at være sikker på at en given enhed vil virke, skal der altså være en enhedsfil i /dev. Da der er mange forskellige (typer) enheder, skal der også være mange filer. Og for at mindske administrationen, er de oprettet på forhånd. I et typisk system, som f.eks. Red Hat 7.0, er der godt 12000 filer. Og det er nok de færreste filer, det enkelte system har brug for. Det er ikke fordi de fylder noget (omkring 300 kb i alt), men de optager hver en inode (se f.eks. http://e2fsprogs.sourceforge.net/ext2intro.html). Hvis enhedsfilen for en bestemt enhed nu ikke lige er oprettet, kan man benytte programmet /dev/MAKEDEV som kender til (næsten) alle enheder og deres respektive major- og minor-numre.

Hvorfor denne redundans, kan man så spørge? At både /dev, MAKEDEV-programmet og kernen skal have alle disse informationer? Det har nok været den mest indlysende og overskuelige måde at designe det på i tidernes morgen. Men som antallet af enheder stiger, bliver det mere og mere uoverskueligt og tidskrævende at administrere, og det kan Devfs gøre noget ved.

4.5.2. Hvad er Devfs

Devfs er et virtuelt filsystem, som har samme funktion som /dev, men som ikke ligger fysisk på harddisken. Umiddelbart vil det ligne /dev, da man tilgår enhederfiler igennem kataloget /dev. Linket går bare ikke ned på disken, men direkte ind i kernen (efter samme princip som /proc). Dermed er man fri for administrationen og redundans, da filerne altid svarer til de enheder som kernen har fundet.

4.5.2.1. Installation af Devfs

Devfs kræver en Linux-kerne oversat med parametrene CONFIG_DEVFS_FS og CONFIG_DEVFS_MOUNT, og user-space-dæmonen devfsd fra Richard Goochs FTP-server. Se i øvrigt Afsnit 4.6.

Udpak devfs-daemonen et sted og kør følgende:


[root@linus devfs]# make
[root@linus devfs]# make install

Som default vil devfsd ligge i /sbin.

For at et system kan gøre brug af devfs, er det noget af det første init skal starte. Det er rimeligt system-specifikt hvor opstart af devfsd skal ske, da systemfilerne (se Afsnit 1.10 er forskellige. I System V-baserede systemer er det /etc/rc.d/rc.sysinit, hvor det i BSD-baserede er i /etc/rc. Men under alle omstændigheder skal den første linje i disse filer være:


/sbin/devfsd /dev

Bemærk: Fra og med Red Hat 7.0 er følgende linje allerede indsat i /etc/rc.d/rc.sysinit:


[ -e /dev/.devfsd -a -x /sbin/devfsd ] && /sbin/devfsd /dev

Lidt forklaring: Hvis der ligger en fil ved navn .devfs i /dev og en eksekverbar fil ved navn devfsd i /sbin, så start devfs-daemonen. Så det eneste man behøver for at aktivere devfs på et Red Hat-system er at eksekvere følgende kommando:


[root@linus /root]# touch /dev/.devfsd

Og så er det bare at reboote. Så enkelt er det.

4.5.2.2. Problemer med Devfs

Forhåbentlig skulle der ikke opstå problemer, men det kan være at der i enkelte tilfælde er device-drivere som ikke er understøttet af Devfs endnu. Her er der 2 løsninger. Den ene er at hvis det kun drejer sig om nogle få enhedsfiler, kan de oprettes under opstart vha. mknod-programmet. Den anden er at pakke alle de ikke-devfs-kompatible enhedsfiler ind i en tar-fil, som pakkes ud i /dev under opstart.

Man kan også komme ud for at programmer benytter letforståelige links til enhedsfiler. Som f.eks. museprogrammet gpm. gpm benytter som standard enhedsfilen /dev/mouse. I dette tilfælde vil det være en god idé at sørge for at gpm gør brug af /dev/psaux direkte (eller en anden "rigtig" enhedsfil for mus). Da der ikke er en konfigurationsfil til gpm bliver man nødt til at gå direkte ind i scriptet for startup-scriptet til gpm (se Afsnit 1.10) og tilføje parameteren: "-m /dev/psaux". Red Hat 7.1 og senere versioner har forbedret det lidt, ved at man kan specificere en enhed i /etc/sysconfig/gpm. Opstartsprogrammet /etc/rc.d/init/gpm indeholder dog en fejl som gør at enheden altid vil være /dev/mouse. Ændr derfor følgende i /etc/rc.d/init/gpm:


if [ -n "$DEVICE" ]; then
        device="/dev/mouse"
fi

til:


if [ -z "$DEVICE" ]; then
        device="/dev/mouse"
fi

som tester om miljøvariablen "DEVICE" er tom. Hvis den er det, er der ikke angivet nogen enhed i /etc/sysconfig/gpm, og "DEVICE" sættes til /dev/mouse.

Vil du vide mere om Devfs, så kan vi anbefale Richard Gooch's Linux Devfs (Device File System) FAQ, som findes på http://www.atnf.csiro.au/~rgooch/linux/docs/devfs.html.