Gentoo Logo

Ghid Gentoo pentru udev

Conţinut:

1.  Ce este udev?

Directorul /dev

Când utilizatorii Linux vorbesc despre structura sistemului lor în apropierea unor persoane care cred Linuxul a fi un virus sau o marcă de cafea, la folosirea termenilor "slash dev slash foo" precis vor avea o privire ciudată. Dar pentru utilizatorul norocos (această categorie vă include), folosirea /dev/hda1 este doar o cale mai rapidă pentru a explica faptul că vorbim despre discul primary master IDE, prima partiţie. Sau nu este aşa?

Ştim cu toţii ce este un fişier dispozitiv. Unii ştiu chiar de ce fişierele dispozitiv au numere speciale, în momentul în care ne uităm mai atent la ele lansăm ls -l în /dev. Dar, ce luăm de bun este faptul că atunci când vorbim despre discul primary master IDE ne referim la /dev/hda. Poate că dvs. nu consideraţi astfel, dar aceasta este o greşeală.

Gândiţi-vă la dispozitivele hotpluggable gen USB, IEEE1394, PCI hot-swappable, ... Care este primul dispozitiv? Şi pentru cât timp? Cum vor fi celelalte dispozitive denumite în momentul în care primul dispare? Cum va afecta aceasta transferurile ce urmează? Nu ar fi distractiv ca o sarcină de imprimare să fie transferată de la imprimanta dvs. cu laser super-nouă la matriciala aproape decedată, din cauză că mama dvs. s-a decis să scoată din priză imprimanta laser, care din întâmplare este prima imprimantă?

Introducere in udev. Scopurile proiectului udev sunt deopotrivă interesante şi folositoare:

  • Rulează în spaţiul rezervat utilizatorului
  • Crează/şterge dinamic fişiere ale dispozitivelor
  • Oferă denumiri consistente
  • Oferă o interfaţă a programării aplicaţiei în spaţiul rezervat utilizatorului

Pentru a oferi aceste funcţii, udev este dezvoltat în trei proiecte separate: namedev, libsysfs şi, bineînţeles, udev.

namedev

Namedev vă permite să definiţi numele dispozitivelor separat de programul udev. Aceasta permite politici de denumiri flexibile şi scheme de denumiri dezvoltate de entităţi separate. Acest subsistem de denumire oferă o interfaţă standard pe care udev o poate folosi.

Momentan o singura schemă de denumiri este oferită de namedev; cea oferită de LANANA, folosită de majoriatea sistemelor Linux şi din acest motiv foarte potrivită pentru majoritatea utilizatorilor Linux.

Namedev foloseşte o procedură în 5 paşi pentru a găsi numele unui anume dispozitiv. Dacă numele dispozitivului este găsit în unul din cei cinci paşi, acel nume este folosit. Paşii sunt:

  • eticheta sau numărul de serie
  • numărul magistralei dispozitivului
  • topologia magistralei
  • denumirea dată static
  • numele oferit de kernel

Pasul eticheta sau numărul de serie verifică dacă dispozitivul are un identificator unic. De exemplu dispozitivele USB are un număr de serie unic; dispozitivele SCSI au un UUID unic. Dacă namedev găseşte o potrivire între acest număr unic şi un fişier de configurare dat, este folosit numele oferit în fişierul de configurare.

Pasul numărul magistralei dispozitivului verifică numărul magistralei dispozitivului. Pentru mediile fără dispozitive ce pot fi schimbate în timpul rulării această procedură este suficientă pentru a identifica un dispozitiv hardware. De exemplu numerele magistralelor PCI se schimbă rar în durata de viaţă a unui sistem. Din nou, dacă namedev găseşte o potrivire între această poziţie şi un fişier de configurare, este folosit numele oferit în acel fişier de configurare.

În mod asemănător, topologia magistralei este o metodă mai statică de a defini numele dispozitivelor, atât timp cât utilizatorul nu schimbă dispozitivele. Atunci când poziţia dispozitivului se potriveşte unei setări oferite de utilizator, numele care îl însoţeşte este folosit.

