
私は Linux を試していて、初期ブート プロセスを理解しようとしています。少なくとも私が試したシステムでは、udev はデバイスを検出する「モジュール」です。ただし、いったん検出されると、何らかの方法で使用可能なインターフェイスのリストに「追加」され、「ip link set dev up」コマンドを実行できるようになります。ただし、そのステップまではデバイス名は認識されません。
私の質問は、これがどこで発生し、どのようなコマンドが使用されるかということです。
initramfs イメージにフックを追加し、「ip link」を使用してインターフェースをダンプし、ループバック インターフェースのみが存在するため、「初期ユーザー スペース」の後に発生することがわかっています。
ただし、これはかなり早い段階で発生するはずであり、私のシステム環境では、systemctl コマンドを実行すると、sys-subsystem-net-devices-ens33.device として「デバイス」エントリが存在します。
そのエントリがデバイスのリストにどのように追加されるのか、またどのようなコマンドが実行されるのかについてはまったく明らかではありません。
ご協力ありがとうございます。いろいろ調べてみましたが、このプロセスの詳細は簡単には見つかりませんでした。
答え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 ルール ファイルの 1 つは
80-drivers.rules
、 を含む uevents を処理しMODALIAS=
、 libkmod を使用してそのエイリアスに一致するカーネル モジュールをロードします。(以前は、モジュールのロードのために が実行されていました。ただし、またはmodprobe
に modalias を渡すことはできます。)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