Quais problemas o udev realmente resolve?

28

Na verdade, o que exatamente havia de errado com um monte de arquivos estáticos /dev? Aparentemente, é insatisfatório o suficiente para que os desenvolvedores tenham reinventado essa roda pela minha contagem três vezes agora ( devfs-> udev + HAL-> udev), e agora aparentemente está entrando no Programa Grand Unified Init também, então quatro vezes.

Lembro-me de quando comecei a usar o Linux, anos atrás, surpreendendo-me que, apesar das alegações de que "tudo é um arquivo", não existe /dev/eth0(que mais tarde fez sentido, pois não é um dispositivo de char ou block - embora seja um tipo de dispositivo de "pacote" seria interessante ...). Dado isso, por que o programa que lida com a árvore de arquivos de dispositivos char e block também é responsável pelos dispositivos de rede? Vi vagas referências à "flexibilidade", mas o que isso acrescenta ao que, digamos, o ifconfig (8) faz apenas olhando /proc/net/dev? Eu sei, por exemplo, que o NetworkManager não estará no Net ou no OpenBSD tão cedo porque depende udev, do qual nenhuma equipe deseja escrever; o que eu não '/devque já estão expostas de várias maneiras pelo kernel (e nenhuma delas /dev!).

É apenas por causa de hotplugging? Houve problemas com o kernel apenas ouvindo os barramentos físicos e carregando os módulos apropriados em uma mensagem "dispositivo adicionado"? Ou, Deus proíba, o administrador real fazendo isso? Lembro-me de que, no início dos anos 2000, meus servidores às vezes inicializavam suas placas de rede em uma ordem inesperada, e suponho que faz sentido que essa nomeação seja decidida na terra do usuário (embora não fosse terrivelmente difícil de corrigir naquela época), mas isso parece uma marreta para uma barata. (Ou talvez esse problema ocorra nos casos de uso em que não estou pensando muito mais do que em servidores ou PCs montados em rack, que são minha experiência.)

Portanto, para declarar minha pergunta com clareza: quais problemas o udev realmente resolve e como o devfs, HAL e / ou um arquivo antigo simples não conseguiram resolvê-los? Existe uma razão específica para que muitas coisas diferentes (hotplugging, gerenciamento geral de dispositivos, gerenciamento de dispositivos de rede, nomeação de dispositivos, prioridade de driver etc.) sejam todos um programa?

Bandrami
fonte
5
Sua linha de pensamento é boa para um administrador de sistema que lida com servidores, mas não atende às necessidades de laptops, desktops modernos típicos ou usuários móveis. Os arquivos estáticos /devnão abordam (fácil ou convenientemente) coisas como uma pessoa conectando um adaptador de rede USB ou adaptadores de rede virtual sendo adicionados ou removidos enquanto o sistema está em execução. Porém, nada impede você de desinstalar udeve voltar à /devrota de diretório estática antiga .
LawrenceC
Na verdade, havia implementações de devfs concorrentes, originalmente. Portanto, é mais do que três ... (Embora eu não acho que você pode contar udev + HAL como um só.)
derobert

Respostas:

33

Mais duas coisas: a mudança do Linux para a empresa e outros grandes servidores estava expondo a estática /deva ser quebrada. O avanço da tecnologia, tanto no consumidor quanto na empresa, estava expondo o static / dev como uma piada. [Esta resposta preenche mais a história de fundo, não particularmente por que o devfs foi substituído pelo udev].

Esgotamento do espaço numérico maior e menor

/devos arquivos são identificados dentro do kernel por seus números maiores e menores. O kernel nunca se preocupou com o nome (e você poderia, por exemplo, mv /dev/sda /dev/disk-1e continuaria a funcionar - embora os programas não soubessem onde encontrá-lo).

Com uma estática /dev, você precisa alocar um número maior / menor para todos os dispositivos em potencial que possam existir. Esses números precisam ser exclusivos globalmente, pois são enviados como parte de distribuições, não criados sob demanda. O problema é que eles são números de 8 bits - o intervalo é de 0 a 255.

Originalmente, por exemplo, o Linux começou com 8,0 sendo sda, 8,1 sendo sda1, 8,16 sendo sdb, etc. Mas as pessoas continuavam adicionando cada vez mais discos às máquinas, especialmente quando se considera coisas como canal de fibra. Então, em algum momento, os principais números de 65 a 71 foram adicionados para mais discos. Mais tarde, números principais 128–135. E, no entanto, as pessoas continuavam querendo mais discos ...

E surgiram formatos de tabela de partições como o GPT, suportando mais partições por disco. E é claro que outros dispositivos estavam consumindo o espaço numérico: vários controladores RAID, gerenciamento lógico de volumes, etc.

O resultado final pode ser visto na lista de dispositivos LANANA Linux . Se você olhar para a lista 2.6 (a única ainda lá), muitos dos principais números de blocos são 200 (máx: 255) - são usados. Claramente, os números teriam acabado.

Mudar para números maiores não foi fácil. Muda o ABI do kernel. Dependendo do sistema de arquivos, ele altera o layout do disco. Mas, é claro, a maioria desses dispositivos não existia em nenhum sistema, mesmo um que estava (por exemplo) ficando sem discos SCSI provavelmente tinha muitas coisas gratuitas - provavelmente não precisava de um disco rígido IBM XT, por exemplo.

Com uma dinâmica /dev, a distribuição não precisa enviar os números do dispositivo. Eles não precisam mais ser globalmente únicos. Eles nem precisam ser únicos entre as botas.

