Device File System Vejledningen
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`
# 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 |
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 på
/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.
På 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:
Indholdet i dette dokument er autoriseret under en Creative Commons -
Attribution / Share Alike licens.
|