Al patrulea pas, denumirea dată static, este o simplă schimbare a unui lanţ de caractere. Când denumirea oferită de kernel (denumirea implicită) se potriveşte unuei denumiri date pentru înlocuire, sustitutul va fi folosit.

În ultimul pas (numele oferit de kernel) acesta ia numele dat implicit de către kernel. În majoritatea cazurilor acesta este suficient, deoarece se potriveşte denumirilor dispozitivelor folosite în momentul de faţă de către sistemele Linux.

libsysfs

udev interacţionează cu kernel-ul prin pseudo-sistemul de fişiere sysfs. Proiectul libsysfs oferă o interfaţă comună a programării aplicaţiilor pentru a accesa informaţiile oferite de sistemul de fişiere sysfs, într-un mod generic. Aceasta permite interogarea echipamentului fără a fi nevoiţi să facem presupuneri asupra tipului acestuia.

udev

De fiecare dată când kernel-ul observă o actualizare în structura dispozitivelor lansează programul /sbin/hotplug. Hotplug rulează aplicaţiile care au o legătură în directorul /etc/hotplug.d/default, unde veţi găsi şi o legătură simbolică la aplicaţia udev. Hotplug direcţionează informaţia oferită de kernel către aplicaţia udev, care efectuează acţiunile necesare structurii /dev (crează sau şterge fişierele dispozitiv).

2.  Folosirea udev în Gentoo

Cerinţe

udev este menit să fie folosit în combinaţie cu un kernel 2.6 (cum ar fi vanilla-sources sau gentoo-sources). Dacă folosiţi un astfel de kernel atunci trebuie doar să vă asiguraţi că aveţi o versiune recentă a sys-apps/baselayout. Asta e tot ce vă trebuie.

Cod 2.1: Instalarea udev

# emerge udev

udev va instala hotplug-base ca una dintre dependenţele sale. Nu este nevoie să instalaţi hotplug decât dacă doriţi ca modulele dvs. să se încarce automat când introduceţi dispozitivele. hotplug de asemenea manipulează pornirea automată a dispozitivelor de reţea şi descărcarea aplicaţiilor firmware.

Cod 2.2: Instalarea de scripturi opţionale pentru hotplug

# emerge hotplug

Dacă doriţi încărcarea modulelor pentru dispozitive ce au fost conectate înainte de a porni sistemul, folosiţi pachetul coldplug:

Cod 2.3: Instalarea pachetului coldplug

# emerge coldplug

Nu uitaţi să adăugaţi coldplug în nivelul de execuţie boot:

Cod 2.4: Adăugarea coldplug nivelulului de execuţie boot

# rc-update add coldplug boot

Din punct de vedere al kernel-ului, asiguraţi-vă ca aţi activat următoarele opţiuni:

Cod 2.5: Opţiuni necesare în kernel

General setup --->
  [*] Support for hot-pluggable devices

File systems --->
  Pseudo filesystems --->
    [*] /proc file system support
    [*] Virtual memory file system support (former shm fs)

Puteţi lăsa /dev file system support (OBSOLETE) activat dacă doriţi dar trebuie să vă asiguraţi că opţiunea "Automatically mount at boot" este dezactivată:

Cod 2.6: Nu se mount-ează devfsd la iniţializarea sistemului

File systems --->
  Pseudo Filesystems --->
    [*] /dev file system support (OBSOLETE)
      [ ]   Automatically mount at boot

Dacă folosiţi genkernel, nu uitaţi să îl rulaţi cu opţiunea --udev pentru a activa toate directivele de configurare necesare kernelului. Configuraţia implicită oferită de această invocare a genkernel este suficientă.

Configurare

Dacă doriţi să folosiţi trucurile udev pe care Gentoo le-a adăugat pentru a vă face viaţa mai confortabilă, nu este nevoie să mai citiţi altceva. Gentoo va folosi udev dar va păstra un director /dev static pentru ca dvs. să nu vă lipsească niciodată noduri ale dispozitivelor. Scripturile Gentoo de iniţializare nu vor rula demonul devfs şi vor dezactiva devfs la iniţializarea sistemului.

