Gentoo Logo

Device File System Vejledningen

Indhold:

1.  Hvad er devfs?

De (gode?) gamle dage

Advarsel: devfs er forældet og vil med tiden blive fjernet fra det stabile 2.6 træ. Brugere på 2.6 kerner bliver hermed henvist til at skifte til udev. For mere information se venligst Gentoo udev Guide(engelsk).

Traditionelle Linux implementationer giver deres brugere en abstrakt enhedssti, ved navnet /dev. Inde i denne sti finder brugeren enhedsnoder, som er specielle filer, der repræsenterer enheder i deres system. F.eks., repræsenterer /dev/hda den første IDE enhed i deres system. Ved at stille enhedsfiler til rådighed for brugerne, kan de lave programmer, der kan interagere med hardware, som om at hardwaren var en almindelig fil i stedet for at bruge specielle APIer.

Enhedsfilerne kan deles op i to grupper, de kaldes character-enheder og blok-enheder. Den første gruppe består af hardware, hvor læsning/skrivning ikke bruger buffer. Den anden gruppe består naturligvis af hardware, hvor læsning/skrivning bruger buffer. Begge enheder kan læse en character af gangen, eller i blokke. Derfor kan navngivningen måske lyde forvirrende og er faktisk forkert.

Hvis du kigger nærmere på en given enhedsfil, finder du måske noget i stil med dette:

Kode oversigt 1.1: At tjekke informationen i en given enhedsfil

# ls -l /dev/hda
brw-rw----    1 root     disk       3,   0 Jul  5  2000 /dev/hda

I det førnævnte eksempel så vi at /dev/hda er en blok enhed. Mere vigtigt er at den har to specielle tal tilskrevet: 3, 0. Dette par kaldes største-mindste parret. Det bruges af kernen til at til at kortlægge en enhedsfil til en rigtig enhed. Den største stemmer overens med en bestemt enhed, den mindste med en underenhed. Lyder det forvirrende? Det er det ikke.

To eksempler er /dev/hda4 og /dev/tty5. Den første enhedsfil stemmer overens med den fjerde partition på den første IDE enhed. Dens største-mindste par er 3, 4. Med andre ord, passer den mindste med den partition, hvor den største stemmer med enheden. Det andet eksempel har 4, 5 som største-mindste parret. I dette tilfælde passer største med terminal driveren, mens mindsten passer med terminalens nummer (i dette tilfælde den femte terminal).

Problemerne

Hvis du laver et hurtigt tjek i sådan en /dev, finder du ud af, at ikke bare er alle dine enheder listet, men alle mulige enheder du kan forestille dig. Med andre ord har du enhedsfiler for enheder du ikke har. At vedligeholde sådan en enhedsgruppe er en større opgave, for at sige det mildt. Forestil dig at skulle ændre rettigheder på alle de enhedsfiler, der har en tilsvarende enhed i dit system, og efterlade resten af de enhedsfiler som de er.

Når du tilføjer ny hardware til dit system og denne hardware ikke havde en enhedsfil før, så er du nødt til at lave en. Avancerede brugere ved at denne opgave kan udføres med ./MAKEDEV inde i /dev træet, men ved du lige med det samme hvilken enhed du skal lave?

Når du har programmer, der interagerer med hardware gennem enhedsfiler, så kan du ikke have at root-partitionen er mountet kun med læse rettigheder, selvom der ikke er brug for at der er skrive rettigheder. Og du kan ikke have /dev på en separat partition, da mount har brug for /dev til at mounte partitioner.

Løsningerne

Som du nok kan forestille dig har kerne-hackerne (læs: programmører) fundet en hel del løsninger til de førnævnte problemer. Mange af dem har dog andre ulemper som er beskrevet på http://www.atnf.csiro.au/people/rgooch/linux/docs/devfs.html#faq-why. Vi vil ikke diskutere disse implementationer, men fokuserer på en implementation der har klaret sig ind i den officielle kerne kildekode: devfs.

devfs som den alsidige vinder?

devfs klarer alle de listede problemer. Det giver kun brugeren eksisterende enheder, tilføjer nye noder når nye enheder bliver fundet og gør det muligt at mounte et root filsystem kun med læserettigheder. Det håndterer også andre problemer som vi ikke har diskuteret fordi det er mindre spændende for brugere...

F.eks. med devfs skal du ikke bekymre dig om største/mindste par. Det er stadig understøttet (for at sikre bagudkompabilitet), men ikke nødvendigt. Dette gør det muligt for Linux at understøtte mange flere enheder, da der ikke er nogen grænser mere (tal har altid grænser :)

