web-dev-qa-db-ja.com

IPリンクコマンドでイーサネットインターフェイスはどのように表示されますか

私はLinuxを試していて、初期の起動プロセスを理解しようとしています。少なくとも私がudevで遊んでいるシステムでは、デバイスを検出する「モジュール」があります。ただし、検出されると、何らかの方法で使用可能なインターフェイスのリストに「追加」され、「ip link setdevup」コマンドを実行できます。そのステップまで、デバイス名は認識されません。

私の質問は、これはどこで発生し、どのコマンドが使用されるのかということです。

Initramfsイメージにフックを追加し、「ip link」を使用してインターフェイスをダンプしていて、ループバックインターフェイスのみが存在するため、「初期ユーザースペース」の後に発生することはわかっています。

ただし、これはかなり早い段階で発生する必要があります。私のシステム環境では、systemctlコマンドを実行すると、sys-subsystem-net-devices-ens33.deviceという「デバイス」エントリがあります。

そのエントリがデバイスのリストにどのように追加されるか、またはどのコマンドを実行するかはまったく明確ではありません。

助けてくれてありがとう、私はいろいろと調べてきましたが、このプロセスの詳細を見つけるのは簡単ではありませんでした。

3
Mestrio

コマンドはありません。そもそもユーザースペースによって行われるのではなく、カーネルの「net」サブシステムのregister_netdev()を使用して新しいインターフェイスを表示するカードのイーサネットドライバによって完全に行われます。

プロセスは、大まかに次のとおりです。

  1. カーネルはPCIまたはUSBデバイスを検出し、それを説明する「モダリア」を構築し、デバイスを通知する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ルールファイルの1つである_80-drivers.rules_は、_MODALIAS=_を含むueventを処理し、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()を呼び出して、それ自体の実際のイーサネットインターフェイスを作成するために必要なチップマジックを実行します。

    (USBデバイスの場合、一部のドライバーはusbnetモジュールにプローブを延期します。これは、標準のUSB作業のほとんどを実行し、実際のイーサネットインターフェイスを作成し、ハードウェア固有の処理を行うためにメインドライバーのみを呼び出します。魔法。)

    _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
    _
2
user1686