Dar dacă sunteţi încăpăţânat şi doriţi să rulaţi un sistem bazat numai pe udev, fără trucuri aşa cum este intenţionat de către dezvoltatorii udev (incluzând dificultăţile lipsei nodurilor dispozitivelor pentru că udev nu le suportă încă), sunteţi invitat să citiţi în continuare :)

Vom dezactiva regulile care salvează fişierele cu nodurile dispozitivelor: editaţi variabila RC_DEVICE_TARBALL din /etc/conf.d/rc şi setaţi-o pe no:

Cod 2.7: /etc/conf.d/rc

RC_DEVICE_TARBALL="no"

Dacă aţi inclus suportul devfs în kernel, îl puteţi dezactiva din configurarea aplicaţiti bootloader: adăugaţi gentoo=nodevfs ca parametru al kernelului. Dacă doriţi să folosiţi devfs şi să dezactivaţi udev, adăugaţi gentoo=noudev ca parametru de kernel.

3.  Probleme cunoscute

Lipsa fişierelor cu noduri ale dispozitivelor la iniţializarea sistemului

Dacă nu puteţi iniţializa sistemul cu succes din cauza unei erori ce afirmă că /dev/null nu poate fi găsit, sau că lipseşte consola iniţială, problema constă în faptul că vă lipsesc nişte fişiere ale dispozitivelor care trebuie să fie disponibile înainte ca /dev să fie mount-at şi controlat de udev. Această problemă este comună sistemelor ce au Gentoo instalat de pe medii mai vechi.

Dacă rulaţi sys-apps/baselayou-1.8.12 sau o versiune mai nouă, această problemă este îmbunătăţită pentru că procesul de iniţializare al sistemului reuşeşte totuşi să se încheie. Totuşi, pentru a scăpa de aceste avertizmente iritante, ar trebui să creaţi fişierele dispozitiv aşa cum este descris mai jos.

Pentru a vedea care noduri ale dispozitivelor sunt prezente înainte ca sistemul de fişiere /dev să fie mount-at, rulaţi următoarele comenzi:

Cod 3.1: Afişarea nodurilor dispozitivelor disponibile la iniţializarea sistemului

# mkdir test
# mount --bind / test
# cd test/dev
# ls

Dispozitivele necesare pentru o iniţializare reuşită sunt /dev/null şi /dev/console. Dacă ele nu au apărut în testul anterior, va trebui să le creaţi manual. Lansaţi în execuţie următoarele comenzi în directorul test/dev/:

Cod 3.2: Crearea fişierelor nodurilor dispozitivelor necesare

# mknod -m 660 console c 5 1
# mknod -m 660 null c 1 3

Când aţi terminat nu uitaţi să demount-aţi directorul test/:

Cod 3.3: Demount-area directorului test/

# cd ../..
# umount test
# rmdir test

udev şi nvidia

Dacă folosiţi driver-ele proprietare oferite de nVidia şi serverul X eşuează la pornire pe un sistem doar cu udev, atunci asiguraţi-vă că aveţi:

  • modulul nvidia listat în /etc/modules.autoload.d/kernel-2.6
  • o versiune a pachetului nvidia-kernel egală sau mai mare decât media-video/nvidia-kernel-1.0.5336-r2
  • o versiune a pachetului baselayout egală sau mai mare decât sys-apps/baselayout-1.8.12

Dacă xorg-x11 refuză să pornească, ar putea fi din cauza faptului că fişierul dispozitiv /dev/nvidia lipseşte. Dacă aceasta este problema, atunci rulaţi /sbin/NVmakedevices.sh pentru a-l (re)crea.

Dispariţia Denumirilor LVM2

Atunci când folosiţi udev împreună cu LVM2, puteţi observa că grupurile volumelor şi volumele logice create de dvs. au dispărut. În realitate, însă, nu este aşa, dar au fost, din păcate, denumite /dev/dm-#, # reprezentând 0,1, ...

Pentru a rezolva aceasta, editaţi /etc/udev/rules.d/50-udev.rules şi îndepărtaţi comentariul de pe următoarea linie:

