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 '/dev
que 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?
/dev
nã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 desinstalarudev
e voltar à/dev
rota de diretório estática antiga .Respostas:
Mais duas coisas: a mudança do Linux para a empresa e outros grandes servidores estava expondo a estática
/dev
a 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
/dev
os 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-1
e 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
hda
se torna o primeiro canal, mestre;hdb
primeiro canal, escravo;hdc
segundo 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/hda1
seu/etc/fstab
e 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/sdb
estava em outra/dev/sdc
. Isso faz da idéia de uma estática/dev
uma piada.Sumário
Quando você considera a combinação de estática
/dev
cada 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
.fonte
lsusb -vv
procurar 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"Boa pergunta.
De certa forma, esse argumento poderia ser revertido: desde que o kernel 2.6.13 introduziu uma nova versão
uevent
, aconteceria quedevfs
precisaria 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 :
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 chamadaeth0
e a mais à direitaeth1
, 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.
fonte