Vous êtes sur la page 1sur 13

Detecoeativaodedispositivoseafunodoudevnesseprocesso

Introduo
Udev(Userspacedevfs)umsistemadearquivospresentedesdeokernel2.6esubstitui odevfscompletamente. responsvelporgerenciarosarquivosdedispositivosdodiretrio/dev,criandoeremovendoosmesmos dinamicamente.Oudevtambmtemfunodohotplug,trabalhandoemconjuntocomoHAL(Hardware AbstractionLayer),adicionandoosdispositivosconformesoinstaladosnamquina.Semele,seriaimpossvel acessarseupendrive,webcameimpressora,porexemplo,quandoconectados.

Funcionamento
EntendendocomoosdispositivossodetectadoseadicionadosnosistemaGNU/Linux. OsistemaGNU/Linuxfazusodokerneledeserviosparadetectareadicionardispositivosaosistema,para queosmesmosfiquemdisponveisparausodousurioedoprpriosistema. Abaixo,mostradaahierarquianoprocessodedetecoeadiodedispositivos:

Comovistonafiguraacima,existetodoumprocessoatosdispositivosestaremdisponveisparausodosistema e/ouusurios,quevaidesdeadetecododevicepelokernelatacriaodeumarquivodedispositivono diretrio/devpeloudev. Todoprocessocomeacomokerneldetectandoosdispositivoseexportandoinformaessobreosmesmos paraosistemadearquivosvirtualSysfs(queestmontadonodiretrio/sys)eaomesmotempo,enviandoum eventoparaodaemondoservioudev. Oeventoinformaaoudevumaaonodispositivo,estaaopodeserumadio,remoooualteraodeum dispositivoconectadomquina. Quandooudevinformadopelokernelsobreoevento,tratadeusarasinformaesdodiretrio/syspara identificarodeviceconectado,carregaromdulocorretoecriarumarquivoespecialnodiretrio/devcom exceodaplacaderedequetratadanokernel. Avocpergunta:EoHAL? Simples,oHALumservioqueinformaaosprogramasdosistemaseumdispositivoestdisponvel,foi alteradoouremovidoatodotempo.

Naverdade,oHALjnoessencialparaestetrabalho,poisalgumasdistribuiesatualmente,conseguem fazertodoestetrabalhosomentepeloudev,ouemconjuntocomoservioDBus.Noentanto,paraoutras distribuies,issotornaseessencial. importantedestacarquetodoesteprocessodedetectareativarosdevicesexplicadoanteriormente,nos aconteceemHotplug,ouseja,osdispositivossoinstaladoscomosistemaemuso,mastambmemColdplug, osdispositivossoconectados(instalados)comamquinadesligadaeosistema,quandoemuso,detectaos. Observequequemrealmentefazotrabalhodehotplug,oudev. Osarquivosdedispositivoscriadosnodiretrio/devnadamaissoquearquivosespeciais,obtidospela combinaodedoisendereosdokernel,umchamadodemajornumbereoutrodeminornumber. Sendoque: majornumberusadoparaidentificarumacategoriadedispositivos. minornumberIdentificaodispositivo. Vejanafiguraabaixo,umexemplodestesnmeros:

Hierarquiadosdispositivosechavesdoudev

Hierarquiadosdispositivos
Antesdecomearatrabalharcomregrasnoudev,necessriosabercomookernelrepresentaosdispositivos emsuaestrutura.OkerneldoLinuxorganizaerepresentaosdispositivosconectadosmquinaemuma

emsuaestrutura.OkerneldoLinuxorganizaerepresentaosdispositivosconectadosmquinaemuma estruturadervore,ouseja,existeumahierarquiaondecadadevice"filho"deumdevice"pai". Todaestaestruturaestexpostanodiretrio/syscontendoinformaesdecadadevice.Parapodertermais detalhessobreosdevices,useocomandoudevadmepodervertodasaschavesdosdispositivos. Vejaoexemplodoarquivodedispositivo/dev/usb/lp0daminhamquina,querepresentaaimpressora, rodandoocomandoabaixocomoroot: #udevadminfoap$(sudoudevadminfoqpathn/dev/usb/lp0)

