| udev | |
|---|---|
| 開発者 | グレッグ・クロア・ハートマンとケイ・シーヴァース |
| 初回リリース | 2003年11月 (2003年11月) |
| 安定版リリース | 258.3 [ 1 ] / 2025年12月12日 (2025年12月12日) |
| リポジトリ | |
| 書かれた | C |
| オペレーティング·システム | リナックス |
| タイプ | デバイスノード |
| ライセンス | GPLv2 |
| Webサイト | 公式サイト |
udev ( userspace /dev ) は、 Linuxカーネル用のデバイスマネージャです。devfsdとhotplugの後継として、udevは主に/devディレクトリ内のデバイスノードを管理します。同時に、udevはハードウェアデバイスがシステムに追加または削除された際に発生するすべてのユーザー空間イベントも処理します。これには、特定のデバイスに必要なファームウェアのロードも含まれます。udevは、 Greg Kroah-HartmanとKay Sieversによって開発され、 Dan Stekloffをはじめとする多くの協力を得ました。
オペレーティングシステムのカーネルは、ハードウェアからソフトウェア全体への抽象インターフェースを提供する役割を担っています。モノリシックカーネルであるLinuxカーネルはまさにその役割を担っています。デバイスドライバはLinuxカーネルの一部であり、ソースコードの半分以上を占めています。[ 2 ]ハードウェアには、システムコールまたはデバイスノードを介してアクセスできます。
ホットプラグ対応の周辺機器をユーザーフレンドリーな方法で扱えるようにするため、これらのホットプラグ対応ハードウェアデバイスの処理の一部をカーネルからユーザー空間で実行されるデーモンに委譲しました。ユーザー空間で実行することで、セキュリティと安定性が向上します。
デバイスドライバはLinuxカーネルの一部であり、主な機能にはデバイスの検出、デバイスの状態変化の検出、その他低レベルのハードウェア機能が含まれます。デバイスドライバがカーネルからメモリにロードされると、検出されたイベントはユーザー空間デーモンudevdに送信されます。デバイスマネージャであるudevdは、これらのイベントをすべてキャッチし、次に何が起こるかを決定します。そのため、udevdは非常に包括的な設定ファイルセットを備えており、コンピュータ管理者は必要に応じてこれらを調整できます。
この複雑さのため、アプリケーション開発者はハードウェアサポートロジックを再実装せざるを得ませんでした。一部のハードウェアデバイスでは、使用準備のために特権ヘルパープログラムも必要でした。これらのヘルパープログラムは、Unixのパーミッションモデルでは表現しにくい方法で呼び出す必要がある場合が多くありました(例えば、ユーザーがゲーム機にログインしている場合にのみ無線ネットワークへの接続を許可するなど)。アプリケーション開発者は、 setuidバイナリを使用したり、サービスデーモンを実行したりして独自のアクセス制御と権限分離を実現していましたが、そのたびにセキュリティホールが生じる可能性がありました。[ 3 ]
HAL はこれらの課題に対処するために作成されましたが、現在ではほとんどの Linux ディストリビューションで非推奨となっており、その機能は udevd に置き換えられています。
/devディレクトリ内のデバイスノードが静的なファイル群であった従来のUnixシステムとは異なり、 Linuxのudevデバイスマネージャは、システムに実際に存在するデバイスのノードのみを動的に提供します。devfsも同様の機能を提供していましたが、Greg Kroah-Hartmanはdevfsよりもudevを推奨する理由として、 いくつかの理由を挙げています[ 4 ] 。
udev は全体として、次の 3 つの部分に分かれています。
システムはカーネルからの呼び出しをnetlinkソケット経由で受け取ります。以前のバージョンではhotplugを使用しており、この目的で/etc/hotplug.d/defaultに自身へのリンクを追加していました。