devfs kommer dog med dens egne problemer; for brugerne er disse problemer ikke rigtig synlige, men for kerne vedligeholderne er problemerne store nok til at markere devfs forældet for at favorere udev(engelsk), som Gentoo understøtter og bruger som standard på de fleste arkitekturer siden 2005.0 udgivelsen når man bruger en 2.6 kerne.

For mere information om hvorfor devfs er markeret forældet, læs da udev FAQ og udev versus devfs dokument, som begge er på engelsk.

2.  At navigere gennem enhedstræet

Biblioteker

En af de første ting du måske ligger mærke til er, at devfs bruger biblioteker til at gruppere enheder sammen med. Dette forøger læsbarheden, da alle relaterede enheder nu er inde i et fælles bibliotek.

F.eks. alle IDE-relaterede enheder er inde i /dev/ide/ enhedsbiblioteket, og SCSI-relaterede enheder er inde i /dev/scsi/. SCSI og IDE drev ses på den samme måde, dvs. at de har begge den samme struktur over deres underbiblioteker.

IDE og SCSI drev kontrolleres af en adapter (on-board eller et separat kort), kaldet host(vært). På hver kanal kan man have adskillige ID'er. Sådan et ID identificerer en disk. Dette ID kaldes target(målet). Nogle SCSI enheder kan have flere LUN'er (Logical Unit Numbers), f.eks. instansenheder der håndterer flere medier på samme tid (hi-end bånd-drev). Du har for det meste kun en enkelt LUN med lun0/.

Så hvor vi før brugte /dev/hda4, har vi nu /dev/ide/host0/bus0/target0/lun0/part4. Dette er meget nemmere... nej du skal ikke diskutere det med mig... det er nemmere... jaja! :)

Bemærk: Du kan også bruge en navngivning der ligger tættere på Unix til harddiske, såsom c0b0t0u0p2. De kan findes i /dev/ide/hd, /dev/scsi/hd osv.

For at give dig et indtryk af bibliotekerne, er her en liste over de biblioteker jeg har på min bærbar:

Kode oversigt 2.1: Biblioteker i /dev

cdroms/     cpu/        discs/          floppy/
ide/        input/      loop/           misc/
netlink/    printers/   pts/            pty/
scsi/       sg/         shm/            sound/
sr/         usb/        vc/             vcc/

Kompabilitet bagud ved brug af devfsd

At bruge dette nye system lyder som at lege, men adskillige værktøjer og programmer bruger det tidligere system. For at være sikker på at ingen systemer bliver smadret pga. dette, er devfsd blevet lavet. Denne daemon laver symbolske genveje fra de gamle navne så de peger på nye enhedsfiler.

Kode oversigt 2.2: Skabte symbolske genveje

$ ls -l /dev/hda4
lr-xr-xr-x    1 root     root           33 Aug 25 12:08 /dev/hda4 -> ide/host0/bus0/target0/lun0/part4

Med devfsd kan du også sætte rettigheder, lave nye enhedsfiler, definere handlinger osv. Alt dette beskrives i det næste kapitel.

3.  At administrere enhedstræet

At genstarte devfsd

Når du ændrer /etc/devfsd.conf filen og du vil have ændringerne til at træde i kraft, så er du ikke nødt til at genstarte. Afhængigt af hvad du ønsker, kan du bruge de følgende to signaler:

SIGHUP får devfsd til at genlæse opsætningsfilen, genlæse de delte objekter og generere REGISTER hændelsen for hvert blad node i enhedstræet.

SIGUSR1 gør det samme, men generer ikke REGISTER hændelserne.

For at sende et signal skal du simpelthen bruge kill eller killall:

Kode oversigt 3.1: At sende SIGHUP signalet til devfsd

# kill -s SIGHUP `pidof devfsd`
eller
# killall -s SIGHUP devfsd

At fjerne kompabilitet via symbolske genveje

Advarsel: Pt. kan Gentoo ikke leve uden de kompabilitetsikrende symbolske genveje.

Hvis du vil fjerne de symbolske genveje, der fylder op i /dev, fra dit Gentoo system (Gentoo aktiverer det som standard), så skal du ændre /etc/devfsd.conf og fjerne de følgende to linier:

Kode oversigt 3.2: /etc/devfsd.conf for bagudkompabilitet

