Gentoo Logo

Ghid Device File System

Conţinut:

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`
sau
# 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ă

# Comentaţi următoarele două linii pentru a înlătura
legăturile simbolice
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:



Imprimare

Actualizat la 21 Iulie 2005

Versiunea originală a acestui document a fost actualizată ultima dată la 15 Noiembrie 2007

Sumar: În acest ghid veţi găsi informaţii despre ceea ce este devfs şi cum să lucraţi cu el.

Sven Vermeulen
Autor

Seemant Kulleen
Corector

Adi Roiban
Translator

Donate to support our development efforts.

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