Existem alternativas para usar o `udev`?

16

Embora eu compreenda a grandeza do udev e aprecie o esforço dos desenvolvedores, fiquei simplesmente me perguntando se há uma alternativa para isso.

Por exemplo, eu posso imaginar que deve haver uma maneira de criar scripts de inicialização que criem a maioria dos nós de dispositivos que, no meu sistema (sem alteração de hardware), são os mesmos.

O benefício ou a razão que eu gostaria de pular udevseria o mesmo que pular dbus, ou seja, reduzir a complexidade e aumentar minhas alterações para configurar o sistema com mais segurança.

humanidade e paz
fonte

Respostas:

23

Existem várias alternativas para udevlá fora. Aparentemente, o Gentoo pode usar algo chamado mdev. Outra opção seria tentar usar udevo antecessor devfsd. Por fim, você sempre pode criar todos os arquivos de dispositivo necessários mknod.

Observe que, com o último, não há necessidade de criar tudo no momento da inicialização, pois os nós podem ser criados no disco e não em um sistema de arquivos temporário, como nas outras opções. Obviamente, você perde a flexibilidade de criar arquivos de dispositivos dinamicamente quando um novo hardware é conectado (por exemplo, um pen drive). Acredito que a abordagem padrão nesta época era ter todos os arquivos de dispositivos nos quais você poderia razoavelmente precisar já criados /dev(ou seja, muitos arquivos de dispositivos).

É claro que a dificuldade em conseguir que qualquer uma dessas abordagens funcione em uma distribuição moderna é provavelmente bastante alta. O wiki do Gentoo menciona dificuldades em mdevtrabalhar com um ambiente de área de trabalho (muito menos fora do Gentoo). O último devfsdlançamento foi 2002, não tenho idéia se ele funcionará com os kernels modernos. Criar os nós manualmente é provavelmente a abordagem mais viável, mas até a desativação udevpode ser um desafio, principalmente no uso de distos systemd( udevagora faz parte systemd, o que sugere uma forte dependência).

Meu conselho é ficar com udev;)

Graeme
fonte
11
Obrigado! Ótima resposta que abordou a maioria, se não todos, os aspectos da pergunta e estava cheia de informações! Quer saber como resolver o problema systemd agora ... Vou ver como separar este :)
humanityANDpeace
udevdeve funcionar perfeitamente sem systemd- ambos são desenvolvidos apenas na mesma base de código, mas udevpodem ser criados + executados independentemente dele.
Elias Probst
@Elias, é claro, udevjá existe há muito tempo systemd. A questão é: pode systemdtrabalhar sem udev? Meu palpite é que você teria pelo menos que recompilar com algum tipo de --without-udevopção.
Graeme
2
@ Graeme: Não, não pode. É como tentar reduzir a complexidade de um carro removendo as rodas. Se você está bem em inicializar com systemd (o que faz muito ), mas está seriamente preocupado com a complexidade do udev (que faz cada vez menos), então você tem coisas realmente confusas.
user1686
@grawity Fair point, mas talvez eu não seja tão bom em inicializar com systemd para init então! Tem que dar-lhe um olhar
humanityANDpeace
22

Os kernels modernos do Linux suportam o devtmpfssistema de arquivos (não confunda com o antigo devfs) , que cria todos os nós de dispositivos dinamicamente assim que o kernel os descobre. (De fato, as udevversões mais recentes exigem isso; você descobrirá que o udev não cria mais nós de dispositivos, apenas links simbólicos.)

Da mesma forma, o carregamento do firmware também foi movido para o kernel; portanto, as únicas tarefas restantes udevexecutadas são o carregamento do módulo (de acordo com as modaliases) e a aplicação de permissões do dispositivo e outras regras do udev.

Portanto, em teoria, um kernel totalmente monolítico deve inicializar perfeitamente sem o udev.

No entanto, o verdadeiro problema aqui é o que acontece mais tarde.

  1. Muitos programas de espaço do usuário dependem do udev manter seu banco de dados do dispositivo, acessível através libudev. Embora a enumeração de dispositivos e a escuta de eventos adicionados / removidos possam ser feitos diretamente usando as interfaces do kernel (sysfs e netlink), você ainda ficará sem todos os metadados anexados por várias regras do udev.

  2. udev regras também mantêm vários links simbólicos "persistentes" em /dev/disk/by-*, /dev/mapper, /dev/input/by-path, /dev/snd/by-path, e assim por diante. Por exemplo, se você tiver dois discos conectados, não há garantia de que o primeiro seja sempre sdaousdb , mas o udev garante que os links simbólicos /dev/disk/by-uuidcontinuem apontando para o caminho certo.

  3. Embora os nós de dispositivos agora sejam criados pelo kernel e, portanto, não sejam mais sua preocupação, ainda é importante observar que alguns tipos de dispositivos começaram a usar números principais / secundários atribuídos dinamicamente, portanto, mesmo que você tenha /dev/fuse10.228 e /dev/hpet10.229 hoje, eles serão tenha números diferentes após cada reinicialização; portanto, devtmpfsou (em sistemas mais antigos), é necessário um programa que ouça eventos .