Asadadocomandomostrabemaorganizaoehierarquiadodevice.Sendoque/dev/usb/lp0filhodo device"usb",enestedeviceokernelnomeiaode"lp0",justamenteonomedadopeloudev,queporsuavez filhododevicepai,tambmchamadode"usb"eokernelnomeiaode"22:1.1",carregandoodriver"usblp", queporsuavezfilhododevice"pci"eokernelnomeiaonestesubsistemade"0000:00:1d.0",carregandoo driver"uhci_hcd". Vejaoexemplodoarquivodedispositivo/dev/sdaquerepresentaoprimeirodiscorgidodaminhamquina: #udevadminfoap$(sudoudevadminfoqpathn/dev/sda)

Odevice/dev/sdanestahierarquia,filhododevice"block",ouseja,umdispositivodeblocoeokernel nomeiaode"sda",queporsuavez,filhododevicechamadode"scsi",eokernelnomeiaode"0:0:0:0", carregandoodriver"sd",queporsuavezfilhododevicechamadotambmde"scsi",eokernelnomeiaode "target0:0:0". Observeque,nahierarquiamostradanasadadocomandoudevadm,osdevicesdebaixosopaisdosdecima "filhos".

Aschavesdoudev
Chavesnoudevsoinformaesdedispositivosepodemserclassificadasemdoistipos,existindoaschavesde combinaoedeatributos.Ambasseroabordadasaseguir,eoseuusotornasenecessrioparaaplicaras regrasdoudev. Aschavesdecombinaomaisusadas,soaslistadasabaixo: KERNELEstachaveinformaonomeatribudopelokernelaodispositivoemquesto SUBSYSTEMChavequeinformaotipodedispositivo,sejaodispositivopaioufilho DRIVERChavequeinformaodriverparaodispositivo ATTREstachaveteminformaesadicionaissobreodispositivo OWNERUsurioqueseroproprietriododispositivocriadono/dev GROUPGrupododispositivocriadono/dev MODEAtribuiaumaskpadroparaodispositivocriadoem/dev. Almdaschavesdecombinaojvistas,possvelusaroutrasdescritasabaixo:

NAMEEstachavecontmonomequeserusadoparaodispositivo SYMLINKNestachave,configuraseumlinksimblico RUNAdicionaumprogramaqueserexecutado ACTIONAodoeventododispositivo,seodispositivoestsendoconectado,removidoou alterado. ChavesdecombinaoKERNELS,SUBSYSTEMSeDRIVERS,contminformaessimilaresschavesde combinaoapresentadasacima,noentanto,estaschavesdecombinaosousadasemdispositivospais (parentdevices). AschavesdeatributoATTR,contminformaoadicionalaumdispositivoeachavedeatributoATTRS similaraATTR,noentanto,usadaemdevicespais(parentdevices). Aobservaoqueemumaregra,nopodeseratribudomaisdeumachavedeatributoe/oudecombinao dedispositivos"pai"(deviceparent)juntochavedecombinao"filho"enemcombinarchavesdeatributosde diferentesdispositivospaisemumnicodispositivopai.Casoissoacontea,aregranoirfuncionar. Paraaregrafuncionar,podemoscolocarumaoumaischavesdecombinao"filho"seguidadeumachavede atributooudecombinao"pai"namesmaregrae/ou,casoqueiraatribuirmaisdeumachavedeatributo"pai", necessrioinformarodispositivoaqualelapertence,bastausarachavedecombinao"pai"SUBSYSTEMS. Seficouconfuso,naprximapginaireiexemplificarparaterummelhorentendimento. Paraaplicarasregras,almdaschavesjmencionadas,podemosfazerusodestringsenecessriousar operadores.Vejaabaixoasstringseoperadoresquepodemosusar. Stringsquepodemserusadasnasregras: *Correspondeatudonaquelaposio(similaraocoringaasterisco). ?Qualquercaracterenaquelaposio. []Correspondeaqualquercaractereespecificadodentrodoscolchetes. Porexemplo,asequnciadecaracteres'tty[SR]'iriacorrespondertanto'ttyS'quantoa'ttyR'.Vocpode tambmespecificarintervalosusandoafaixaatravsdocaractere''.Seoprimeirocaractereapso'[' um'!',humaexceo. Operadoresmaisusadosnasregras: ==Comparaseigual(atribuiumavalordeigualdade) !=Comparasediferente(atribuiumvalordediferena) =Atribuiumvalorchave(usadoquandosequermudaronomedodevice,porexemplo) +=AdicionaumvalorchaveepodemanterumalistadeentradasPode,porexemplo,usarna chaveRUNeespecificarvrioscomandos.

