Ghid Gentoo pentru udev
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 |
# 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.
Conţinutul acestui document este publicat sub licenţa Creative Commons -
Attribution / Share Alike.
|