Muitas dessas coisas poderiam ser facilmente executadas por outros programas, como mdev, é claro. Meu argumento é que um /etc/MAKEDEVscript estático não funcionará mais ...


Portanto, basicamente, quando se trata de complexidade de inicialização, o udev é provavelmente a menor das suas preocupações.

user1686
fonte
Interessante, você sabe qual versão do kernel introduz a criação dinâmica de nós?
Graeme
2
@ Graeme: Aproximadamente 2.6.32 .
user1686
12

Existem várias alternativas:

  • Basta ter um conjunto de apropriadas chmod, chown, ln, e comandos afins em um script que é executado como parte da inicialização.
  • Use systemd-udev, o gerenciador de plug-and-play que faz parte do projeto systemd.
  • Use o Gentoo'seudev , que é uma bifurcação da systemd-udevqual o systemd agora divergiu significativamente.
  • Use o Devuan'svdev , um gerenciador plug-and-play desenvolvido por Jude Nelson, que faz parte do Devuan.
  • Use mdev, que ao contrário de outra resposta não é uma coisa do Gentoo. É o gerenciador plug-and-play integrado ao BusyBox .
  • Use Suckless,mdev um gerenciador de plug-and-play desenvolvido por Dimitris Papastamos.
  • Use o Laurent Bercotmdevd , que é compatível com o BusyBox, mdevmas manipula soquetes e não entende o protocolo LISTEN.

Tudo isso, além do primeiro, requer conjuntos de regras que descrevem como reagir a eventos de notificação do kernel sobre dispositivos. Obviamente.

Também existem ferramentas que adotam programas projetados para /proc/sys/kernel/hotplug, como os dois mdevse adaptam e serializam, ouvindo um soquete de netlink e gerando esses programas:

JdeBP
fonte
6

udev? A melhor alternativa é não usá-lo. E aprendendo como não usá-lo, o Linux e o mundo * NIX começarão a fazer mais sentido lógico.

A melhor alternativa a longo prazo é usar dispositivos estáticos (consulte a nota). Se você possui o driver, o kernel do Linux gerencia o hot plug. Prefiro nunca ter o udevd em execução.

dbus é outra questão. Isso diminui a velocidade do seu sistema, mas o mundo em constante mudança do pessoal do script o ama. Portanto, muitas coisas a que você está acostumado, como navegadores da Web ou aplicativos com back-end de script, precisam ser corrigidas (iniciadas ou reconstruídas sem essas coisas ou descartadas para outra aplicação).

Nota: Se você estiver apenas conectando uma unidade flash ou dispositivo de DVD, use dmesg|tailpara ver o nome do dispositivo a ser montado. Aprender quando um dispositivo é um dispositivo de caractere ou bloco é um conhecimento fundamental do sistema no mundo do hardware de computador. No Linux, é de código aberto, confira muito sobre o Linux, não apenas incorporado . É o melhor para um entendimento mais amplo da lógica direta (não da filosofia) de todos os * NIXs, como Linux (Solaris, HPUX, AIX, etc).

O Udev, o dbus, o gconf / dconf, o systemd, o gnome-shell, o Gnome, o Glib, o mono e o Fedora são para pessoas com muito tempo disponível e que não podem usar o RTFM, ou que desejam uma atualização realmente automática, mas lenta do que melaço, buggy, Linux a meio caminho. (Um lugar realmente horrível, procure na web toneladas de experiências semelhantes).

O sistema inicializa e executa o udevd. Mas, afirma-se que o udev é necessário porque, números menores do dispositivo will changena reinicialização. A raison d'être de Udev parece se contradizer a cada momento. E onde estão os arquivos parece sempre errado, não importa quem você consulte. Não confie no freedesktop.org.

Além do udev estar sendo absorvido pelo horror conhecido como systemd, então não sei o que fazer com o arquivo / etc / udev junk. E, é absurdo dizer que escrever regras do udev é de alguma forma melhor do que qualquer coisa. O pessoal do gentoo parece querer se apegar a ele e não precisa ter o systemd, então eles o bifurcaram no eudev.

Se você deseja um sistema ridiculamente rápido, sem surpresas desagradáveis, use o básico do Linux.

Ginleagh
fonte
6
Este é mais um discurso retórico do que uma resposta ...
jasonwryan
2
@jasonwryan de certa forma, ainda há algum valor, pois aconselha algumas maneiras de lidar manualmente com as tarefas normalmente cobertas na udevfuncionalidade. Também é certo ressaltar os pontos fortes dessa abordagem alternativa .
humanityANDpeace
11
Votou isto. A lógica é que, embora eu concorde completamente que o estilo possa ser considerado inadequado por alguns, ele tem seus méritos e, mesmo que não seja realmente útil, estou tendendo a aceitá-lo como factual. No kernel 4.x, o udev renomeia aleatoriamente as interfaces Ethernet. O QUE ?!
Victor Victor
Você não pode confiar no kernel para nomeação persistente de dispositivos. Pelo menos, o udev lhe dá o controle.
Emmanuel