Как интерфейс Ethernet отображается в команде IP link

Как интерфейс Ethernet отображается в команде IP link

Я экспериментирую с Linux и пытаюсь понять процесс ранней загрузки. По крайней мере, в системах, с которыми я играл, udev — это «модуль», который обнаруживает устройства. Однако после обнаружения он каким-то образом «добавляется» в список доступных интерфейсов, и вы можете выполнить команду «ip link set dev up». До этого шага он не распознает имя устройства.

У меня вопрос: где это происходит и какая команда используется?

Я знаю, что это происходит после «раннего пользовательского пространства», так как я добавил хук в свой образ initramfs и использую «ip link» для дампа интерфейсов, а существует только интерфейс loopback.

Однако это должно произойти довольно рано, и в моей системной среде есть запись «устройства» как sys-subsystem-net-devices-ens33.device, когда я выполняю команду systemctl.

Совершенно не ясно, как эта запись добавляется в список устройств и какие команды она выполняет.

Спасибо за любую помощь, я копался в этом вопросе, но детали этого процесса найти оказалось непросто.

решение1

Нет команды. Это не делается пользовательским пространством изначально – это делается исключительно драйвером Ethernet карты, который использует register_netdev()подсистему «net» ядра, чтобы появился новый интерфейс.

Процесс примерно такой:

  1. Ядро обнаруживает устройство 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
    ...
    
  2. udev получает uevent, обрабатывает его в соответствии с правилами (запускает вспомогательные инструменты, добавляет различные метаданные, создает символические ссылки) и отправляет его снова, на этот раз различным программам, использующим libudev.

  3. Один из файлов правил 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.

  4. Независимо от того, был ли драйвер загружен только что или уже был загружен ранее, ядро ​​вызывает его .probeфункцию, чтобы присоединить его к определенному устройству.

  5. Функция драйвера 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
    

Связанный контент