
Я экспериментирую с Linux и пытаюсь понять процесс ранней загрузки. По крайней мере, в системах, с которыми я играл, udev — это «модуль», который обнаруживает устройства. Однако после обнаружения он каким-то образом «добавляется» в список доступных интерфейсов, и вы можете выполнить команду «ip link set dev up». До этого шага он не распознает имя устройства.
У меня вопрос: где это происходит и какая команда используется?
Я знаю, что это происходит после «раннего пользовательского пространства», так как я добавил хук в свой образ initramfs и использую «ip link» для дампа интерфейсов, а существует только интерфейс loopback.
Однако это должно произойти довольно рано, и в моей системной среде есть запись «устройства» как sys-subsystem-net-devices-ens33.device, когда я выполняю команду systemctl.
Совершенно не ясно, как эта запись добавляется в список устройств и какие команды она выполняет.
Спасибо за любую помощь, я копался в этом вопросе, но детали этого процесса найти оказалось непросто.
решение1
Нет команды. Это не делается пользовательским пространством изначально – это делается исключительно драйвером Ethernet карты, который использует register_netdev()
подсистему «net» ядра, чтобы появился новый интерфейс.
Процесс примерно такой:
Ядро обнаруживает устройство PCI или USB, создает "modalias", описывающий его, и отправляет uevent, объявляющий об устройстве, в udev. Например:
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 ...
udev получает uevent, обрабатывает его в соответствии с правилами (запускает вспомогательные инструменты, добавляет различные метаданные, создает символические ссылки) и отправляет его снова, на этот раз различным программам, использующим libudev.
Один из файлов правил udev,
80-drivers.rules
, обрабатывает uevents, содержащиеMODALIAS=
и использующие libkmod для загрузки любых модулей ядра, соответствующих этому псевдониму. (Раньше он запускалсяmodprobe
для загрузки модуля. Однако вы по-прежнему можете передавать модальный псевдоним вmodprobe
илиmodinfo
.)$ 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 ...
Итак, для этого устройства udev загрузит драйвер
ax88179_178a
.Независимо от того, был ли драйвер загружен только что или уже был загружен ранее, ядро вызывает его
.probe
функцию, чтобы присоединить его к определенному устройству.Функция драйвера
probe
выполняет всю необходимую микросхемную магию для включения устройства, его инициализации, настройки и, наконец, вызоваregister_netdev()
для создания настоящего интерфейса Ethernet для себя.(Для USB-устройств некоторые драйверы передают проверку модулю
usbnet
, который выполняет большую часть стандартной работы USB и создает фактический интерфейс Ethernet, а основной драйвер вызывает только для выполнения аппаратно-специфической работы.)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