udev は、Linux システム上でデーモンとして動作する汎用デバイスマネージャです。新しいデバイスが初期化されたときやデバイスがシステムから削除されたときにカーネルが送信する uevent を( netlinkソケット経由で)リッスンします。udev パッケージには、検出されたデバイスのイベントおよびプロパティのエクスポート値と照合する広範なルールセットが付属しています。照合ルールは、デバイスノードに名前を付けて作成し、設定されたプログラムを実行してデバイスのセットアップと設定を行います。
udevルールは、カーネルサブシステム、カーネルデバイス名、デバイスの物理的な位置、デバイスのシリアル番号などのプロパティに基づいてマッチングできます。また、ルールは外部プログラムにデバイス名を要求したり、システムによるデバイスの検出順序に関係なく常に同じ名前を指定したりすることもできます。
かつてLinuxシステムでudevを使用する一般的な方法は、ソケットを介してHALにイベントを送信し、HALがデバイス固有の追加アクションを実行するというものでした。例えば、HALはD -Bus IPCシステム上でブロードキャストメッセージを発行することで、システム上で実行されている他のソフトウェアに新しいハードウェアが接続されたことを通知します。これにより、GNOMEやKデスクトップ環境3などのデスクトップはファイルブラウザを起動し、新しく接続されたUSBフラッシュドライブやSDカードのファイルシステムを参照することができました。[ 6 ]
2011年半ばまでに、HALはほとんどのLinuxディストリビューションに加え、KDE、GNOME [ 7 ]、Xfce [ 8 ]などのデスクトップ環境でも非推奨となりました。以前HALに搭載されていた機能はudev自体に統合されたり、udisksやupowerなどの別のソフトウェアに移行されたりしました。
udev はカーネルからメッセージを受信し、Network Manager などのサブシステムデーモンに渡します。アプリケーションは D-Bus を介して Network Manager と通信します。
HALは廃止されており、レガシーコードでのみ使用されています。Ubuntu 10.04はHALなしで出荷されました。当初、HALの一部を置き換える新しいデーモンであるDeviceKitが計画されていましたが、2009年3月にDeviceKitは廃止され、代わりにudevに同じコードがパッケージとして追加されました(udev-extras)。現在、一部の機能はudev本体に移行されています。
udevはLinux 2.5で導入されました。Linuxカーネルバージョン2.6.13では、ueventインターフェースの新しいバージョンが導入または更新されました。新しいバージョンのudevを使用するシステムは、udevを無効化し、デバイスアクセスに従来の/devディレクトリを使用しない 限り、2.6.13より古いカーネルでは起動しません。
2012年4月、udevのコードベースがsystemdのソースツリーに統合され、systemd 183がudevを組み込んだ最初のバージョンとなった。[ 5 ] [ 10 ] [ 11 ] 2012年10月、Linus TorvaldsはKay Sieversのudevのメンテナンスとファームウェアの読み込みに関するバグ修正に対するアプローチを批判し、次のように述べた。[ 12 ]
はい、カーネル内で行う方が「より堅牢」です。でも、ごまかしはやめてください。嘘はやめてください。カーネル内で行う方が堅牢なのは、メンテナーが気を配っているからであり、リグレッションをいい加減に扱うべきではないと分かっているからです。何かが壊れて、その適切な修正方法がわからない場合は、壊れた部分を元に戻します。ですから、カーネル内で行う方が明らかに有利です。ファームウェアのロードがユーザー空間でできないからではありません。Gregがudevを放棄して以来、udevのメンテナンスが悪化しているからです。
2012年、Gentoo Linuxプロジェクトは、systemdアーキテクチャへの依存を回避するため、systemdのudevコードベースのフォークを作成しました。このフォークはeudevと呼ばれ、systemdなしでudevの機能を利用できるようになります。プロジェクトの目標は、eudevをLinuxディストリビューションやinitシステムから独立させることです。[ 13 ] Gentooプロジェクトはeudevを次のように説明しています。[ 14 ]
eudev は systemd-udev のフォークであり、 OpenRCやUpstartなどの既存のソフトウェア、古いカーネル、さまざまなツールチェーン、およびユーザーやさまざまなディストリビューションで必要なものすべてとの互換性を向上させることを目的としています。
2014年5月29日、ファームウェアのロードはカーネルの役割であると決定されたため、systemdからudevを介したファームウェアのロードのサポートが削除されました。[ 15 ] 2日後、Lennart Poetteringは、このパッチをkdbusがudevで利用されるまで延期することを提案しました。その時点では、udevをkdbusを基盤となるメッセージングシステムとして使用するように切り替え、ユーザー空間間のnetlinkベースのトランスポートを取り除く計画でした。[ 16 ]