Cod 3.4: Decomentaţi această linie din /etc/udev/rules.d/50-udev.rules

KERNEL="dm-[0-9]*",     PROGRAM="/sbin/devmap_name %M %m", NAME="%k", SYMLINK="%c"

Apoi, instalaţi pachetul sys-fs/multipath-tools ce conţine aplicaţia devmap_name.

Cod 3.5: Instalarea multipath-tools

(La momentul redactării, multipath-tools este disponibil doar în ramura de testare:)
# echo "=sys-fs/multipath-tools-0.4.2 ~x86" >> /etc/portage/package.keywords
# emerge multipath-tools

Lipsa unei Denumiri Consistente între DevFS şi udev

Deşi intenţia noastră este de a avea o schemă de denumiri consistentă între ambele soluţii de administrare dinamică a dispozitivelor, uneori denumiri diferite apar.

Una dintre aceste discrepanţe este în cazul controllerului RAID HP Smart Array 5i (mai precis modulul de kernel cciss). Cu udev, dispozitivele sunt denumite /dev/cciss/cXdYpZ cu X, Y şi Z numere obişnuite. În cazul devfs, dispozitivele sunt /dev/hostX/targetY/partZ sau legături simbolice ale /dev/cciss/cXdY

În acest caz, nu uitaţi să actualizaţi fişierele /etc/fstab şi cel de configurare al aplicaţiei bootloader, corespunzător.

Acelaşi lucru se petrece în cazul multor altor legături simbolice care se aflau în /dev, de exemplu /dev/mouse, pe care udev nu îl mai crează. Asiguraţi-vă că aţi verificat configuraţia serverului X şi că regula Device pentru mouse-ul dvs. indică spre un fişier al unui dispozitiv ce există.

Altă problemă o reprezintă diferenţa în denumirea terminalelor între devfs şi udev. În timp ce devfs îşi denumeşte terminalele tty, udev le denumeşte vc. Aceasta ar putea să conducă la probleme în cazul în care restricţionaţi autentificările root de pe console, utilizând /etc/securetty. Va trebui să vă asiguraţi că tty1 este schimbat în vc/1 în fişierul /etc/securetty pentru a vă asigura că utilizatorul root se poate autentifica utilizând consola.

Alte probleme

Dacă nodurile dispozitivului nu sunt create când un modul este încărcat din /etc/modules.autoload.d/kernel-2.6 dar acestea apar atunci când încărcaţi modulul manual cu modprobe atunci ar trebui să încercaţi să actualizaţi sys-apps/baselayout-1.8.12 sau o versiune mai nouă.

Suportul pentru dispozitivele framebuffer (/dev/fb/*) este integrat în kernel începând cu versiunea 2.6.6-rc2.

Pentru versiuni ale kernelului mai vechi de 2.6.4 trebuie să includeţi explicit suportul pentru sistemul de fişiere /dev/pts.

Cod 3.6: Activarea sistemului de fişiere /dev/pts

File systems --->
  Pseudo filesystems --->
    [*] /dev/pts file system for Unix98 PTYs

4.  Resurse şi Recunoaşteri

Discursul depre udev de la Simpoziomul Linux (Ottawa, Ontario Canada - 2003) ţinut de către Greg Kroah-Hartman (Corporaţia IBM) a asigurat o întelegere solidă a aplicaţiei udev.

Decibel's UDEV Primer este un document foarte amănunţit despre udev şi Gentoo.

Documentul despre Scrierea regulilor udev al dezvoltatorului Gentoo Daniel Drake este unul excelent pentru a învăţa cum să vă modelaţi instalarea udev.



Imprimare

Actualizat la 25 Martie 2006

Versiunea originală a acestui document a fost actualizată ultima dată la 26 Decembrie 2011

Sumar: Acest document explică ce reprezintă udev şi cum îl puteţi folosi conform nevoilor dvs.

Sven Vermeulen
Autor

Gregorio Guidi
Contribuitor

Vlad Mocanu
Translator

Donate to support our development efforts.

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