Depoisdetodaestaexplicao,vamoscomearaaplicarasregrasnaprximapgina.

Regrasdoudev Oudevmuitopoderosoquantoaplicaodasregras,poispermitedesdenomearumdispositivoatexecutar aplicaes,e/ouscriptsquandoconectamosoudesconectamos,ouquandoodispositivoalterado. Paraaplicartaisregras,necessrioterinformaesobtidasatravsdaschavesdecadadevice. Osarquivosquecontmasregrasdoudevestocontidosnodiretrio/etc/udev/rules.dedevemteraextenso ".rules",casoalgumarquivodentrododiretrionouseessaextenso,oseucontedonoserprocessado. Elessolidosemordemnumricoalfabtica,porexemplo:sedentrododiretrio/etc/udev/rules.d,temosos arquivos"025_usbregras.rules"e"035_usbregras.rules",oarquivo"025_usbregras.rules"serlidoantesque o"035_usbregras.rules". Agora,sintaxedasregraseexemplosderegrasquefuncionamenofuncionam. Cadaarquivocomextenso".rules"temregrasqueseguemaseguintesintaxe: <chavedecombinao>,<chavedecombinaoeouchavedeatributo>,<Ao>

Paraobterasinformaesdecadachavedosdevices,usamosocomandoudevadmparapegarumrelatrio. Novouentraremdetalhesdeusodocomando,masdeixoolinkparaomanual: http://linux.die.net/man/8/udevadm Serusado,paraextrairorelatrio,aopo"info"queutilizadaparaobterinformaese"p",queindicaa localizaododispositivo,e"a"irlistarinformaesdaspropriedadesdodispositivo. Voulistaraspropriedadesdoarquivodedispositivo/dev/sdc1quemeupendrivedaSanDisk,usandoo comandoudevadmcomoroot: #udevadminfoap$(udevadminfoqpathn/dev/sdc1)


loiga dvc 'dvcspi000/000:d7ub/-/okn t eie /eie/c00:000:01./s1181 810hs4tre4004000bokscsc' :./ot/agt::/:::/lc/d/d1: KRE="d1 ENL=sc" SBYTM=bok USSE="lc" DIE=" RVR=" AT{atto}=1 TRpriin="" AT{tr}=24" TRsat="08 AT{ie="823" TRsz}=7502 AT{o="" TRr}=0 AT{lgmn_fst="" TRainetofe}=0 AT{icr_lgmn}=0 TRdsadainet="" AT{tt=" TRsa}= 5 4 12 1 46 2 3 6 5 1 4 8 0 0 3 6 3" 6 AT{nlgt=" TRifih}= 0 0 "

loiga prn dvc 'dvcspi000/000:d7ub/okn t aet eie /eie/c00:000:01./s11 81810hs4tre4004000boksc: /-:./ot/agt::/:::/lc/d' KRES=sc ENL="d" SBYTM="lc" USSES=bok DIES=" RVR=" ATSrne="6 TR{ag}=1" ATSetrne="5" TR{x_ag}=26 ATSrmvbe="" TR{eoal}=1 ATSr}=0 TR{o="" ATSsz}=7517 TR{ie="862" ATSainetofe}=0 TR{lgmn_fst="" ATSdsadainet="" TR{icr_lgmn}=0 ATScpblt}=5" TR{aaiiy="1 ATSsa}= TR{tt=" 21 5 19 41 20 02 26 1 5 1 4 8 0 0 26 1 26 1" ATSifih}= TR{nlgt=" 0 0 " ATSeet}=mdacag" TR{vns="ei_hne ATSeet_sn}=" TR{vnsayc=" ATSeet_olmes="1 TR{vnspl_sc}=-"

