私はLinuxを試していて、初期の起動プロセスを理解しようとしています。少なくとも私がudevで遊んでいるシステムでは、デバイスを検出する「モジュール」があります。ただし、検出されると、何らかの方法で使用可能なインターフェイスのリストに「追加」され、「ip link setdevup」コマンドを実行できます。そのステップまで、デバイス名は認識されません。
私の質問は、これはどこで発生し、どのコマンドが使用されるのかということです。
Initramfsイメージにフックを追加し、「ip link」を使用してインターフェイスをダンプしていて、ループバックインターフェイスのみが存在するため、「初期ユーザースペース」の後に発生することはわかっています。
ただし、これはかなり早い段階で発生する必要があります。私のシステム環境では、systemctlコマンドを実行すると、sys-subsystem-net-devices-ens33.deviceという「デバイス」エントリがあります。
そのエントリがデバイスのリストにどのように追加されるか、またはどのコマンドを実行するかはまったく明確ではありません。
助けてくれてありがとう、私はいろいろと調べてきましたが、このプロセスの詳細を見つけるのは簡単ではありませんでした。
コマンドはありません。そもそもユーザースペースによって行われるのではなく、カーネルの「net」サブシステムのregister_netdev()
を使用して新しいインターフェイスを表示するカードのイーサネットドライバによって完全に行われます。
プロセスは、大まかに次のとおりです。
カーネルは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
...
_
udevはueventを受信し、ルール(ヘルパーツールの実行、さまざまなメタデータの追加、シンボリックリンクの作成)に従って処理し、今度はさまざまなlibudevを使用するプログラムに再送信します。
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
_ドライバーをロードします。
ドライバーが今ロードされているか、以前にロードされていたかに関係なく、カーネルはその_.probe
_関数を呼び出して、ドライバーを特定のデバイスに接続します。
ドライバーの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
_