
Estou experimentando o Linux e tentando entender o processo de inicialização inicial. Pelo menos nos sistemas com os quais tenho brincado o udev é o "módulo" que descobre dispositivos. No entanto, uma vez descoberto, de alguma forma ele é "adicionado" à lista de interfaces disponíveis e você pode executar um comando "ip link set dev up". Até essa etapa, ele não reconhecerá o nome do dispositivo.
Minha pergunta é onde isso acontece e qual comando é usado?
Eu sei que isso acontece depois do "espaço inicial do usuário", pois adicionei um gancho à minha imagem initramfs e estou usando o "ip link" para despejar as interfaces e apenas a interface de loopback existe.
Isso deve acontecer bem cedo e no meu ambiente de sistema há uma entrada de "dispositivo" como sys-subsystem-net-devices-ens33.device quando eu executo um comando systemctl.
Não está claro como essa entrada é adicionada à lista de dispositivos ou quais comandos ela executa.
Obrigado por qualquer ajuda, estive fuçando, mas os detalhes desse processo não foram fáceis de localizar.
Responder1
Não há comando. Em primeiro lugar, isso não é feito pelo espaço do usuário – é feito inteiramente pelo driver Ethernet da placa, que usa register_netdev()
o subsistema “net” do kernel para fazer uma nova interface aparecer.
O processo é, aproximadamente:
O Kernel descobre um dispositivo PCI ou USB, constrói uma "modalias" descrevendo-o e envia um uevent anunciando o dispositivo para o udev. Por exemplo:
ACTION=add DEVPATH=/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.3 DEVTYPE=usb_device SUBSYSTEM=usb ... ACTION=add DEVPATH=/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.3/2-1.3:1.0 DEVTYPE=usb_interface MODALIAS=usb:v0B95p1790d0100dcFFdscFFdp00icFFiscFFip00in00 SUBSYSTEM=usb ...
O udev recebe o uevent, processa-o de acordo com as regras (executando ferramentas auxiliares, adicionando vários metadados, criando links simbólicos) e o envia novamente, desta vez para vários programas que usam o libudev.
Um dos arquivos de regras do udev,
80-drivers.rules
, lida com uevents contendoMODALIAS=
e usa libkmod para carregar quaisquer módulos do kernel que correspondam a esse alias. (No passado, ele costumava ser executadomodprobe
para o carregamento do módulo. Você ainda pode passar modalias paramodprobe
oumodinfo
, no entanto.)$ modinfo usb:v0B95p1790d0100dcFFdscFFdp00icFFiscFFip00in00 filename: /lib/modules/4.7.2-1-ARCH/kernel/drivers/net/usb/ax88179_178a.ko.gz description: ASIX AX88179/178A based USB 3.0/2.0 Gigabit Ethernet Devices alias: usb:v0DF6p0072d*dc*dsc*dp*ic*isc*ip*in* alias: usb:v2001p4A00d*dc*dsc*dp*ic*isc*ip*in* alias: usb:v0B95p178Ad*dc*dsc*dp*ic*isc*ip*in* alias: usb:v0B95p1790d*dc*dsc*dp*ic*isc*ip*in* depends: usbnet,usbcore,mii ...
Portanto, para este dispositivo, o udev carregará o
ax88179_178a
driver.Quer o driver tenha sido carregado agora ou já tenha sido carregado anteriormente, o kernel chama sua
.probe
função para anexá-lo a um dispositivo específico.A função do driver
probe
faz toda a mágica do chip necessária para ligar o dispositivo, inicializá-lo, configurá-lo e, finalmente, chamarregister_netdev()
para criar uma interface Ethernet real para si.(Para dispositivos USB, alguns drivers adiam a análise para o
usbnet
módulo, que é aquele que faz a maior parte do trabalho USB padrão e cria uma interface Ethernet real, e apenas chama o driver principal para fazer a mágica específica do hardware.)Sep 04 21:25:11 kernel: ax88179_178a 2-1.3:1.0 eth1: register 'ax88179_178a' ↵ at usb-0000:00:1d.0-1.3, ASIX AX88179 USB 3.0 Gigabit Ethernet, 8c:ae:4c:f4:06:33