loiga prn dvc 'dvcspi000/000:d7ub/okn t aet eie /eie/c00:000:01./s11 81810hs4tre4004000: /-:./ot/agt::/:::'

KRES=4000 ENL=":::" SBYTM="ci USSES=ss" DIES=s" RVR="d ATSdvc_lce}=0 TR{eiebokd="" ATStp}=0 TR{ye="" ATSss_ee}=0 TR{cilvl="" ATSvno}=Snik" TR{edr="aDs ATSmdl="rzrBae TR{oe}=Cue ld" ATSrv=".2 TR{e}=80" ATSsae="unn" TR{tt}=rnig ATStmot="0 TR{ieu}=3" ATSicutris="2 TR{oonebt}=3" ATSirqetct="x73 TR{oeus_n}=026" ATSidn_n}=026" TR{ooect="x73 ATSierct="x9 TR{or_n}=01" ATSmdla}=ss:-x0 TR{oais="cit00" ATSetmdacag}=0 TR{v_ei_hne="" ATSqeedph="" TR{uu_et}=1 ATSqeetp}=nn" TR{uu_ye="oe ATSmxscos="4" TR{a_etr}=20

loiga prn dvc 'dvcspi000/000:d7ub/okn t aet eie /eie/c00:000:01./s11 81810hs4tre400: /-:./ot/agt::' KRES=tre400 ENL="agt::" SBYTM="ci USSES=ss" DIES=" RVR="

loiga prn dvc 'dvcspi000/000:d7ub/okn t aet eie /eie/c00:000:01./s11 81810hs4: /-:./ot' KRES=hs4 ENL="ot" SBYTM="ci USSES=ss" DIES=" RVR="

