Gostaria de saber como o Linux, como o Ubuntu, "sabe" como e quais drivers instalar ao instalá-lo do zero. Por exemplo, compro um computador novo sem nenhum sistema e instalo o Ubuntu. Dentro do meu PC eu tenho uma GPU, HDDs, etc., também alguns periféricos, como mouse, teclado, etc. " quais drivers instalar/baixar e como ele faz isso?
(Baseado na cópia armazenada em cache do Google de http://people.skolelinux.org/pere/blog/Modalias_strings___a_practical_way_to_map__stuff__to_hardware.html de Petter Reinholdtsen.)
No hardware, existem certos identificadores de dispositivo padrão que podem ser acessados desde que você conheça o método de acesso padrão para esse barramento de E/S ou subsistema específico, sem ter nenhum conhecimento adicional sobre o dispositivo real. No Linux, esses identificadores são usados para construir cadeias de modalias , que são usadas para encontrar o driver correto para cada dispositivo.
O código-fonte de cada módulo de driver pode incluir
MODULE_DEVICE_TABLE
estruturas, que são usadas pelodepmod
comando para criar entradas curinga de alias de módulo que corresponderão às cadeias de modalias do hardware suportado por esse módulo específico.Quando o kernel detecta uma peça de hardware sem driver correspondente carregado ainda, ele criará uma string de modalias a partir dos identificadores do hardware e a usará para solicitar que um módulo seja carregado automaticamente. O
modprobe
comando usará o/lib/modules/$(uname -r)/modules.alias[.bin]
arquivo criado pordepmod
para ver se existe um módulo correspondente. Se isso acontecer, esse módulo será carregado e poderá testar o hardware para obter mais detalhes, se necessário.Por exemplo, eu tenho uma placa de TV DVB:
Isso resulta em uma string de modalias como esta:
O
cx23885
módulo tem esses aliases baseadosMODULE_DEVICE_TABLE
em seu código-fonte:Quando o kernel detecta a placa, ele efetivamente executa o
modprobe pci:v000014F1d00008852sv00000070sd00006A28bc04sc00i00
comando. O segundo alias docx23885
módulo corresponde e, portanto, esse módulo é carregado.Dispositivos de barramento PCI/PCI-X/PCIe
Este é o "subtipo PCI". Ele usa strings de modalias assim:
Isso pode ser decodificado da seguinte forma:
Com
lspci -nn
, você pode ver os IDs de classe, subclasse, fornecedor e dispositivo. Se você adicionar a-v
opção, também poderá ver os IDs do subvendor:subdispositivo.Dispositivos USB
Com dispositivos USB, as strings de modalias ficam assim:
Isso descompacta para:
Com o
lsusb
comando, você pode ver os IDs do fornecedor e do produto. Se você usar a-v
opção, poderá ver os outros IDs também.Dispositivos ACPI
Estes usam os identificadores ACPI PNP, prefixados
acpi:
e separados por dois pontos:Dispositivos DMI
Isso pode ser uma string de modalias muito longa:
Isso descompacta para:
Dispositivos SerIO, ou seja, principalmente mouses PS/2
A string de modalias ficará assim:
Os valores aqui são:
Outros tipos de barramento/dispositivo
Existem muitos outros tipos de barramento reconhecidos pelo kernel do Linux. Estudar o conteúdo do arquivo fonte do kernel file2alias.c pode ser útil para decifrar o significado dos componentes de cada tipo de string de modalias.
Todos os periféricos se identificam principalmente com IDs exclusivos. Alguns IDs são para interfaces genéricas (HDD/mouse, etc). O Linux tem a maioria dos drivers embutidos, e os drivers genéricos têm listas de compatibilidade para IDs que suportam um conjunto limitado de recursos. Fica mais complicado, mas dmesg, lscpu, hwinfo, lshw, dmidecode, lspci, etc.