# Udkommenter de følgende to linier for at fjerne de symbolske genveje
REGISTER        .*  MKOLDCOMPAT
UNREGISTER      .*  RMOLDCOMPAT

Du bliver nødt til at genstarte dit system for at ændringerne træder i kraft.

At fjerne autoload funktionaliteten

Når du henter et modul, så laver devfs automatisk enhedsfilerne. Hvis du ikke ønsker denne opførsel, så skal du fjerne den følgende linie fra /etc/devfsd.conf:

Kode oversigt 3.3: /etc/devfsd.conf, autoload funktionaliteten

LOOKUP      .*  MODLOAD

4.  Ting der er relaterede til rettigheder

At sætte/ændre rettigheder med devfsd

Bemærk: Disse instruktioner er gyldige så lang tid pam_console er slået fra i /etc/pam.d/system-auth. Hvis du har slået pam_console til der, så har PAM det sidste ord når det gælder rettigheder.

Hvis du vil sætte rettigheder ved brug af /etc/devfsd.conf, så skal du bruge den syntaks der bruges i det følgende eksempel:

Kode oversigt 4.1: Rettigheder i /etc/devfsd.conf

REGISTER    ^cdroms/.*  PERMISSIONS root.cdrom 0660

Det andet felt er enhedsgruppen, der starter fra /dev. Det er en regular expression, hvilket betyder at du kan vælge adskillige enhedsfiler i en regel.

Det fjerde felt er ejerskabet af enhedsfilen og det femte felt indeholder rettighederne på enhedsfilen.

At sætte rettighederne manuelt og få devfsd til at gemme dem

Dette er standard opførsel for Gentoo: hvis du chown (ændre ejer) og chmod (ændre tilstand) på nogle enhedsfiler, så vil devfsd gemme informationen, sådan at informationen overlever gennem genstart af systemet. Dette er fordi /etc/devfsd.conf filen indeholder de følgende linier:

Kode oversigt 4.2: /etc/devfsd.conf til at gemme rettigheder

REGISTER        ^pt[sy]/.*   IGNORE
CHANGE          ^pt[sy]/.*   IGNORE
CREATE          ^pt[sy]/.*   IGNORE
DELETE          ^pt[sy]      IGNORE
REGISTER        ^log         IGNORE
CHANGE          ^log         IGNORE
CREATE          ^log         IGNORE
DELETE          ^log         IGNORE
REGISTER        .*           COPY    /lib/dev-state/$devname $devpath
CHANGE          .*           COPY    $devpath /lib/dev-state/$devname
CREATE          .*           COPY    $devpath /lib/dev-state/$devname
DELETE          .*           CFUNCTION GLOBAL unlink
/lib/dev-state/$devname
RESTORE         /lib/dev-state

Med andre ord, ændrede enhedsfiler bliver kopieret over til /lib/dev-state så snart ændringen sker og kopieret over til /dev når systemet startes op.

En anden mulighed er at mounte /lib/dev-state/dev ved opstart. For at gøre dette skal du være sikker på at devfs ikke automatisk bliver mountet (dvs. du skal kompilere din kerne om igen) og at /dev/console eksisterer. Så skal du placere dette i starten af dit systems bootscripte:

Kode oversigt 4.3: At mounte /lib/dev-state i toppen af /dev

mount --bind /dev /lib/dev-state
mount -t devfs none /dev
devfsd /dev

5.  Ressourcer

For at få mere information omkring devfs, kan du tjekke de følgende ressourcer.

Mansiderne til devfsd.conf forklarer syntaksen for /etc/devfsd.conf filen. For at læse den, skriv man devfsd.conf.

devfs FAQ forklarer alt omkring devfs. Den indeholder også information omkring den indre devfs struktur og hvordan drivere kan understøtte devfs.

LinuxJournal er der en interessant artikel om devfs for Management and Administration.

Daniel Robbins har skrevet et sæt af artikler til IBM's DeveloperWorks omkring Avancerede filsystemer. Tre af dem handler om devfs:



Udskriv

Opdateret 20. juni 2005

The original version of this document was last updated November 15, 2007

Opsummering: I dette dokument finder du information om hvad devfs virkelig handler om og hvordan du arbejder med det.

Sven Vermeulen
Forfatter

Seemant Kulleen
Reviewer

Arne Mejlholm
Oversætter

Jesper Brodersen
Korrektur

Donate to support our development efforts.

Copyright 2001-2012 Gentoo Foundation, Inc. Questions, Comments? Contact us.