loiga prn dvc 'dvcspi000/000:d7ub/okn t aet eie /eie/c00:000:01./s11 81810: /-:.' KRES=1810 ENL="-:." SBYTM="s" USSES=ub DIES=ubsoae RVR="s-trg" ATSbnefcNme}=0" TR{Itraeubr="0 ATSblentStig="0 TR{Atraeetn}= " ATSbuEdons="2 TR{Nmnpit}=0" ATSbnefcCas="8 TR{Itraels}=0" ATSbnefcSbls}=0" TR{ItraeuCas="6 ATSbnefcPooo}=5" TR{Itraertcl="0 ATSmdla}=ubv7156d20c0s0d0i0ic6p0 TR{oais="s:08p5700d0dc0p0c8s0i5" ATSspot_uoupn}=1 TR{uprsatssed=""

Vejaquenoposteitodaasadadocomandopoismuitolonga.Agora,abaixomostroduasregras: ACTION=="add",SUBSYSTEM=="block",KERNEL=="sd??",ATTRS{vendor}=="SanDisk", DRIVERS=="usbstorage",SYMLINK+="PENDRIVE" ACTION=="add",SUBSYSTEM=="block",KERNEL=="sd??",ATTRS{vendor}=="SanDisk", SYMLINK+="PENDRIVE"

Ambasasregrastmaaodecriarumlinkparaapartiodopendrive.Noentanto,somenteasegundaregra irfuncionar. Explicaodaprimeiraregra: 1conferidoseodispositivoqueestsendoconectado 2conferidoseodispositivoconectadodotipobloco(armazenamento),ouseja,sefilhodo dispositivodebloco 3conferidoseonomedodispositivoatribudopelokernelnachavedecombinaoKERNEL "filho"igualaoinformadonaregra 4Verificaemumdosatributos"pais"seexisteoatributocomvalorSanDisk,issogarantequearegra sserexecutadaseopendrivefordofabricanteSanDisk 5Verificaseodrivercarregadoemumdosdevicesparentsigualaoespecificado 6Casotudoestejacertonaregra,olinkchamadoPENDRIVEatribudopartiodopendrive. Mesmotodainformaoconferindonaprimeiraregra,nopodefuncionar,poisfoiatribudojuntochavede combinaododispositivofilho(comojfoiinformadonasegundapgina),umachavedeatributo(ATTRS)e outradecombinao(DRIVERS)dedispositivos"pais". Deixomaisumavezclaro,quearegranoirfuncionarcasosejaatribudomaisdeumachavedeatributooude combinaodeumparentdevicejuntoumachavedecombinaodeumdevicefilho. Asegundaregratemquasetodosaschavesdaprimeiraregra,comexceodachavedecombinao DRIVERSdeumdispositivopai.Eestaregrairfuncionarporqueapenasumachave,sejadeatributooude combinao(noexemplo,umafoideatributo)dedispositivopaiestatribudajuntoschavesdecombinao dodispositivofilhoquesoACTION,SUBSYSTEMeKERNEL. Agora,vejaumexemploderegrausadaparaexecutarumscript: ACTION=="add",SUBSYSTEM=="block",KERNEL=="sd??",SUBSYSTEMS=="usb", RUN+="/usr/local/bin/usbmount.sh"

Vejaqueestaregrasimilarsduasmostradasanteriormente.Noentanto,ovaloratribudochavede combinaoSUBSYSTEMdodispositivofilho,indicaquedeveseraplicadaaumdispositivodebloco,ouseja, dearmazenamento. Eachavedecombinao(dodeviceparent)SUBSYSTEMS,indicaquearegrasseraplicadaadispositivos paisdotipoUSBdessaforma,aregrasseraplicadaaumpendrive,HDexternoe/oucartodememria,e noadiscosrgidosinternos,porexemplo. Vejaabaixo,ocontedodoscript/usr/local/bin/usbmount.sh:

#/i/ah !bnbs u b " d v " ( s- / y / l c / $ l - / y / l c | r p s | a l s=/e/$l 1 ssbok"(s 1 ssbok ge d ti - ) | r ps | a l- ) " 1" ge d ti 1" t p = ( l i - l s " u b | w - " "' p i t $ } | a l- ) io$bkd o it $s" ak F {rn 2' ti 1 l b l $ b k d - l s " u b | w - " "' p i t $ } | a l- ) ae=(li o it $s" ak F {rn 3' ti 1 dr"mda"lbl" i=/ei/$ae" [ - " d r ] & s e p1 | m d r" d r d $i" & le | ki $i" i [ " t p "= " x 3 ] t e f $io et" ;hn m u t- " t p "- r l t m , o x c r , o e , s r " u b " d r on t $io o eaienee,wndvue $s" $i" e i [ " t p "= " x 4 ] t e lf $io et" ;hn m u t- " t p "- r l t m , o x c r , o e , s r " u b " d r on t $io o eaienee,wndvue $s" $i" e i [ " t p "= " f t ] t e lf $io va" ;hn m u t- " t p "on t $io o r l t m , o x c r , s r u a k 0 2 , i = 0 0 g d 1 0 " u b " d r eaienee,wue,ms=02ud10,i=00 $s" $i" e i [ " t p "= " t s ] t e lf $io nf" ;hn m u t- n f - g on t ts3 o r l t m , o x c r , s r u a k 0 2 , i = 0 0 g d 1 0 " u b " d r eaienee,wue,ms=02ud10,i=00 $s" $i" e i [ " t p "= " f "] t e lf $io xs ;hn m u t- " t p "- r l t m , o x c r , o e , s r " u b " d r on t $io o eaienee,wndvue $s" $i" e i [ " t p "= " f "] t e lf $io js ;hn m u t- " t p "- r l t m , o x c r , o e , s r " u b " d r on t $io o eaienee,wndvue $s" $i" e i [ " t p "= " t f "] t e lf $io brs ;hn m u t- " t p "- r l t m , o x c r , o e , s r " u b " d r on t $io o eaienee,wndvue $s" $i" f i

Afinalidadedoscriptmontaropendrive,HDexternooucartesdememriadesabilitandoaexecuode executveis,dandomaisseguranaquando"espetar"umdestesdispositivosnamquina(afinal,nuncasesabeo quepodeteremumHDexternooupendrivedealgum,noverdade?)evitandoaexecuodevruseoutras pragas. Podemostambmrenomeardispositivoscomoplacasderede.Paravercomofazerisso,vejaasadado comandoudevadmparaodispositivoWlan0eemseguida,ireimostrarumaregraparaisso: #udevadminfoap/sys/class/net/wlan0


loiga dvc 'dvcspi000/000:d7ub/-/okn t eie /eie/c00:000:01./s1181 810ntwa0: :./e/ln' KRE="ln" ENL=wa0 SBYTM=nt USSE="e" DIE=" RVR=" AT{drasg_ye="" TRad_sintp}=0 AT{drln="" TRad_e}=6 AT{e_d="x" TRdvi}=00 AT{fla}=" TRiais=" AT{fik="" TRiln}=5 AT{fne}=5 TRiidx="" AT{ye="" TRtp}=1

AT{ikmd}=1 TRln_oe="" AT{drs}=0:a3:c2:4 TRades="01:f7:ef" AT{racs}=f:ff:ff:f TRbodat="ff:ff:ff" AT{are}=0 TRcrir="" AT{omn}=0 TRdrat="" AT{prtt}=dw" TRoesae="on AT{t}=10" TRmu="50 AT{lg}=010" TRfas="x03 AT{xqeeln="00 TRt_uu_e}=10" AT{edvgop="" TRnte_ru}=0

loiga prn dvc 'dvcspi000/000:d7ub/okn t aet eie /eie/c00:000:01./s11 81810: /-:.' KRES=1810 ENL="-:." SBYTM="s" USSES=ub DIES=ahkhc RVR="t9_t" ATSbnefcNme}=0" TR{Itraeubr="0 ATSblentStig="0 TR{Atraeetn}= " ATSbuEdons="6 TR{Nmnpit}=0" ATSbnefcCas="f TR{Itraels}=f" ATSbnefcSbls}=0" TR{ItraeuCas="0 ATSbnefcPooo}=0" TR{Itraertcl="0 ATSmdla}=ubvC371d22cFsFdFiFic0p0 TR{oais="s:0Fp0500dFdcFpFcFs0i0" ATSspot_uoupn}=0 TR{uprsatssed=""

OadaptadorUSBestrecebendoestenomede"wlan0"porque,quandoosistemaodetectou,oudevatribuiua regraabaixo: SUBSYSTEM=="net",ACTION=="add",DRIVERS=="?*",ATTR{address}=="00:1a:3f:7c:2e:f4", ATTR{dev_id}=="0x0",ATTR{type}=="1",KERNEL=="wlan*",NAME="wlan0"

Mas,comestasinformaesdasadadocomandoudevadmpodemosmudaronomedodevicepara,por exemplo,Wireless0comomostraaregraabaixo: SUBSYSTEM=="net",ACTION=="add",DRIVERS=="?*",ATTR{address}=="00:1a:3f:7c:2e:f4", ATTR{dev_id}=="0x0",ATTR{type}=="1",KERNEL=="*",NAME="wireless0"

Explicandoaregra: 1verificadoseodispositivofilhoconectadodotiponet(rede) 2Verificaseodispositivoacaboudeseconectado 3NachavedecombinaoDRIVERSinformaquepodeserusadoqualquerdriverparaorespectivo deviceparent 4NachavedeatributoATTR{address}verificadooendereoMACaddressdodevice 5e6Soverificadosmaisduaschavesdeatributosdamesma(notequeambasforamatribudas juntoaodispositivofilho,porissoaregrafunciona) 7NachaveKERNELverificadoqualonomeatribudopelokernel,noexemploinformeiquepode

serqualquerum 8Naltimachavedecombinaoinformeionovonomedodispositivoquewireless0. Podemosfazermuitaspersonalizaes,almdasquaisjforammostradas,podemos,porexemplo,automatizar umprocessodebackuptodavezqueodispositivoforconectadomquinadeformasimilarregraacima,que executaumscript. Apsaplicarumaregraemumdosarquivoscomextenso".rules",tornasenecessrioreiniciaroserviodo udevparaasalteraesentrarememvigor(pelomenosnasdistribuiesDebianeCentOS,porexemplo).

Referncias
Builtinpersistentnamingschemeswww.reactivated.net udev(7)Linuxmanpagelinux.die.net Dispositivosesistemasdearquivoswww.linuxnewmedia.com.br

Vous aimerez peut-être aussi