{"id":453,"date":"2013-05-30T05:07:49","date_gmt":"2013-05-30T08:07:49","guid":{"rendered":"http:\/\/www.viazap.com.br\/?p=453"},"modified":"2013-05-30T05:07:50","modified_gmt":"2013-05-30T08:07:50","slug":"udev-funcionamento-e-regras","status":"publish","type":"post","link":"https:\/\/blog.clusterweb.com.br\/?p=453","title":{"rendered":"Udev &#8211; Funcionamento e Regras"},"content":{"rendered":"<table width=\"100%\" border=\"0\" cellspacing=\"3\" cellpadding=\"3\">\n<tbody>\n<tr>\n<td colspan=\"2\"><b>Detec\u00e7\u00e3o e ativa\u00e7\u00e3o de dispositivos e a fun\u00e7\u00e3o do udev nesse processo<\/b><\/p>\n<div>\n<h1>Introdu\u00e7\u00e3o<\/h1>\n<p><em>Udev<\/em> (Userspace devfs) \u00e9 um sistema de arquivos presente desde o kernel 2.6 e substitui o <em>devfs<\/em> completamente.<\/p>\n<p>\u00c9 respons\u00e1vel por gerenciar os arquivos de dispositivos do diret\u00f3rio <em>\/dev<\/em>, criando e removendo os mesmos dinamicamente. O udev tamb\u00e9m tem fun\u00e7\u00e3o do <em>hotplug<\/em>, trabalhando em conjunto com o HAL (Hardware Abstraction Layer), adicionando os dispositivos conforme s\u00e3o instalados na m\u00e1quina. Sem ele, seria imposs\u00edvel acessar seu pendrive, webcam e impressora, por exemplo, quando conectados.<\/p>\n<h1>Funcionamento<\/h1>\n<p>Entendendo como os dispositivos s\u00e3o detectados e adicionados no sistema <a href=\"http:\/\/www.vivaolinux.com.br\/linux\/\">GNU\/Linux<\/a>.<\/p>\n<p>O sistema GNU\/Linux faz uso do kernel e de servi\u00e7os para detectar e adicionar dispositivos ao sistema, para que os mesmos fiquem dispon\u00edveis para uso do usu\u00e1rio e do pr\u00f3prio sistema.<\/p>\n<p>Abaixo, \u00e9 mostrada a hierarquia no processo de detec\u00e7\u00e3o e adi\u00e7\u00e3o de dispositivos:<\/p>\n<div><img loading=\"lazy\" decoding=\"async\" alt=\"Linux: Udev - Funcionamento e Regras\" src=\"http:\/\/img.vivaolinux.com.br\/imagens\/artigos\/comunidade\/udev_image_1.png\" width=\"374\" height=\"504\" \/><\/div>\n<p>Como visto na figura acima, existe todo um processo at\u00e9 os dispositivos estarem dispon\u00edveis para uso do sistema e\/ou usu\u00e1rios, que vai desde a detec\u00e7\u00e3o do device pelo kernel at\u00e9 a cria\u00e7\u00e3o de um arquivo de dispositivo no diret\u00f3rio <em>\/dev<\/em> pelo udev.<\/p>\n<p>Todo processo come\u00e7a com o kernel detectando os dispositivos e exportando informa\u00e7\u00f5es sobre os mesmos para o sistema de arquivos <em>virtual Sysfs<\/em> (que est\u00e1 montado no diret\u00f3rio <em>\/sys<\/em>) e ao mesmo tempo, enviando um evento para o daemon do servi\u00e7o udev.<\/p>\n<p>O evento informa ao udev uma a\u00e7\u00e3o no dispositivo, esta a\u00e7\u00e3o pode ser um adi\u00e7\u00e3o, remo\u00e7\u00e3o ou altera\u00e7\u00e3o de um dispositivo conectado \u00e0 m\u00e1quina.<\/p>\n<p>Quando o udev \u00e9 informado pelo kernel sobre o evento, trata de usar as informa\u00e7\u00f5es do diret\u00f3rio <em>\/sys<\/em> para identificar o device conectado, carregar o m\u00f3dulo correto e criar um arquivo especial no diret\u00f3rio <em>\/dev<\/em> com exce\u00e7\u00e3o da placa de rede que \u00e9 tratada no kernel.<\/p>\n<p>A\u00ed voc\u00ea pergunta: E o HAL?<\/p>\n<p>Simples, o HAL \u00e9 um servi\u00e7o que informa aos programas do sistema se um dispositivo est\u00e1 dispon\u00edvel, foi alterado ou removido a todo tempo.<\/p>\n<p>Na verdade, o HAL j\u00e1 n\u00e3o \u00e9 essencial para este trabalho, pois algumas distribui\u00e7\u00f5es atualmente, conseguem fazer todo este trabalho somente pelo udev, ou em conjunto com o servi\u00e7o D-Bus. No entanto, para outras distribui\u00e7\u00f5es, isso torna-se essencial.<\/p>\n<p>\u00c9 importante destacar que todo este processo de detectar e ativar os devices explicado anteriormente, n\u00e3o s\u00f3 acontece em Hotplug, ou seja, os dispositivos s\u00e3o instalados com o sistema em uso, mas tamb\u00e9m em Coldplug, os dispositivos s\u00e3o conectados (instalados) com a m\u00e1quina desligada e o sistema, quando em uso, detecta-os.<\/p>\n<p>Observe que quem realmente faz o trabalho de hotplug, \u00e9 o udev.<\/p>\n<p>Os arquivos de dispositivos criados no diret\u00f3rio <em>\/dev<\/em> nada mais s\u00e3o que arquivos especiais, obtidos pela combina\u00e7\u00e3o de dois endere\u00e7os do kernel, um chamado de <em>major number<\/em> e outro de <em>minor number<\/em>.<\/p>\n<p>Sendo que:<\/p>\n<ul>\n<li><em>major number<\/em> \u2192 \u00c9 usado para identificar uma categoria de dispositivos.<\/li>\n<li><em>minor number<\/em> \u2192 Identifica o dispositivo.<\/li>\n<\/ul>\n<p>Veja na figura abaixo, um exemplo destes n\u00fameros:<\/p>\n<div><a href=\"http:\/\/img.vivaolinux.com.br\/imagens\/artigos\/comunidade\/1350272295.image2.png\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" alt=\"\" src=\"http:\/\/img.vivaolinux.com.br\/imagens\/artigos\/comunidade\/thumb_1350272295.image2.png\" width=\"500\" height=\"320\" border=\"0\" \/><\/a><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<tr>\n<td colspan=\"2\"><b>Hierarquia dos dispositivos e chaves do udev<\/b><\/p>\n<div>\n<h1>Hierarquia dos dispositivos<\/h1>\n<p>Antes de come\u00e7ar a trabalhar com regras no udev, \u00e9 necess\u00e1rio saber como o kernel representa os dispositivos em sua estrutura. O kernel do <a href=\"http:\/\/www.vivaolinux.com.br\/linux\/\">Linux<\/a> organiza e representa os dispositivos conectados \u00e0 m\u00e1quina em uma estrutura de \u00e1rvore, ou seja, existe uma hierarquia onde cada device \u00e9 &#8220;filho&#8221; de um device &#8220;pai&#8221;.<\/p>\n<p>Toda esta estrutura est\u00e1 exposta no diret\u00f3rio <em>\/sys<\/em> contendo informa\u00e7\u00f5es de cada device. Para poder ter mais detalhes sobre os devices, use o comando <strong>udevadm<\/strong> e poder\u00e1 ver todas as chaves dos dispositivos.<\/p>\n<p>Veja o exemplo do arquivo de dispositivo <em>\/dev\/usb\/lp0<\/em> da minha m\u00e1quina, que representa a impressora, rodando o comando abaixo como root:<\/p>\n<p><strong># udevadm info -a -p $(sudo udevadm info -q path -n \/dev\/usb\/lp0)<\/strong><\/p>\n<div><a href=\"http:\/\/img.vivaolinux.com.br\/imagens\/artigos\/comunidade\/1350329721.image3.png\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" alt=\"\" src=\"http:\/\/img.vivaolinux.com.br\/imagens\/artigos\/comunidade\/thumb_1350329721.image3.png\" width=\"500\" height=\"376\" border=\"0\" \/><\/a><\/div>\n<p>A sa\u00edda do comando mostra bem a organiza\u00e7\u00e3o e hierarquia do device. Sendo que <em>\/dev\/usb\/lp0<\/em> \u00e9 filho do device &#8220;usb&#8221;, e neste device o kernel nomeia-o de &#8220;lp0&#8221;, justamente o nome dado pelo udev, que por sua vez \u00e9 filho do device pai, tamb\u00e9m chamado de &#8220;usb&#8221; e o kernel nomeia-o de &#8220;2-2:1.1&#8221;, carregando o driver &#8220;usblp&#8221;, que por sua vez \u00e9 filho do device &#8220;pci&#8221; e o kernel nomeia-o neste subsistema de &#8220;0000:00:1d.0&#8221;, carregando o driver &#8220;uhci_hcd&#8221;.<\/p>\n<p>Veja o exemplo do arquivo de dispositivo <em>\/dev\/sda<\/em> que representa o primeiro disco r\u00edgido da minha m\u00e1quina:<\/p>\n<p><strong># udevadm info -a -p $(sudo udevadm info -q path -n \/dev\/sda)<\/strong><\/p>\n<div><a href=\"http:\/\/img.vivaolinux.com.br\/imagens\/artigos\/comunidade\/1350331176.image4.png\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" alt=\"\" src=\"http:\/\/img.vivaolinux.com.br\/imagens\/artigos\/comunidade\/thumb_1350331176.image4.png\" width=\"500\" height=\"371\" border=\"0\" \/><\/a><\/div>\n<p>O device <em>\/dev\/sda<\/em> nesta hierarquia, \u00e9 filho do device &#8220;block&#8221;, ou seja, \u00e9 um dispositivo de bloco e o kernel nomeia-o de &#8220;sda&#8221;, que por sua vez, \u00e9 filho do device chamado de &#8220;scsi&#8221;, e o kernel nomeia-o de &#8220;0:0:0:0&#8221;, carregando o driver &#8220;sd&#8221;, que por sua vez \u00e9 filho do device chamado tamb\u00e9m de &#8220;scsi&#8221;, e o kernel nomeia-o de &#8220;target0:0:0&#8221;.<\/p>\n<p>Observe que, na hierarquia mostrada na sa\u00edda do comando <em>udevadm<\/em>, os devices de baixo s\u00e3o pais dos de cima &#8220;filhos&#8221;.<\/p>\n<h1>As chaves do udev<\/h1>\n<p>Chaves no udev s\u00e3o informa\u00e7\u00f5es de dispositivos e podem ser classificadas em dois tipos, existindo as chaves de combina\u00e7\u00e3o e de atributos. Ambas ser\u00e3o abordadas a seguir, e o seu uso torna-se necess\u00e1rio para aplicar as regras do udev.<\/p>\n<p>As chaves de combina\u00e7\u00e3o mais usadas, s\u00e3o as listadas abaixo:<\/p>\n<ul>\n<li>KERNEL \u2192 Esta chave informa o nome atribu\u00eddo pelo kernel ao dispositivo em quest\u00e3o;<\/li>\n<li>SUBSYSTEM \u2192 Chave que informa o tipo de dispositivo, seja o dispositivo pai ou filho;<\/li>\n<li>DRIVER \u2192 Chave que informa o driver para o dispositivo;<\/li>\n<li>ATTR \u2192 Esta chave tem informa\u00e7\u00f5es adicionais sobre o dispositivo;<\/li>\n<li>OWNER \u2192 Usu\u00e1rio que ser\u00e1 o propriet\u00e1rio do dispositivo criado no \/dev;<\/li>\n<li>GROUP \u2192 Grupo do dispositivo criado no \/dev;<\/li>\n<li>MODE \u2192 Atribui a umask padr\u00e3o para o dispositivo criado em \/dev.<\/li>\n<\/ul>\n<p>Al\u00e9m das chaves de combina\u00e7\u00e3o j\u00e1 vistas, \u00e9 poss\u00edvel usar outras descritas abaixo:<\/p>\n<ul>\n<li>NAME \u2192 Esta chave cont\u00e9m o nome que ser\u00e1 usado para o dispositivo;<\/li>\n<li>SYMLINK \u2192 Nesta chave, configura-se um link simb\u00f3lico;<\/li>\n<li>RUN \u2192 Adiciona um programa que ser\u00e1 executado;<\/li>\n<li>ACTION \u2192 A\u00e7\u00e3o do evento do dispositivo, se o dispositivo est\u00e1 sendo conectado, removido ou alterado.<\/li>\n<\/ul>\n<p>Chaves de combina\u00e7\u00e3o KERNELS, SUBSYSTEMS e DRIVERS, cont\u00eam informa\u00e7\u00f5es similares \u00e0s chaves de combina\u00e7\u00e3o apresentadas acima, no entanto, estas chaves de combina\u00e7\u00e3o s\u00e3o usadas em dispositivos pais (parent devices).<\/p>\n<p>As chaves de atributo ATTR, cont\u00eam informa\u00e7\u00e3o adicional a um dispositivo e a chave de atributo ATTRS \u00e9 similar a ATTR, no entanto, \u00e9 usada em devices pais (parent devices).<\/p>\n<p>A observa\u00e7\u00e3o \u00e9 que em uma regra, n\u00e3o pode ser atribu\u00eddo mais de uma chave de atributo e\/ou de combina\u00e7\u00e3o de dispositivos &#8220;pai&#8221; (device parent) junto \u00e0 chave de combina\u00e7\u00e3o &#8220;filho&#8221; e nem combinar chaves de atributos de diferentes dispositivos pais em um \u00fanico dispositivo pai. Caso isso aconte\u00e7a, a regra n\u00e3o ir\u00e1 funcionar.<\/p>\n<p>Para a regra funcionar, podemos colocar uma ou mais chaves de combina\u00e7\u00e3o &#8220;filho&#8221; seguida de uma chave de atributo ou de combina\u00e7\u00e3o &#8220;pai&#8221; na mesma regra e\/ou, caso queira atribuir mais de uma chave de atributo &#8220;pai&#8221;, \u00e9 necess\u00e1rio informar o dispositivo a qual ela pertence, basta usar a chave de combina\u00e7\u00e3o &#8220;pai&#8221; SUBSYSTEMS.<\/p>\n<p>Se ficou confuso, na pr\u00f3xima p\u00e1gina irei exemplificar para ter um melhor entendimento.<\/p>\n<p>Para aplicar as regras, al\u00e9m das chaves j\u00e1 mencionadas, podemos fazer uso de strings e \u00e9 necess\u00e1rio usar operadores. Veja abaixo as strings e operadores que podemos usar.<\/p>\n<p>Strings que podem ser usadas nas regras:<\/p>\n<ul>\n<li>* \u2192 Corresponde a tudo naquela posi\u00e7\u00e3o (\u00e9 similar ao coringa asterisco).<\/li>\n<li>? \u2192 Qualquer caractere naquela posi\u00e7\u00e3o.<\/li>\n<li>[] \u2192 Corresponde a qualquer caractere especificado dentro dos colchetes.\n<p>Por exemplo, a sequ\u00eancia de caracteres &#8216;tty[SR]&#8217; iria corresponder tanto &#8216;ttyS&#8217; quanto a &#8216;ttyR&#8217;. Voc\u00ea pode tamb\u00e9m especificar intervalos usando a faixa atrav\u00e9s do caractere &#8216;-&#8216;. Se o primeiro caractere ap\u00f3s o &#8216;[&#8216; \u00e9 um &#8216;!&#8217;, h\u00e1 uma exce\u00e7\u00e3o.<\/li>\n<\/ul>\n<p>Operadores mais usados nas regras:<\/p>\n<ul>\n<li>== \u2192 Compara se \u00e9 igual (atribui uma valor de igualdade);<\/li>\n<li>!= \u2192 Compara se \u00e9 diferente (atribui um valor de diferen\u00e7a);<\/li>\n<li>= \u2192 Atribui um valor \u00e0 chave (\u00e9 usado quando se quer mudar o nome do device, por exemplo);<\/li>\n<li>+= \u2192 Adiciona um valor \u00e0 chave e pode manter uma lista de entradas &#8211; Pode, por exemplo, usar na chave RUN e especificar v\u00e1rios comandos.<\/li>\n<\/ul>\n<p>Depois de toda esta explica\u00e7\u00e3o, vamos come\u00e7ar a aplicar as regras na pr\u00f3xima p\u00e1gina.<\/p>\n<\/div>\n<\/td>\n<\/tr>\n<tr>\n<td colspan=\"2\"><b>Regras do udev<\/b><\/p>\n<div>O udev \u00e9 muito poderoso quanto \u00e0 aplica\u00e7\u00e3o das regras, pois permite desde nomear um dispositivo at\u00e9 executar aplica\u00e7\u00f5es, e\/ou scripts quando conectamos ou desconectamos, ou quando o dispositivo \u00e9 alterado.<\/p>\n<p>Para aplicar tais regras, \u00e9 necess\u00e1rio ter informa\u00e7\u00f5es obtidas atrav\u00e9s das chaves de cada device.<\/p>\n<p>Os arquivos que cont\u00e9m as regras do udev est\u00e3o contidos no diret\u00f3rio <em>\/etc\/udev\/rules.d<\/em> e devem ter a extens\u00e3o &#8220;.rules&#8221;, caso algum arquivo dentro do diret\u00f3rio n\u00e3o use essa extens\u00e3o, o seu conte\u00fado n\u00e3o ser\u00e1 processado.<\/p>\n<p>Eles s\u00e3o lidos em ordem num\u00e9rico alfab\u00e9tica, por exemplo: se dentro do diret\u00f3rio <em>\/etc\/udev\/rules.d<\/em>, temos os arquivos &#8220;025_usb- regras.rules&#8221; e &#8220;035_usb-regras.rules&#8221;, o arquivo &#8220;025_usb-regras.rules&#8221; ser\u00e1 lido antes que o &#8220;035_usb-regras.rules&#8221;.<\/p>\n<p>Agora, sintaxe das regras e exemplos de regras que funcionam e n\u00e3o funcionam.<\/p>\n<p>Cada arquivo com extens\u00e3o &#8220;.rules&#8221; tem regras que seguem a seguinte sintaxe:<\/p>\n<div>&lt;chave de combina\u00e7\u00e3o&gt;, &lt;chave de combina\u00e7\u00e3o e ou chave de atributo&gt;, &lt;A\u00e7\u00e3o&gt;<\/div>\n<p>Para obter as informa\u00e7\u00f5es de cada chave dos devices, usamos o comando <em>udevadm<\/em> para pegar um relat\u00f3rio.<\/p>\n<p>N\u00e3o vou entrar em detalhes de uso do comando, mas deixo o link para o manual:<\/p>\n<ul>\n<li><a href=\"http:\/\/linux.die.net\/man\/8\/udevadm\">http:\/\/linux.die.net\/man\/8\/udevadm<\/a><\/li>\n<\/ul>\n<p>Ser\u00e1 usado, para extrair o relat\u00f3rio, a op\u00e7\u00e3o &#8220;info&#8221; que \u00e9 utilizada para obter informa\u00e7\u00f5es e &#8220;-p&#8221;, que indica a localiza\u00e7\u00e3o do dispositivo, e &#8220;-a&#8221; ir\u00e1 listar informa\u00e7\u00f5es das propriedades do dispositivo.<\/p>\n<p>Vou listar as propriedades do arquivo de dispositivo <em>\/dev\/sdc1<\/em> que \u00e9 meu pendrive da SanDisk, usando o comando <em>udevadm<\/em> como root:<\/p>\n<p><strong># udevadm info -a -p $(udevadm info -q path -n \/dev\/sdc1)<\/strong><\/p>\n<div id=\"forumCodeDiv\">\n<div id=\"highlighter_927461\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td>\n<div>\n<div><code>looking at device <\/code><code>'\/devices\/pci0000:00\/0000:00:1d.7\/usb1\/1-8\/1-8:1.0\/host4\/target4:0:0\/4:0:0:0\/block\/sdc\/sdc1'<\/code><code>:<\/code><\/div>\n<div><code>\u00a0\u00a0<\/code><code>KERNEL==<\/code><code>\"sdc1\"<\/code><\/div>\n<div><code>\u00a0\u00a0<\/code><code>SUBSYSTEM==<\/code><code>\"block\"<\/code><\/div>\n<div><code>\u00a0\u00a0<\/code><code>DRIVER==<\/code><code>\"\"<\/code><\/div>\n<div><code>\u00a0\u00a0<\/code><code>ATTR{partition}==<\/code><code>\"1\"<\/code><\/div>\n<div><code>\u00a0\u00a0<\/code><code>ATTR{start}==<\/code><code>\"2048\"<\/code><\/div>\n<div><code>\u00a0\u00a0<\/code><code>ATTR{size}==<\/code><code>\"7852032\"<\/code><\/div>\n<div><code>\u00a0\u00a0<\/code><code>ATTR{ro}==<\/code><code>\"0\"<\/code><\/div>\n<div><code>\u00a0\u00a0<\/code><code>ATTR{alignment_offset}==<\/code><code>\"0\"<\/code><\/div>\n<div><code>\u00a0\u00a0<\/code><code>ATTR{discard_alignment}==<\/code><code>\"0\"<\/code><\/div>\n<div><code>\u00a0\u00a0<\/code><code>ATTR{stat}==<\/code><code>\"\u00a0\u00a0\u00a0\u00a0\u00a0 54\u00a0\u00a0\u00a0\u00a0\u00a0 112\u00a0\u00a0\u00a0\u00a0\u00a0 426\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 36\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 5\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 1\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 48\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 36\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 36\"<\/code><\/div>\n<div><code>\u00a0\u00a0<\/code><code>ATTR{inflight}==<\/code><code>\"\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0\"<\/code><\/div>\n<div><\/div>\n<div><code>looking at parent device <\/code><code>'\/devices\/pci0000:00\/0000:00:1d.7\/usb1\/1-8\/1-8:1.0\/host4\/target4:0:0\/4:0:0:0\/block\/sdc'<\/code><code>:<\/code><\/div>\n<div><code>\u00a0\u00a0<\/code><code>KERNELS==<\/code><code>\"sdc\"<\/code><\/div>\n<div><code>\u00a0\u00a0<\/code><code>SUBSYSTEMS==<\/code><code>\"block\"<\/code><\/div>\n<div><code>\u00a0\u00a0<\/code><code>DRIVERS==<\/code><code>\"\"<\/code><\/div>\n<div><code>\u00a0\u00a0<\/code><code>ATTRS{range}==<\/code><code>\"16\"<\/code><\/div>\n<div><code>\u00a0\u00a0<\/code><code>ATTRS{ext_range}==<\/code><code>\"256\"<\/code><\/div>\n<div><code>\u00a0\u00a0<\/code><code>ATTRS{removable}==<\/code><code>\"1\"<\/code><\/div>\n<div><code>\u00a0\u00a0<\/code><code>ATTRS{ro}==<\/code><code>\"0\"<\/code><\/div>\n<div><code>\u00a0\u00a0<\/code><code>ATTRS{size}==<\/code><code>\"7856127\"<\/code><\/div>\n<div><code>\u00a0\u00a0<\/code><code>ATTRS{alignment_offset}==<\/code><code>\"0\"<\/code><\/div>\n<div><code>\u00a0\u00a0<\/code><code>ATTRS{discard_alignment}==<\/code><code>\"0\"<\/code><\/div>\n<div><code>\u00a0\u00a0<\/code><code>ATTRS{capability}==<\/code><code>\"51\"<\/code><\/div>\n<div><code>\u00a0\u00a0<\/code><code>ATTRS{stat}==<\/code><code>\"\u00a0\u00a0\u00a0\u00a0 251\u00a0\u00a0\u00a0\u00a0 1491\u00a0\u00a0\u00a0\u00a0 2002\u00a0\u00a0\u00a0\u00a0\u00a0 216\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 5\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 1\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 48\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0\u00a0\u00a0\u00a0\u00a0\u00a0 216\u00a0\u00a0\u00a0\u00a0\u00a0 216\"<\/code><\/div>\n<div><code>\u00a0\u00a0<\/code><code>ATTRS{inflight}==<\/code><code>\"\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0\"<\/code><\/div>\n<div><code>\u00a0\u00a0<\/code><code>ATTRS{events}==<\/code><code>\"media_change\"<\/code><\/div>\n<div><code>\u00a0\u00a0<\/code><code>ATTRS{events_async}==<\/code><code>\"\"<\/code><\/div>\n<div><code>\u00a0\u00a0<\/code><code>ATTRS{events_poll_msecs}==<\/code><code>\"-1\"<\/code><\/div>\n<div><\/div>\n<div><code>looking at parent device <\/code><code>'\/devices\/pci0000:00\/0000:00:1d.7\/usb1\/1-8\/1-8:1.0\/host4\/target4:0:0\/4:0:0:0'<\/code><code>:<\/code><\/div>\n<div><code>\u00a0\u00a0<\/code><code>KERNELS==<\/code><code>\"4:0:0:0\"<\/code><\/div>\n<div><code>\u00a0\u00a0<\/code><code>SUBSYSTEMS==<\/code><code>\"scsi\"<\/code><\/div>\n<div><code>\u00a0\u00a0<\/code><code>DRIVERS==<\/code><code>\"sd\"<\/code><\/div>\n<div><code>\u00a0\u00a0<\/code><code>ATTRS{device_blocked}==<\/code><code>\"0\"<\/code><\/div>\n<div><code>\u00a0\u00a0<\/code><code>ATTRS{<\/code><code>type<\/code><code>}==<\/code><code>\"0\"<\/code><\/div>\n<div><code>\u00a0\u00a0<\/code><code>ATTRS{scsi_level}==<\/code><code>\"0\"<\/code><\/div>\n<div><code>\u00a0\u00a0<\/code><code>ATTRS{vendor}==<\/code><code>\"SanDisk \"<\/code><\/div>\n<div><code>\u00a0\u00a0<\/code><code>ATTRS{model}==<\/code><code>\"Cruzer Blade\"<\/code><\/div>\n<div><code>\u00a0\u00a0<\/code><code>ATTRS{rev}==<\/code><code>\"8.02\"<\/code><\/div>\n<div><code>\u00a0\u00a0<\/code><code>ATTRS{state}==<\/code><code>\"running\"<\/code><\/div>\n<div><code>\u00a0\u00a0<\/code><code>ATTRS{timeout}==<\/code><code>\"30\"<\/code><\/div>\n<div><code>\u00a0\u00a0<\/code><code>ATTRS{iocounterbits}==<\/code><code>\"32\"<\/code><\/div>\n<div><code>\u00a0\u00a0<\/code><code>ATTRS{iorequest_cnt}==<\/code><code>\"0x2763\"<\/code><\/div>\n<div><code>\u00a0\u00a0<\/code><code>ATTRS{iodone_cnt}==<\/code><code>\"0x2763\"<\/code><\/div>\n<div><code>\u00a0\u00a0<\/code><code>ATTRS{ioerr_cnt}==<\/code><code>\"0x19\"<\/code><\/div>\n<div><code>\u00a0\u00a0<\/code><code>ATTRS{modalias}==<\/code><code>\"scsi:t-0x00\"<\/code><\/div>\n<div><code>\u00a0\u00a0<\/code><code>ATTRS{evt_media_change}==<\/code><code>\"0\"<\/code><\/div>\n<div><code>\u00a0\u00a0<\/code><code>ATTRS{queue_depth}==<\/code><code>\"1\"<\/code><\/div>\n<div><code>\u00a0\u00a0<\/code><code>ATTRS{queue_type}==<\/code><code>\"none\"<\/code><\/div>\n<div><code>\u00a0\u00a0<\/code><code>ATTRS{max_sectors}==<\/code><code>\"240\"<\/code><\/div>\n<div><\/div>\n<div><code>looking at parent device <\/code><code>'\/devices\/pci0000:00\/0000:00:1d.7\/usb1\/1-8\/1-8:1.0\/host4\/target4:0:0'<\/code><code>:<\/code><\/div>\n<div><code>\u00a0\u00a0<\/code><code>KERNELS==<\/code><code>\"target4:0:0\"<\/code><\/div>\n<div><code>\u00a0\u00a0<\/code><code>SUBSYSTEMS==<\/code><code>\"scsi\"<\/code><\/div>\n<div><code>\u00a0\u00a0<\/code><code>DRIVERS==<\/code><code>\"\"<\/code><\/div>\n<div><\/div>\n<div><code>looking at parent device <\/code><code>'\/devices\/pci0000:00\/0000:00:1d.7\/usb1\/1-8\/1-8:1.0\/host4'<\/code><code>:<\/code><\/div>\n<div><code>\u00a0\u00a0<\/code><code>KERNELS==<\/code><code>\"host4\"<\/code><\/div>\n<div><code>\u00a0\u00a0<\/code><code>SUBSYSTEMS==<\/code><code>\"scsi\"<\/code><\/div>\n<div><code>\u00a0\u00a0<\/code><code>DRIVERS==<\/code><code>\"\"<\/code><\/div>\n<div><\/div>\n<div><code>looking at parent device <\/code><code>'\/devices\/pci0000:00\/0000:00:1d.7\/usb1\/1-8\/1-8:1.0'<\/code><code>:<\/code><\/div>\n<div><code>\u00a0\u00a0<\/code><code>KERNELS==<\/code><code>\"1-8:1.0\"<\/code><\/div>\n<div><code>\u00a0\u00a0<\/code><code>SUBSYSTEMS==<\/code><code>\"usb\"<\/code><\/div>\n<div><code>\u00a0\u00a0<\/code><code>DRIVERS==<\/code><code>\"usb-storage\"<\/code><\/div>\n<div><code>\u00a0\u00a0<\/code><code>ATTRS{bInterfaceNumber}==<\/code><code>\"00\"<\/code><\/div>\n<div><code>\u00a0\u00a0<\/code><code>ATTRS{bAlternateSetting}==<\/code><code>\" 0\"<\/code><\/div>\n<div><code>\u00a0\u00a0<\/code><code>ATTRS{bNumEndpoints}==<\/code><code>\"02\"<\/code><\/div>\n<div><code>\u00a0\u00a0<\/code><code>ATTRS{bInterfaceClass}==<\/code><code>\"08\"<\/code><\/div>\n<div><code>\u00a0\u00a0<\/code><code>ATTRS{bInterfaceSubClass}==<\/code><code>\"06\"<\/code><\/div>\n<div><code>\u00a0\u00a0<\/code><code>ATTRS{bInterfaceProtocol}==<\/code><code>\"50\"<\/code><\/div>\n<div><code>\u00a0\u00a0<\/code><code>ATTRS{modalias}==<\/code><code>\"usb:v0781p5567d0200dc00dsc00dp00ic08isc06ip50\"<\/code><\/div>\n<div><code>\u00a0\u00a0<\/code><code>ATTRS{supports_autosuspend}==<\/code><code>\"1\"<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>Veja que n\u00e3o postei toda a sa\u00edda do comando pois \u00e9 muito longa. Agora, abaixo mostro duas regras:<\/p>\n<div>ACTION==&#8221;add&#8221;, SUBSYSTEM==&#8221;block&#8221;, KERNEL==&#8221;sd??&#8221;, ATTRS{vendor}==&#8221;SanDisk&#8221;, DRIVERS==&#8221;usb-storage&#8221;, SYMLINK+=&#8221;PENDRIVE&#8221;<br \/>\nACTION==&#8221;add&#8221;, SUBSYSTEM==&#8221;block&#8221;, KERNEL==&#8221;sd??&#8221;, ATTRS{vendor}==&#8221;SanDisk&#8221;, SYMLINK+=&#8221;PENDRIVE&#8221;<\/div>\n<p>Ambas as regras t\u00eam a a\u00e7\u00e3o de criar um link para a parti\u00e7\u00e3o do pendrive. No entanto, somente a segunda regra ir\u00e1 funcionar.<\/p>\n<p>Explica\u00e7\u00e3o da primeira regra:<\/p>\n<ul>\n<li>1\u00ba \u2192 \u00c9 conferido se o dispositivo que est\u00e1 sendo conectado;<\/li>\n<li>2\u00ba \u2192 \u00c9 conferido se o dispositivo conectado \u00e9 do tipo bloco (armazenamento), ou seja, se filho do dispositivo de bloco;<\/li>\n<li>3\u00ba \u2192 \u00c9 conferido se o nome do dispositivo atribu\u00eddo pelo kernel na chave de combina\u00e7\u00e3o KERNEL &#8220;filho&#8221; \u00e9 igual a o informado na regra;<\/li>\n<li>4\u00ba \u2192 Verifica em um dos atributos &#8220;pais&#8221; se existe o atributo com valor SanDisk, isso garante que a regra s\u00f3 ser\u00e1 executada se o pendrive for do fabricante SanDisk;<\/li>\n<li>5\u00ba \u2192 Verifica se o driver carregado em um dos devices parents \u00e9 igual ao especificado;<\/li>\n<li>6\u00ba \u2192 Caso tudo esteja certo na regra, o link chamado PENDRIVE \u00e9 atribu\u00eddo \u00e0 parti\u00e7\u00e3o do pendrive.<\/li>\n<\/ul>\n<p>Mesmo toda informa\u00e7\u00e3o conferindo na primeira regra, n\u00e3o pode funcionar, pois foi atribu\u00eddo junto \u00e0 chave de combina\u00e7\u00e3o do dispositivo filho (como j\u00e1 foi informado na segunda p\u00e1gina), uma chave de atributo (ATTRS) e outra de combina\u00e7\u00e3o (DRIVERS) de dispositivos &#8220;pais&#8221;.<\/p>\n<p>Deixo mais uma vez claro, que a regra n\u00e3o ir\u00e1 funcionar caso seja atribu\u00eddo mais de uma chave de atributo ou de combina\u00e7\u00e3o de um <em>parent device<\/em> junto \u00e0 uma chave de combina\u00e7\u00e3o de um device filho.<\/p>\n<p>A segunda regra tem quase todos as chaves da primeira regra, com exce\u00e7\u00e3o da chave de combina\u00e7\u00e3o DRIVERS de um dispositivo pai. E esta regra ir\u00e1 funcionar por que apenas uma chave, seja de atributo ou de combina\u00e7\u00e3o (no exemplo, uma foi de atributo) de dispositivo pai est\u00e1 atribu\u00edda junto \u00e0s chaves de combina\u00e7\u00e3o do dispositivo filho que s\u00e3o ACTION, SUBSYSTEM e KERNEL.<\/p>\n<p>Agora, veja um exemplo de regra usada para executar um script:<\/p>\n<div>ACTION==&#8221;add&#8221;, SUBSYSTEM==&#8221;block&#8221;, KERNEL==&#8221;sd??&#8221;, SUBSYSTEMS==&#8221;usb&#8221;, RUN+=&#8221;\/usr\/local\/bin\/usb-mount.sh&#8221;<\/div>\n<p>Veja que esta regra \u00e9 similar \u00e0s duas mostradas anteriormente. No entanto, o valor atribu\u00eddo \u00e0 chave de combina\u00e7\u00e3o SUBSYSTEM do dispositivo filho, indica que deve ser aplicada a um dispositivo de bloco, ou seja, de armazenamento.<\/p>\n<p>E a chave de combina\u00e7\u00e3o (do device parent) SUBSYSTEMS, indica que a regra s\u00f3 ser\u00e1 aplicada a dispositivos pais do tipo USB; dessa forma, a regra s\u00f3 ser\u00e1 aplicada a um pendrive, HD externo e\/ou cart\u00e3o de mem\u00f3ria, e n\u00e3o a discos r\u00edgidos internos, por exemplo.<\/p>\n<p>Veja abaixo, o conte\u00fado do script <em>\/usr\/local\/bin\/usb-mount.sh<\/em>:<\/p>\n<div id=\"forumCodeDiv\">\n<div id=\"highlighter_655100\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td>\n<div>\n<div><code>#!\/bin\/bash<\/code><\/div>\n<div><code>usb=<\/code><code>\"\/dev\/\"<\/code><code>$(<\/code><code>ls<\/code> <code>-1 <\/code><code>\/sys\/block\/<\/code><code>\"$(ls -1 \/sys\/block |grep sd |tail -1)\"<\/code> <code>|<\/code><code>grep<\/code> <code>sd |<\/code><code>tail<\/code> <code>-1)<\/code><code>\"\"<\/code><\/div>\n<div><code>tipo=$(blkid -o list <\/code><code>\"$usb\"<\/code> <code>|<\/code><code>awk<\/code> <code>-F<\/code><code>\" \"<\/code> <code>'{print $2}'<\/code> <code>|<\/code><code>tail<\/code> <code>-1)<\/code><\/div>\n<div><code>label=$(blkid -o list <\/code><code>\"$usb\"<\/code> <code>|<\/code><code>awk<\/code> <code>-F<\/code><code>\" \"<\/code> <code>'{print $3}'<\/code> <code>|<\/code><code>tail<\/code> <code>-1)<\/code><\/div>\n<div><code>dir<\/code><code>=<\/code><code>\"\/media\/\"<\/code><code>$label<\/code><code>\"\"<\/code><\/div>\n<div><code>[ -d <\/code><code>\"$dir\"<\/code> <code>]&amp;&amp; <\/code><code>sleep<\/code> <code>1 || <\/code><code>mkdir<\/code> <code>\"$dir\"<\/code><\/div>\n<div><code>if<\/code> <code>[ <\/code><code>\"$tipo\"<\/code> <code>= <\/code><code>\"ext3\"<\/code> <code>];<\/code><code>then<\/code><\/div>\n<div><code>mount<\/code> <code>-t <\/code><code>\"$tipo\"<\/code> <code>-o relatime,noexec,rw,nodev,user <\/code><code>\"$usb\"<\/code> <code>\"$dir\"<\/code><\/div>\n<div><code>elif<\/code> <code>[ <\/code><code>\"$tipo\"<\/code> <code>= <\/code><code>\"ext4\"<\/code> <code>];<\/code><code>then<\/code><\/div>\n<div><code>mount<\/code> <code>-t <\/code><code>\"$tipo\"<\/code> <code>-o relatime,noexec,rw,nodev,user <\/code><code>\"$usb\"<\/code> <code>\"$dir\"<\/code><\/div>\n<div><code>elif<\/code> <code>[ <\/code><code>\"$tipo\"<\/code> <code>= <\/code><code>\"vfat\"<\/code> <code>];<\/code><code>then<\/code><\/div>\n<div><code>mount<\/code> <code>-t <\/code><code>\"$tipo\"<\/code> <code>-o relatime,noexec,rw,user,<\/code><code>umask<\/code><code>=0022,uid=1000,gid=1000 <\/code><code>\"$usb\"<\/code> <code>\"$dir\"<\/code><\/div>\n<div><code>elif<\/code> <code>[ <\/code><code>\"$tipo\"<\/code> <code>= <\/code><code>\"ntfs\"<\/code> <code>];<\/code><code>then<\/code><\/div>\n<div><code>mount<\/code> <code>-t ntfs-3g -o relatime,noexec,rw,user,<\/code><code>umask<\/code><code>=0022,uid=1000,gid=1000 <\/code><code>\"$usb\"<\/code> <code>\"$dir\"<\/code><\/div>\n<div><code>elif<\/code> <code>[ <\/code><code>\"$tipo\"<\/code> <code>= <\/code><code>\"xfs\"<\/code> <code>];<\/code><code>then<\/code><\/div>\n<div><code>mount<\/code> <code>-t <\/code><code>\"$tipo\"<\/code> <code>-o relatime,noexec,rw,nodev,user <\/code><code>\"$usb\"<\/code> <code>\"$dir\"<\/code><\/div>\n<div><code>elif<\/code> <code>[ <\/code><code>\"$tipo\"<\/code> <code>= <\/code><code>\"jfs\"<\/code> <code>];<\/code><code>then<\/code><\/div>\n<div><code>mount<\/code> <code>-t <\/code><code>\"$tipo\"<\/code> <code>-o relatime,noexec,rw,nodev,user <\/code><code>\"$usb\"<\/code> <code>\"$dir\"<\/code><\/div>\n<div><code>elif<\/code> <code>[ <\/code><code>\"$tipo\"<\/code> <code>= <\/code><code>\"btrfs\"<\/code> <code>];<\/code><code>then<\/code><\/div>\n<div><code>mount<\/code> <code>-t <\/code><code>\"$tipo\"<\/code> <code>-o relatime,noexec,rw,nodev,user <\/code><code>\"$usb\"<\/code> <code>\"$dir\"<\/code><\/div>\n<div><code>fi<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>A finalidade do script \u00e9 montar o pendrive, HD externo ou cart\u00f5es de mem\u00f3ria desabilitando a execu\u00e7\u00e3o de execut\u00e1veis, dando mais seguran\u00e7a quando &#8220;espetar&#8221; um destes dispositivos na m\u00e1quina (afinal, nunca se sabe o que pode ter em um HD externo ou pendrive de algu\u00e9m, n\u00e3o \u00e9 verdade?) evitando a execu\u00e7\u00e3o de v\u00edrus e outras pragas.<\/p>\n<p>Podemos tamb\u00e9m renomear dispositivos como placas de rede. Para ver como fazer isso, veja a sa\u00edda do comando <em>udevadm<\/em> para o dispositivo Wlan0 e em seguida, irei mostrar uma regra para isso:<\/p>\n<p><strong># udevadm info -a -p \/sys\/class\/net\/wlan0<\/strong><\/p>\n<div id=\"forumCodeDiv\">\n<div id=\"highlighter_801987\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td>\n<div>\n<div><code>looking at device <\/code><code>'\/devices\/pci0000:00\/0000:00:1d.7\/usb1\/1-8\/1-8:1.0\/net\/wlan0'<\/code><code>:<\/code><\/div>\n<div><code>\u00a0\u00a0<\/code><code>KERNEL==<\/code><code>\"wlan0\"<\/code><\/div>\n<div><code>\u00a0\u00a0<\/code><code>SUBSYSTEM==<\/code><code>\"net\"<\/code><\/div>\n<div><code>\u00a0\u00a0<\/code><code>DRIVER==<\/code><code>\"\"<\/code><\/div>\n<div><code>\u00a0\u00a0<\/code><code>ATTR{addr_assign_type}==<\/code><code>\"0\"<\/code><\/div>\n<div><code>\u00a0\u00a0<\/code><code>ATTR{addr_len}==<\/code><code>\"6\"<\/code><\/div>\n<div><code>\u00a0\u00a0<\/code><code>ATTR{dev_id}==<\/code><code>\"0x0\"<\/code><\/div>\n<div><code>\u00a0\u00a0<\/code><code>ATTR{ifalias}==<\/code><code>\"\"<\/code><\/div>\n<div><code>\u00a0\u00a0<\/code><code>ATTR{iflink}==<\/code><code>\"5\"<\/code><\/div>\n<div><code>\u00a0\u00a0<\/code><code>ATTR{ifindex}==<\/code><code>\"5\"<\/code><\/div>\n<div><code>\u00a0\u00a0<\/code><code>ATTR{<\/code><code>type<\/code><code>}==<\/code><code>\"1\"<\/code><\/div>\n<div><code>\u00a0\u00a0<\/code><code>ATTR{link_mode}==<\/code><code>\"1\"<\/code><\/div>\n<div><code>\u00a0\u00a0<\/code><code>ATTR{address}==<\/code><code>\"00:1a:3f:7c:2e:f4\"<\/code><\/div>\n<div><code>\u00a0\u00a0<\/code><code>ATTR{broadcast}==<\/code><code>\"ff:ff:ff:ff:ff:ff\"<\/code><\/div>\n<div><code>\u00a0\u00a0<\/code><code>ATTR{carrier}==<\/code><code>\"0\"<\/code><\/div>\n<div><code>\u00a0\u00a0<\/code><code>ATTR{dormant}==<\/code><code>\"0\"<\/code><\/div>\n<div><code>\u00a0\u00a0<\/code><code>ATTR{operstate}==<\/code><code>\"down\"<\/code><\/div>\n<div><code>\u00a0\u00a0<\/code><code>ATTR{mtu}==<\/code><code>\"1500\"<\/code><\/div>\n<div><code>\u00a0\u00a0<\/code><code>ATTR{flags}==<\/code><code>\"0x1003\"<\/code><\/div>\n<div><code>\u00a0\u00a0<\/code><code>ATTR{tx_queue_len}==<\/code><code>\"1000\"<\/code><\/div>\n<div><code>\u00a0\u00a0<\/code><code>ATTR{netdev_group}==<\/code><code>\"0\"<\/code><\/div>\n<div><\/div>\n<div><code>looking at parent device <\/code><code>'\/devices\/pci0000:00\/0000:00:1d.7\/usb1\/1-8\/1-8:1.0'<\/code><code>:<\/code><\/div>\n<div><code>\u00a0\u00a0<\/code><code>KERNELS==<\/code><code>\"1-8:1.0\"<\/code><\/div>\n<div><code>\u00a0\u00a0<\/code><code>SUBSYSTEMS==<\/code><code>\"usb\"<\/code><\/div>\n<div><code>\u00a0\u00a0<\/code><code>DRIVERS==<\/code><code>\"ath9k_htc\"<\/code><\/div>\n<div><code>\u00a0\u00a0<\/code><code>ATTRS{bInterfaceNumber}==<\/code><code>\"00\"<\/code><\/div>\n<div><code>\u00a0\u00a0<\/code><code>ATTRS{bAlternateSetting}==<\/code><code>\" 0\"<\/code><\/div>\n<div><code>\u00a0\u00a0<\/code><code>ATTRS{bNumEndpoints}==<\/code><code>\"06\"<\/code><\/div>\n<div><code>\u00a0\u00a0<\/code><code>ATTRS{bInterfaceClass}==<\/code><code>\"ff\"<\/code><\/div>\n<div><code>\u00a0\u00a0<\/code><code>ATTRS{bInterfaceSubClass}==<\/code><code>\"00\"<\/code><\/div>\n<div><code>\u00a0\u00a0<\/code><code>ATTRS{bInterfaceProtocol}==<\/code><code>\"00\"<\/code><\/div>\n<div><code>\u00a0\u00a0<\/code><code>ATTRS{modalias}==<\/code><code>\"usb:v0CF3p7015d0202dcFFdscFFdpFFicFFisc00ip00\"<\/code><\/div>\n<div><code>\u00a0\u00a0<\/code><code>ATTRS{supports_autosuspend}==<\/code><code>\"0\"<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>O adaptador USB est\u00e1 recebendo este nome de &#8220;wlan0&#8221; porque, quando o sistema o detectou, o udev atribuiu a regra abaixo:<\/p>\n<div>SUBSYSTEM==&#8221;net&#8221;, ACTION==&#8221;add&#8221;, DRIVERS==&#8221;?*&#8221;, ATTR{address}==&#8221;00:1a:3f:7c:2e:f4&#8243;, ATTR{dev_id}==&#8221;0x0&#8243;, ATTR{type}==&#8221;1&#8243;, KERNEL==&#8221;wlan*&#8221;, NAME=&#8221;wlan0&#8243;<\/div>\n<p>Mas, com estas informa\u00e7\u00f5es da sa\u00edda do comando <em>udevadm<\/em> podemos mudar o nome do device para, por exemplo, Wireless0 como mostra a regra abaixo:<\/p>\n<div>SUBSYSTEM==&#8221;net&#8221;, ACTION==&#8221;add&#8221;, DRIVERS==&#8221;?*&#8221;, ATTR{address}==&#8221;00:1a:3f:7c:2e:f4&#8243;, ATTR{dev_id}==&#8221;0x0&#8243;, ATTR{type}==&#8221;1&#8243;, KERNEL==&#8221;*&#8221;, NAME=&#8221;wireless0&#8243;<\/div>\n<p>Explicando a regra:<\/p>\n<ul>\n<li>1\u00ba \u2192 \u00c9 verificado se o dispositivo filho conectado \u00e9 do tipo net (rede);<\/li>\n<li>2\u00ba \u2192 Verifica se o dispositivo acabou de se conectado;<\/li>\n<li>3\u00ba \u2192 Na chave de combina\u00e7\u00e3o DRIVERS informa que pode ser usado qualquer driver para o respectivo device parent;<\/li>\n<li>4\u00ba \u2192 Na chave de atributo ATTR{address} \u00e9 verificado o endere\u00e7o MAC address do device;<\/li>\n<li>5\u00ba e 6\u00ba \u2192 S\u00e3o verificados mais duas chaves de atributos da mesma (note que ambas foram atribu\u00eddas junto ao dispositivo filho, por isso a regra funciona);<\/li>\n<li>7\u00ba \u2192 Na chave KERNEL \u00e9 verificado qual o nome atribu\u00eddo pelo kernel, no exemplo informei que pode ser qualquer um;<\/li>\n<li>8\u00ba \u2192 Na \u00faltima chave de combina\u00e7\u00e3o informei o novo nome do dispositivo que \u00e9 wireless0.<\/li>\n<\/ul>\n<p>Podemos fazer muitas personaliza\u00e7\u00f5es, al\u00e9m das quais j\u00e1 foram mostradas, podemos, por exemplo, automatizar um processo de backup toda vez que o dispositivo for conectado \u00e0 m\u00e1quina de forma similar \u00e0 regra acima, que executa um script.<\/p>\n<p>Ap\u00f3s aplicar uma regra em um dos arquivos com extens\u00e3o &#8220;.rules&#8221;, torna-se necess\u00e1rio reiniciar o servi\u00e7o do udev para as altera\u00e7\u00f5es entrarem em vigor (pelo menos nas distribui\u00e7\u00f5es <em>Debian<\/em> e <em>CentOS<\/em>, por exemplo).<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n","protected":false},"excerpt":{"rendered":"<p>Detec\u00e7\u00e3o e ativa\u00e7\u00e3o de dispositivos e a fun\u00e7\u00e3o do udev nesse processo Introdu\u00e7\u00e3o Udev (Userspace devfs) \u00e9 um sistema de arquivos presente desde o kernel 2.6 e substitui o devfs completamente. \u00c9 respons\u00e1vel por gerenciar os arquivos de dispositivos do diret\u00f3rio \/dev, criando e removendo os mesmos dinamicamente. O udev tamb\u00e9m tem fun\u00e7\u00e3o do hotplug, [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"categories":[51,68,127],"tags":[264,263,262,261],"class_list":["post-453","post","type-post","status-publish","format-standard","hentry","category-linux-linuxrs","category-redes-2","category-sistemas-de-armazenamento","tag-funcionamento","tag-regras","tag-seguranca","tag-udev"],"_links":{"self":[{"href":"https:\/\/blog.clusterweb.com.br\/index.php?rest_route=\/wp\/v2\/posts\/453","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.clusterweb.com.br\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.clusterweb.com.br\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.clusterweb.com.br\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.clusterweb.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=453"}],"version-history":[{"count":1,"href":"https:\/\/blog.clusterweb.com.br\/index.php?rest_route=\/wp\/v2\/posts\/453\/revisions"}],"predecessor-version":[{"id":455,"href":"https:\/\/blog.clusterweb.com.br\/index.php?rest_route=\/wp\/v2\/posts\/453\/revisions\/455"}],"wp:attachment":[{"href":"https:\/\/blog.clusterweb.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=453"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.clusterweb.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=453"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.clusterweb.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=453"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}