Ghid Device File System
1.
Ce este devfs?
Zilele (bune?) de demult
Atenţie:
devfs este depreciat şi a fost îndepărtat din ramura stabilă 2.6
în versiunea 2.6.13. Utilizatorii versiunilor de kernel 2.6 sunt, astfel,
sfătuiţi să comute la udev. Pentru mai multe informaţii despre udev, vă
rugăm să consultaţi Ghidul Gentoo
pentru udev.
|
Implementarea tradiţională Linux oferă utilizatorilor un director abstract
denumit /dev. În interiorul acestui director, utilizatorul poate
găsi noduri dispozitiv, fişiere speciale care reprezintă
dispozitivele din interiorul sistemului. De exemplu, /dev/hda
reprezintă primul dispozitiv IDE din sistem. Oferind fişiere dispozitiv
utilizatorilor, ei pot crea programe care lucrează cu componentele hardware
ca şi cum ar fi un fişier obişnuit în loc de a folosi API-uri speciale.
Fişierele disozitivelor sunt împărţite în două grupe, numite
dispozitive caracter şi dispozitive bloc. În a prima grupă
intră, de obicei, dispozitivele ale căror operaţii de citire/scriere nu
folosesc zone temporare de memorie (buffers). Ambele dispozitive pot fi citite
câte un caracter o dată, sau în blocuri. Aşadar, nomenclatura ar putea
suna confuz şi de fapt este greşită.
Dacă aruncaţi o privire asupra unui fişier dispozitiv, veţi putea observa
ceva similar cu:
Cod 1.1: Vizualizarea informaţiilor despre un fişier dispozitiv |
# ls -l /dev/hda
brw-rw---- 1 root disk 3, 0 Jul 5 2000 /dev/hda
|
În exemplul anterior am văzut ca /dev/hda este un dispozitiv
bloc. Oricum, mai important este faptul că are două numere speciale
ataşate: 3, 0. Această pereche este denumită pereche
major-minor. Este folosită de kernel pentru a creea o legătură
între fişierul dispozitiv şi dispozitivul real. Majorul corespunde unui
dispozitiv, minorul unui subdispozitiv. Pare confuz? Nu este.
Două exemple ar fi /dev/hda4 şi /dev/tty5. Primul
dispozitiv corespunde partiţiei a patra de pe primul dispozitiv IDE. Perechea
lui major-minor este 3, 4. Cu alte cuvinte, minorul corespunde
partiţei pe când majorul corespunde dispozitivului. Al doilea exemplu are
4, 5 ca pereche major-minor. În aces caz majorul corespunde
dispozitivului reprezentat de terminalul în timp ce minorul corespunde
numărului terminalului (în cazul nostru al cincilea terminal).
Problemele
Dacă faceţi o scurtă verificare în /dev, veţi observa că
nu doar toate dispozitivele dumneavoastră sunt prezente, ci toate
dispozitivele pe care vi le-aţi putea imagina. Cu alte cuvinte, aveţi
fişiere dispozitiv pentru dispozitive pe care nu le aveţi. Gestionarea unui
asemenea grup de dispozitive este cel puţin greoaie. Imaginaţi-vă că
trebuie să schimbaţi permisiunile tuturor fişierelor dispozitiv cărora
le corespune un dispozitiv din sitemul dumneavoastră, dar lasând celelalte
fişiere intacte.
Când adăugaţi o nouă componentă hardware sistemului dumneavoastră,
iar această componentă nu are creată anterior un fişier dispozitiv, va
trebui să creaţi un asemenea fişier. Utilizatori avansaţi ştiu că
acest lucru se poate face cu comanda ./MAKEDEV din directorul
/dev, dar dumneavoastră o să ştiţi ce fişier dispozitiv
trebuie creeat?
Când aveţi un program care interacţionează cu hardware-ul folosind
fişierele dispozitiv, nu puteţi avea partiţia de root mount-ată doar
pentru citire, în timp ce nu există nici o necesitate ca aceasta să fie
mount-ată pentru citire şi scriere. Şi nu puteţi avea /dev
pe o partiţie separată, deoarece mount are nevoie de
/dev pentru a putea mount-a partiţii.
Soluţiile
După cum vă puteţi imagina, programatorii kernel-ului au găsit o
sumedenie de soluţii pentru problemele menţionate anterior. Oricum, multe
dintre ele au alte scăpări după cum este descris în
http://www.atnf.csiro.au/people/rgooch/linux/docs/devfs.html#faq-why.
Nu o să vorbim despre aceste implementări, ci să ne concentrăm atenţia
asupra implemetării care a ajuns în sursele de kernel: devfs.
devfs ca un câştigător absolut
devfs abordează toate probleme menţionate. El oferă utilizatorului doar
dispozitivele existente, adaugă noile dispozitive când ele sunt găsite,
şi face posibilă mount-area sistemului de fişiere rădăcină doar
pentru citire. Abordează mult mai multe probleme, pe care nu le-am discutat
deoarece sunt mai puţin interesante pentru utilizatori...
De exemplu, cu devfs nu trebui să vă ingrijoraţi de perechea major/minor.
Ea este în continuare suportată (pentru compatibilitate anterioară), dar
nu mai este necesară. Aces lucru face posibil ca Linux să suportă chiar
mai multe dispozitive, din moment ce nu mai există limite (numerele
întotdeauna au limite :)
Totuşi, devfs are problemele sale; pentru utilizatorii de rând acestea nu
sunt chiar vizibile, dar pentru programatorii de kernel probleme sunt
îndeajuns de mari pentru a marca devfs ca învechit în favoarea lui
udev, pe care Gentoo îl suportă şi îl
foloseşte implicit pe majoritatea arhitecturilor începând cu versiunea
2005.0 în momentul utilizării unui kernel 2.6.
Pentru mai multe informaţii, cum ar fi motivul pentru care devfs a fost marcat
ca învechit, puteţi citi documentul despre Întrebări
Frecvente despre udev şi documentul
udev contra devfs.
2.
Navigarea prin directorul dispozitivelor
Directoarele
Unul dintre primele lucruri pe care probabil le-aţi observat este faptul că
devfs foloseşte directoare pentru a grupa dispozitivele. Aces lucru
uşurează utilizarea lor, deoarece acum toate dispozitivele similare se
află într-un director comun.
De exemplu, toate dispozitivele IDE se găsesc în directorul
/dev/ide/, iar cele SCSI se găsesc în /dev/scsi/.
Discurile SCSI şi IDE sunt considerate de acelaşi tip, acest lucru
însemnând că ambele au aceeaşi structură de subdirectoare.
Discurile IDE and SCSI sunt controlate de un adaptor (pe placa de baza sau pe o
placă separată), numită gazdă (host). Orice adaptor are un
număr de canale. Un canal este denumit magistrală (bus). Pe fiecare
canal, puteţi avea mai mulţi identificatori. Un asemenea identificator
corespunde unui disc. Acest identificator este denimit ţintă
(target). Unele dispozitive SCSI pot avea mai multe valori lun (Logical Unit
Numbers), de exemplu dispozitive care accesează mai multe medii simultan
(hi-end tapedrives). De cele mai multe ori o să aveţi o singură valoare
lun, lun0/.
Aşa că, dacă /dev/hda4 a fost folosit anterior, acum avem
/dev/ide/host0/bus0/target0/lun0/part4. Acesta este mult mai
uşor ... nu, nu vă certaţi cu mine ... este mai uşor... ah
oricum! :)
Notă:
Puteţi folosi de asemenea mai multe denumiri de fişiere dipozitiv în
tradiţia Unix, cum ar fi c0b0t0u0p2. Ele pot fi găsite în
/dev/ide/hd, /dev/scsi/hd etc.
|
Pentru a vă crea o idea asupra directorelor, aceasta este o listă a
directoarelor pe care le am pe sistemul meu laptop:
Cod 2.1: Directoarele din /dev |
cdroms/ cpu/ discs/ floppy/
ide/ input/ loop/ misc/
netlink/ printers/ pts/ pty/
scsi/ sg/ shm/ sound/
sr/ usb/ vc/ vcc/
|
Compatibilităţi anterioare folosind devfsd
Folosirea noii scheme pare uşoară, dar multe utilitare şi programe
folosesc vechea schemă. Pentru a vă asigura că nimic nu se va strica a
fost creat devfsd. Acest daemon crează legături simbolice cu numele
vechi către noile fişiere dispozitiv.
Cod 2.2: Legăturile simbolice create |
$ ls -l /dev/hda4
lr-xr-xr-x 1 root root 33 Aug 25 12:08 /dev/hda4 -> ide/host0/bus0/target0/lun0/part4
|
Cu devfsd, puteţi de asemenea să atribuiţi permisiuni, să creaţi
fişiere dispozit noi, să definiţi acţiuni etc. Toate aceste lucruri sunt
descrise în capitolul următor.
3.
Administrarea arborelui de dispozitive
Repornirea devfsd
Când modificaţi fişierul /etc/devfsd.conf, nu trebuie să
reporniţi sistemul. În funcţie de ce doriţi, puteţi folosi unul dintre
următoarele semnale:
SIGHUP va face ca devfsd să recitească fişierul de
configuraţie, reîncarce obiectele partajate şi să genereze evenitemul
REGISTER pentru fiecare nod terminal din arborele fişierelor dispozitiv.
SIGUSR1 va face acelaşi lucru, dar nu va genera evenimentele REGISTER.
Pentru a trimite un semnal, folosiţi kill sau killall:
Cod 3.1: Trimitrea unui semnal SIGHUP către devfsd |
# kill -s SIGHUP `pidof devfsd`
# killall -s SIGHUP devfsd
|
Înlăturarea legăturilor simbolice de compatibilitate
Atenţie:
Momentan, Gentoo nu poate funţiona fără legăturile simbolice de
compatibilitate.
|
Dacă doriţi ca legăturile simbolice de compatibilitate care vă încarcă
/dev să fie înlăturate din sistemul dumneavoastră Gentoo
(Gentoo le activează implicit), modificaţi /etc/devfsd.conf
şi înlăturaţi următoarele doua linii:
Cod 3.2: /etc/devfsd.conf pentru compatibilitate anterioară |
REGISTER .* MKOLDCOMPAT
UNREGISTER .* RMOLDCOMPAT
|
Trebui să reporniţi calulatorul pentru ca schimbarea să aibă efect.
Dezactivarea funcţiei de autoîncărcare
Când încărcaţi un modul, devfs va crea automat un fişier dispozitiv.
Dacă nu doriţi acest comportament, înlăturaţi următoarea linie din
/etc/devfsd.conf:
Cod 3.3: /etc/devfsd.conf, funcţia de autoîncărcare |
LOOKUP .* MODLOAD
|
4.
Aspecte legate de permisiuni
Definirea/schimbarea permisiunilor cu devfsd
Notă:
Aceste instrucţiuni sunt valide atâta timp cât pam_console este dezactivat
în /etc/pam.d/system-auth. Dacă aţi activat pam_console în
acest fişier, atunci PAM decide asupra permisiunilor.
|
Daca chiar doriţi să modificaţi permisiunile folosind
/etc/devfsd.conf, atunci folosiţi sintaxa din următorul
exemplu:
Cod 4.1: Permisiuni în /etc/devfsd.conf |
REGISTER ^cdroms/.* PERMISSIONS root.cdrom 0660
|
Al doilea câmp este grupul dispozitivului, începînd cu /dev.
Este o expresiu regulată, însemnînd că puteţi selecta mai multe
fişiere dispozitiv într-o singură definiţie.
Al patrulea câmp specifică proprietarul fişierului dispozitiv iar al
cincilea conţine permisiunile fişierului dispozitiv, respectiv.
Schimbarea permisiunilor manual şi folosirea devfs pentru a le salva
Acesta este comportamentul implicit pentru Gentoo: dacă utilizaţi
chown (CHange OWNer - schimbarea proprietarului) şi chmod
(CHange MODe - schimbarea modului) pentru unele fişiere dispozitiv,
devfsd va salva informaţiile atunci când opriţi sistemul. Aces lucru
de datorează faptului că fişierul /etc/devfsd.conf conţine
următoarele linii:
Cod 4.2: /etc/devfsd.conf pentru salvarea permisiunilor |
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
|
Cu alte cuvinte, fişierele dispozitiv modificate sunt copiate în
/lib/dev-state imediat cum se întâmplă modificarea şi sunt
copiate inapoi în /dev când porniţi sistemul.
O altă posibilitate ar fi să mount-aţi /lib/dev-state în
/dev în momentul pornirii sistemului. Pentru a efectua acest
lucru, trebui să vă asiguraţi că devfs nu este montat automat (acest
lucru poate însemna recompilarea kernelului) şi că
/dev/console există. Apoi, undeva pe la începutul scriptului de
iniţiere a sistemului adăugaţi:
Cod 4.3: Mount-area /lib/dev-state peste /dev |
mount --bind /dev /lib/dev-state
mount -t devfs none /dev
devfsd /dev
|
5.
Resurse
Pentru mai multe informaţii despre devfs, verificaţi următoarele resurse.
Pagina man a devfsd.conf explică sintaxa fişierului
/etc/devfsd.conf. Pentru a o putea vedea tastaţi man
devfsd.conf.
Documentul Întrebări
Frecvente despre devfs explică totul despre devfs. De asemenea conţine
informaţii despre structura interioară a devfs şi cum aplicaţiile driver
pot comunica cu devfs.
Pe LinuxJournal exista un articol
interesant despre devfs pentru Management
şi Administrare.
Daniel Robbins a scris câteva articole pentru IBM's DeveloperWorks despre
sisteme de fişiere avansate. Trei dintre ele sunt despre devfs:
Conţinutul acestui document este publicat sub licenţa Creative Commons -
Attribution / Share Alike.
|