Os nomes dos dispositivos eram imprevisíveis

Costumava ser muito fácil atribuir um número a tudo. Uma placa tinha dois canais IDE; cada canal IDE suportava um mestre e um escravo. Você pode atribuir em ordem de canal e ordem mestre e escravo. Então hdase torna o primeiro canal, mestre; hdbprimeiro canal, escravo; hdcsegundo canal, mestre; etc. Esses eram previsíveis e estáveis. Eles podem ser alterados se você adicionar uma nova unidade ou remover uma, mas a alteração de hardware ausente, eles eram estáticos.

Você pode colocar o /dev/hda1seu /etc/fstabe ter certeza de que ele continuará funcionando, pelo menos, alterações de hardware ausentes.

IDE funcionou assim. Nada depois disso.

O SATA parece ser simples: uma porta, um disco. Mas não é assim; permite multiplicadores de porta. E permite troca a quente. Ainda assim, na ausência de alterações de hardware, você ainda pode manter o mapeamento funcionando.

USB é muito pior. Não apenas permite troca a quente, como é típico. As pessoas conectam drives flash USB o tempo todo. Além disso, os dispositivos podem demorar um pouco para serem analisados ​​- e podem ser alterados sempre que lhes apetecer (por exemplo, quando você liga ou desliga o modo de armazenamento USB no telefone). Firewire é semelhante. Com você também não é possível criar um mapeamento estável.

Os discos conectados à rede não têm nenhuma ordem de porta inerente. A única ordem que o kernel usa é a ordem em que eles apareceram. O mesmo com volumes lógicos.

A busca pela velocidade de inicialização também piorou as coisas. Originalmente, o kernel ficaria feliz em aguardar e esperar bastante tempo para, por exemplo, todos os dispositivos USB serem inicializados. Para investigar completamente todos os barramentos SCSI, etc. Essas análises foram transformadas em tarefas em segundo plano; bota não iria mais esperar por eles. Os dispositivos são adicionados à medida que as sondas são concluídas.

Portanto, o kernel ficou com, mais ou menos, "qualquer ordem em que aparecerem". Isso significava que muitos tipos de dispositivos podem e mudaram de ordem a cada inicialização - o que estava em uma inicialização /dev/sdbestava em outra /dev/sdc. Isso faz da idéia de uma estática /devuma piada.

Sumário

Quando você considera a combinação de estática /devcada vez mais sem sentido devido a pedidos imprevisíveis de análise de dispositivos e continua alocando números estáticos principais / secundários, levando a um trabalho substancial a não acabar, fica claro por que os desenvolvedores do Linux optaram por mudar para uma dinâmica /dev.

derobert
fonte
2
As impressoras USB costumavam ser um grande problema para a configuração, tendo que lsusb -vvprocurar onde minhas impressoras estavam escondidas de inicialização em inicialização. Eu teria que procurar por bits como este: "Dispositivo 001 do barramento 001: ID 04f9: 0217"
slm
24

Boa pergunta.

De certa forma, esse argumento poderia ser revertido: desde que o kernel 2.6.13 introduziu uma nova versão uevent, aconteceria que devfsprecisaria ser reescrito para aproveitar os novos recursos da interface. Então, de certa forma, a questão deveria ser por que a mudança no kernel.

No entanto, considerando o valor nominal, sua pergunta é respondida no artigo da Wikipedia :

Diferentemente dos sistemas Unix tradicionais, em que os nós do dispositivo no diretório / dev são um conjunto estático de arquivos, o gerenciador de dispositivos Linux udev fornece dinamicamente apenas os nós dos dispositivos realmente presentes em um sistema. Embora o devfs costumava fornecer funcionalidade semelhante, Greg Kroah-Hartman citou vários motivos para preferir sua implementação ao invés do devfs:

1) O udev suporta a nomeação persistente de dispositivos, o que não depende, por exemplo, da ordem em que os dispositivos são conectados ao sistema. A configuração padrão do udev fornece nomes persistentes para dispositivos de armazenamento. Qualquer disco rígido é reconhecido por sua identificação exclusiva do sistema de arquivos, o nome do disco e a localização física no hardware ao qual está conectado.

2) O udev é executado inteiramente no espaço do usuário, em oposição ao espaço do kernel do devfs. Uma conseqüência é que o udev moveu a política de nomenclatura para fora do kernel e pode executar programas arbitrários para compor um nome para o dispositivo a partir das propriedades do dispositivo, antes que o nó seja criado; lá, todo o processo também é interrompível e é executado com uma prioridade mais baixa.

Provavelmente, devo acrescentar que, com o udev race condition, é evitada a possibilidade de a , que basicamente minou a nomeação de dispositivos no devfs e no hotplug. Em outras palavras: com o devfs, não havia como garantir que a porta Ethernet mais à esquerda fosse chamada eth0e a mais à direita eth1, dificultando (como um exemplo puro) a configuração de roteadores (uma porta para WAN, uma porta para LAN) difícil de implemento.

A adoção do esquema de nomenclatura dos discos com base no GUID é outra vantagem, e a mudança de todo o processo para o espaço do usuário é ainda maior: você pesquisou neste site para ver quantas pessoas escrevem suas próprias regras de udev?

Como um exemplo simples das vantagens inerentes a ter o udev no espaço do usuário, verifique esta ou outra questão , neste mesmo site.

MariusMatutiae
fonte