「Udev」の版間の差分

提供: ArchWiki
ナビゲーションに移動 検索に移動
 
(Pkg/AUR テンプレートの更新)
(2人の利用者による、間の11版が非表示)
8行目: 8行目:
 
[[it:Udev]]
 
[[it:Udev]]
 
[[ru:Udev]]
 
[[ru:Udev]]
[[zh-CN:Udev]]
+
[[zh-hans:Udev]]
[[zh-TW:Udev]]
+
[[zh-hant:Udev]]
{{Related articles start (日本語)}}
+
{{Related articles start}}
 
{{Related|udisks}}
 
{{Related|udisks}}
 
{{Related articles end}}
 
{{Related articles end}}
{{ic|udev}} は {{ic|hotplug}} と {{ic|hwdetect}} 両方の機能を置き換えます。
 
 
 
[[Wikipedia:ja:Udev|Wikipedia の記事]]より:
 
[[Wikipedia:ja:Udev|Wikipedia の記事]]より:
 
:''"udev とは、Linuxカーネル 用のデバイス管理ツールである。主に {{ic|/dev}} ディレクトリ以下のデバイスノードを管理するために利用する。以前 {{ic|/dev}} ディレクトリの管理を担っていた devfs と、ホットスワップやファームウェアのロードなどユーザー空間におけるデバイスのアクション全てを担っていた hotplug の後継ツールである。"''
 
:''"udev とは、Linuxカーネル 用のデバイス管理ツールである。主に {{ic|/dev}} ディレクトリ以下のデバイスノードを管理するために利用する。以前 {{ic|/dev}} ディレクトリの管理を担っていた devfs と、ホットスワップやファームウェアのロードなどユーザー空間におけるデバイスのアクション全てを担っていた hotplug の後継ツールである。"''
  +
  +
{{ic|udev}} は {{ic|hotplug}} と {{ic|hwdetect}} 両方の機能を置き換えます。
   
 
Udev は並列処理を利用してカーネルモジュールをロードするため順番にモジュールをロードするのと比べ良いパフォーマンスが得られます。従ってモジュールは非同期に読み込まれます。この方法の欠点として、起動した時 udev はいつも同じ順番ではモジュールをロードしません。マシンに複数のブロックデバイスがある場合、デバイスノードの名称がランダムに変化する可能性があります。例えば、マシンに2つハードドライブが接続されている場合、ランダムで {{ic|/dev/sda}} が {{ic|/dev/sdb}} になるかもしれません。これについては下で詳しく説明しています。
 
Udev は並列処理を利用してカーネルモジュールをロードするため順番にモジュールをロードするのと比べ良いパフォーマンスが得られます。従ってモジュールは非同期に読み込まれます。この方法の欠点として、起動した時 udev はいつも同じ順番ではモジュールをロードしません。マシンに複数のブロックデバイスがある場合、デバイスノードの名称がランダムに変化する可能性があります。例えば、マシンに2つハードドライブが接続されている場合、ランダムで {{ic|/dev/sda}} が {{ic|/dev/sdb}} になるかもしれません。これについては下で詳しく説明しています。
22行目: 22行目:
 
== インストール ==
 
== インストール ==
   
現在 Udev は {{Pkg|systemd}} に含まれているため Arch Linux ではデフォルトでインストールされています。{{ic|man systemd-udevd.service}} を見て下さい。
+
現在 Udev は [[systemd]] に含まれているため Arch Linux ではデフォルトでインストールされています。詳しくは {{man|8|systemd-udevd.service}} の [[man ページ]]を見て下さい。
  +
  +
AUR には独立したフォークが存在します: [[eudev]]。
   
 
== udev ルールについて ==
 
== udev ルールについて ==
30行目: 32行目:
 
=== udev ルールを記述する ===
 
=== udev ルールを記述する ===
   
{{Warning|リムーバルドライブをマウントするのに、udev ルールから {{ic|mount}} を呼ばないで下さい。FUSE ファイルシステムの場合、{{ic|Transport endpoint not connected}} エラーが起こります。代わりに自動マウントを適切に処理する [[udisks (日本語)|udisks]] を使って下さい。}}
+
{{Warning|リムーバルドライブをマウントするのに、udev ルールから {{ic|mount}} を呼ばないで下さい。FUSE ファイルシステムの場合、{{ic|Transport endpoint not connected}} エラーが起こります。代わりに自動マウントを適切に処理する [[udisks]] を使って下さい。}}
   
* udev ルールの書き方を学ぶには [http://www.reactivated.net/writing_udev_rules.html Writing udev rules] を見て下さい。
+
* udev ルールの書き方を学ぶには [http://www.reactivated.net/writing_udev_rules.html udev ルールの書き方] ([http://mux03.panda64.net/docs/udevrules_ja.html 日本語訳]) を見て下さい。
 
* udev ルールのサンプルを見るには [https://soosck.wordpress.com/2011/01/19/improved-udev-rule-arch-linux/ Improved Udev Rule For Arch Linux] を見て下さい。
 
* udev ルールのサンプルを見るには [https://soosck.wordpress.com/2011/01/19/improved-udev-rule-arch-linux/ Improved Udev Rule For Arch Linux] を見て下さい。
   
 
以下はウェブカメラが接続されたときにシンボリックリンク {{ic|/dev/video-cam1}} を作るルールの例です。まず、カメラが接続されたときデバイス {{ic|/dev/video2}} にロードされていることを見つけたとします。このルールを書く理由は次のブート時にデバイスが {{ic|/dev/video0}} など他の名前で表示される可能性があるからです。
 
以下はウェブカメラが接続されたときにシンボリックリンク {{ic|/dev/video-cam1}} を作るルールの例です。まず、カメラが接続されたときデバイス {{ic|/dev/video2}} にロードされていることを見つけたとします。このルールを書く理由は次のブート時にデバイスが {{ic|/dev/video0}} など他の名前で表示される可能性があるからです。
   
  +
{{hc|# udevadm info -a -p $(udevadm info -q path -n /dev/video2)|<nowiki>
{{hc|# udevadm info -a -p $(udevadm info -q path -n /dev/video2)|<nowiki>Udevadm info starts with the device specified by the devpath and then walks up the chain of parent devices. It prints for every device found, all possible attributes in the udev rules key format. A rule to match, can be composed by the attributes of the device and the attributes from one single parent device.
 
  +
Udevadm info starts with the device specified by the devpath and then
  +
walks up the chain of parent devices. It prints for every device
  +
found, all possible attributes in the udev rules key format.
  +
A rule to match, can be composed by the attributes of the device
  +
and the attributes from one single parent device.
   
 
looking at device '/devices/pci0000:00/0000:00:04.1/usb3/3-2/3-2:1.0/video4linux/video2':
 
looking at device '/devices/pci0000:00/0000:00:04.1/usb3/3-2/3-2:1.0/video4linux/video2':
73行目: 80行目:
 
# udevadm monitor --environment --udev
 
# udevadm monitor --environment --udev
   
このコマンドの出力の中に、ID_VENDOR_ID や ID_MODEL_ID などの、前に使っていた属性 "idVendor" と "idProduct" に一致する値があるはずです。デバイスの環境変数を使うルールは以下のようになります:
+
このコマンドの出力の中に、{{ic|ID_VENDOR_ID}}{{ic|ID_MODEL_ID}} などの、前に使っていた属性 "idVendor" と "idProduct" に一致する値があるはずです。デバイスの環境変数を使うルールは以下のようになります:
 
{{hc|/etc/udev/rules.d/83-webcam-removed.rules|<nowiki>
 
{{hc|/etc/udev/rules.d/83-webcam-removed.rules|<nowiki>
 
ACTION=="remove", SUBSYSTEM=="usb", ENV{ID_VENDOR_ID}=="05a9", ENV{ID_MODEL_ID}=="4519", RUN+="/path/to/your/script"
 
ACTION=="remove", SUBSYSTEM=="usb", ENV{ID_VENDOR_ID}=="05a9", ENV{ID_MODEL_ID}=="4519", RUN+="/path/to/your/script"
97行目: 104行目:
   
 
自動的にルールがリロードされない場合:
 
自動的にルールがリロードされない場合:
# udevadm control --reload-rules
+
# udevadm control --reload
   
 
udev に手動で強制的にルールを適用させるには:
 
udev に手動で強制的にルールを適用させるには:
104行目: 111行目:
 
== Udisks ==
 
== Udisks ==
   
[[Udisks (日本語)|Udisks]] を見て下さい。
+
[[Udisks]] を見て下さい。
   
  +
== ヒントとテクニック ==
== Tips and tricks ==
 
   
 
=== ファームウェアプログラマや USB 仮想 comm デバイスにアクセス ===
 
=== ファームウェアプログラマや USB 仮想 comm デバイスにアクセス ===
   
以下のルールセット("users" グループに入っている) 通常のユーザーが AVR マイクロコントローラの [http://www.ladyada.net/make/usbtinyisp/ USBtinyISP] USB プログラマと一般的な (SiLabs [http://www.silabs.com/products/interface/usbtouart CP2102]) USB を UART アダブター, [http://www.atmel.com/tools/AVRDRAGON.aspx?tab=overview Atmel AVR Dragon] プログラマ, [http://www.atmel.com/tools/AVRISPMKII.aspx Atmel AVR ISP mkII] にアクセスできるようにします。必要に応じてパーミッションは調整してください。2012年10月31日確認。
+
以下のルールは {{ic|users}} グループのユーザーが AVR マイクロコントローラの [http://www.ladyada.net/make/usbtinyisp/ USBtinyISP] USB プログラマにアクセスできるように設定します:
   
{{hc|/etc/udev/rules.d/50-embedded_devices.rules|2=<nowiki>
+
{{hc|/etc/udev/rules.d/50-usbtinyisp.rules|2=
  +
SUBSYSTEMS=="usb", ATTRS{idVendor}=="1781", ATTRS{idProduct}=="0c9f", GROUP="users", MODE="0660"
# USBtinyISP Programmer rules
 
SUBSYSTEMS=="usb", ATTRS{idVendor}=="1781", ATTRS{idProduct}=="0c9f", GROUP="users", MODE="0666"
+
SUBSYSTEMS=="usb", ATTRS{idVendor}=="16c0", ATTRS{idProduct}=="0479", GROUP="users", MODE="0660"
  +
}}
SUBSYSTEMS=="usb", ATTRS{idVendor}=="16c0", ATTRS{idProduct}=="0479", GROUP="users", MODE="0666"
 
# USBasp Programmer rules http://www.fischl.de/usbasp/
 
SUBSYSTEMS=="usb", ATTRS{idVendor}=="16c0", ATTRS{idProduct}=="05dc", GROUP="users", MODE="0666"
 
   
  +
他のデバイスを使う場合は ''lsusb'' を使ってベンダー・プロダクト ID を確認してください。
# Mdfly.com Generic (SiLabs CP2102) 3.3v/5v USB VComm adapter
 
SUBSYSTEMS=="usb", ATTRS{idVendor}=="10c4", ATTRS{idProduct}=="ea60", GROUP="users", MODE="0666"
 
 
#Atmel AVR Dragon (dragon_isp) rules
 
SUBSYSTEM=="usb", ATTRS{idVendor}=="03eb", ATTRS{idProduct}=="2107", GROUP="users", MODE="0666"
 
 
#Atmel AVR JTAGICEMKII rules
 
SUBSYSTEM=="usb", ATTRS{idVendor}=="03eb", ATTRS{idProduct}=="2103", GROUP="users", MODE="0666"
 
 
#Atmel Corp. AVR ISP mkII
 
SUBSYSTEM=="usb", ATTRS{idVendor}=="03eb", ATTRS{idProduct}=="2104", GROUP="users", MODE="0666"
 
</nowiki>}}
 
   
 
=== USB 挿入で実行 ===
 
=== USB 挿入で実行 ===
   
[[Execute on USB insert (日本語)|USB 挿入時に実行]]または [http://igurublog.wordpress.com/downloads/script-devmon/ devmon ラッパースクリプト] を参照してください。
+
[[Udisks]] または [http://igurublog.wordpress.com/downloads/script-devmon/ devmon ラッパースクリプト] を参照してください。
   
 
=== VGA ケーブル接続時に実行 ===
 
=== VGA ケーブル接続時に実行 ===
141行目: 135行目:
   
 
KERNEL=="card0", SUBSYSTEM=="drm", ENV{DISPLAY}=":0", ENV{XAUTHORITY}="/home/''username''/.Xauthority", RUN+="/usr/bin/arandr"
 
KERNEL=="card0", SUBSYSTEM=="drm", ENV{DISPLAY}=":0", ENV{XAUTHORITY}="/home/''username''/.Xauthority", RUN+="/usr/bin/arandr"
  +
  +
ディスプレイマネージャによっては {{ic|.Xauthority}} がユーザーのホームディレクトリに保存されないことがあります。その場合 {{ic|<nowiki>ENV{XAUTHORITY}</nowiki>}} を修正する必要があります。例えば [[GDM]] なら以下のようになります:
  +
  +
{{hc|$ printenv XAUTHORITY|/run/user/1000/gdm/Xauthority}}
   
 
=== 新しい eSATA ドライブの検知 ===
 
=== 新しい eSATA ドライブの検知 ===
158行目: 156行目:
 
=== 内部 SATA ポートを eSATA とする ===
 
=== 内部 SATA ポートを eSATA とする ===
   
eSATA ベイや他の eSATA アダブタを接続するとシステムはディスクを内部 SATA ドライブとして認識します。[[GNOME (日本語)|GNOME]] や [[KDE (日本語)|KDE]] はその度に root パスワードを尋ねることになります。以下の udev ルールは指定した SATA ポートを外部 eSATA ポートとして表示させます。これで、USB ドライブと同じように通常の GNOME ユーザーで eSATA ドライブを root パスワードなしでポートに接続することができるようになります。
+
eSATA ベイや他の eSATA アダブタを接続するとシステムはディスクを内部 SATA ドライブとして認識します。[[GNOME]] や [[KDE]] はその度に root パスワードを尋ねることになります。以下の udev ルールは指定した SATA ポートを外部 eSATA ポートとして表示させます。これで、USB ドライブと同じように通常の GNOME ユーザーで eSATA ドライブを root パスワードなしでポートに接続することができるようになります。
   
 
{{hc|/etc/udev/rules.d/10-esata.rules|2=<nowiki>
 
{{hc|/etc/udev/rules.d/10-esata.rules|2=<nowiki>
176行目: 174行目:
   
 
udev は全てのモジュールを非同期にロードするので、初期化される順番は異なってしまいます。この結果デバイスの名前がランダムで変わる可能性があります。udev ルールを追加すれば固定デバイス名を使えます:
 
udev は全てのモジュールを非同期にロードするので、初期化される順番は異なってしまいます。この結果デバイスの名前がランダムで変わる可能性があります。udev ルールを追加すれば固定デバイス名を使えます:
* ブロックデバイスは [[Persistent block device naming]] を見て下さい。
+
* ブロックデバイスは[[永続的なブロックデバイスの命名]]を見て下さい。
* ネットワークデバイスは [[Network Configuration (日本語)#デバイス名]] を見て下さい。
+
* ネットワークデバイスは[[ネットワーク設定#デバイス名]]を見て下さい。
   
 
==== iscsi デバイス ====
 
==== iscsi デバイス ====
195行目: 193行目:
 
==== ビデオドライバー ====
 
==== ビデオドライバー ====
   
ウェブカメラをセットアップするなら、まず[[Webcam_Setup (日本語)#ウェブカメラ設定|ウェブカメラ設定]]を参照してください。
+
ウェブカメラをセットアップするなら、まず[[ウェブカメラ設定]]を参照してください。
   
複数のウェブカメラを使うと、例えば {{pkg|motion}} (video4linux デバイスやウェブカメラから画像を取得するソフトウェアモーション検知プログラム) を使う場合、起動時にビデオデバイスはランダムで {{ic|/dev/video0..n}} と割り当てられます。推奨される方法は udev ルールを使って ([[#udev ルールを記述する|udev ルールの記述]]にある例のようにして) シンボリックリンクを作成する方法です。
+
複数のウェブカメラを使うと、例えば {{Pkg|motion}} (video4linux デバイスやウェブカメラから画像を取得するソフトウェアモーション検知プログラム) を使う場合、起動時にビデオデバイスはランダムで {{ic|/dev/video0..n}} と割り当てられます。推奨される方法は udev ルールを使って ([[#udev ルールを記述する|udev ルールの記述]]にある例のようにして) シンボリックリンクを作成する方法です。
   
 
{{hc|/etc/udev/rules.d/83-webcam.rules|<nowiki>
 
{{hc|/etc/udev/rules.d/83-webcam.rules|<nowiki>
209行目: 207行目:
 
==== プリンター ====
 
==== プリンター ====
   
複数のプリンターを使っている場合、起動時にランダムで {{ic|/dev/lp[0-9]}} のデバイスが割り当てられ、[[CUPS (日本語)|CUPS]] の設定などを破壊してしまいます。
+
複数のプリンターを使っている場合、起動時にランダムで {{ic|/dev/lp[0-9]}} のデバイスが割り当てられ、[[CUPS]] の設定などを破壊してしまいます。
   
[[Persistent block device naming]] と同じように {{ic|/dev/lp/by-id}} と {{ic|/dev/lp/by-path}} の下にシンボリックリンクを作成する、以下のルールを作成することが可能です:
+
[[永続的なブロックデバイスの命名]]と同じように {{ic|/dev/lp/by-id}} と {{ic|/dev/lp/by-path}} の下にシンボリックリンクを作成する、以下のルールを作成することが可能です:
   
 
{{hc|/etc/udev/rules.d/60-persistent-printer.rules|<nowiki>
 
{{hc|/etc/udev/rules.d/60-persistent-printer.rules|<nowiki>
230行目: 228行目:
 
</nowiki>}}
 
</nowiki>}}
   
  +
=== USB デバイスでサスペンドから復帰 ===
=== HAL の実行 ===
 
   
  +
最初に、あなたのデバイスの製造者・製品 ID を見つけて下さい、例えば:
(Flash DRM コンテンツなど) プログラムによってはいまだ HAL が必要なものがあります。Hal は {{AUR|hal}} と {{AUR|hal-info}} からインストールできます。
 
   
  +
{{hc|# lsusb {{!}} grep Logitech|Bus 007 Device 002: ID '''046d''':'''c52b''' Logitech, Inc. Unifying Receiver}}
Systemd を使う: 以下の systemd のコマンドで hal サービスを起動・停止できます:
 
   
  +
デバイスが接続されている USB コントローラを検索するには:
HAL を起動する:
 
{{ic|# systemctl start hal.service}}
 
   
  +
{{hc|# grep ''c52b'' /sys/bus/usb/devices/*/idProduct|/sys/bus/usb/devices/'''1-1.1.1.4/'''idProduct:c52b}}
HAL を停止する:
 
{{ic|# systemctl stop hal.service}}
 
   
  +
デバイスと接続している USB コントローラの {{ic|power/wakeup}} 属性を変更してください:
または、以下のスクリプトを使うこともできます:
 
{{bc|<nowiki>
 
#!/bin/bash
 
   
  +
{{hc|/etc/udev/rules.d/50-wake-on-device.rules|2=
## written by Mark Lee <bluerider>
 
  +
ACTION=="add", SUBSYSTEM=="usb", DRIVER=="usb", ATTRS{idVendor}=="'''046d'''", ATTRS{idProduct}=="'''c52b'''", ATTR{power/wakeup}="enabled", ATTR{driver/'''1-1.1.1.4'''/power/wakeup}="enabled"}}
## using information from <https://wiki.archlinux.org/index.php/Chromium#Google_Play_.26_Flash>
 
   
  +
{{Note|{{ic|# cat /proc/acpi/wakeup}} で USB コントローラが有効にされていることも確認してください。}}
## Start and stop Hal service on command for Google Play Movie service
 
   
  +
== トラブルシューティング ==
function main () { ## run the main insertion function
 
clear-cache; ## remove adobe cache
 
start-hal; ## start the hal daemon
 
read -p "Press 'enter' to stop hal"; ## pause the command line with a read line
 
stop-hal; ## stop the hal daemon
 
}
 
   
  +
=== モジュールのブラックリスト ===
function clear-cache () { ## remove adobe cache
 
cd ~/.adobe/Flash_Player; ## go to Flash player user directory
 
rm -rf NativeCache AssetCache APSPrivateData2; ## remove cache
 
}
 
   
  +
稀に、udev が間違って誤ったモジュールをロードすることがあります。これを止めさせるために、モジュールをブラックリストに入れることができます。ブラックリスト化すれば、udev は二度とそのモジュールをロードしません。[[カーネルモジュール#ブラックリスト]]を見て下さい。起動時と hotplug のイベント時 (例: USB フラッシュドライブを入れた時) 両方です。
function start-hal () { ## start the hal daemon
 
sudo systemctl start hal.service && ( ## systemd : start hal daemon
 
echo "Started hal service..."
 
) || (
 
echo "Failed to start hal service!")
 
}
 
   
  +
=== デバッグ出力 ===
function stop-hal () { ## stop the hal daemon
 
sudo systemctl stop hal.service && ( ## systemd : stop hal daemon
 
echo "Stopped hal service..."
 
) || (
 
echo "Failed to stop hal service!"
 
)
 
}
 
   
  +
ハードウェアのデバッグ情報を取得したいときは、{{ic|1=udev.log-priority=debug}} [[カーネルパラメータ]]を使ってください。もしくは、以下を設定:
main; ## run the main insertion function
 
</nowiki>}}
 
   
  +
{{hc|/etc/udev/udev.conf|2=udev_log="debug"}}
=== USB デバイスでサスペンドから復帰 ===
 
   
  +
上記の設定ファイルを {{ic|FILES}} 行に追加することで initramfs に組み込むこともできます:
最初に、あなたのデバイスの製造者・製品 ID を見つけて下さい、例えば:
 
   
  +
{{hc|/etc/mkinitcpio.conf|2=FILES="... /etc/udev/udev.conf"}}
{{hc|<nowiki># lsusb | grep Logitech</nowiki>|Bus 007 Device 002: ID 046d:c52b Logitech, Inc. Unifying Receiver}}
 
   
  +
設定後は initramfs を再生成してください:
デバイスと接続している USB コントローラの {{ic|power/wakeup}} 属性を変更してください、ここでは {{ic|driver/usb7/power/wakeup}} になります。以下のルールを使って下さい:
 
 
{{hc|/etc/udev/rules.d/50-wake-on-device.rules|<nowiki>
 
ACTION=="add", SUBSYSTEM=="usb", ATTRS{idVendor}=="046d", ATTRS{idProduct}=="c52b", ATTR{power/wakeup}="enabled", ATTR{driver/usb7/power/wakeup}="enabled"
 
</nowiki>}}
 
 
{{Note|{{ic|/proc/acpi/wakeup}} で USB コントローラが有効にされていることも確認してください。}}
 
 
== トラブルシューティング ==
 
 
=== モジュールのブラックリスト ===
 
   
  +
# mkinitcpio -p linux
稀に、udev が間違って誤ったモジュールをロードすることがあります。これを止めさせるために、モジュールをブラックリストに入れることができます。ブラックリスト化すれば、udev は二度とそのモジュールをロードしません。[[Kernel modules (日本語)#ブラックリスト|カーネルモジュール#ブラックリスト]] を見て下さい。起動時と hotplug のイベント時 (例: USB フラッシュドライブを入れた時) 両方です。
 
   
 
=== 起動時に udevd が止まる ===
 
=== 起動時に udevd が止まる ===
340行目: 304行目:
 
これはカーネルのバグでありまだ修正されていません。
 
これはカーネルのバグでありまだ修正されていません。
   
==== リムーバルとして扱われなくてはならないデバイスがそう扱われない ====
+
==== リムーバデバイスとして扱われなくてはならないデバイスがそう扱われない ====
  +
  +
問題のデバイスのカスタム ''udev'' ルールを作成する必要があります。デバイスの定義情報を取得するために {{ic|ID_SERIAL}} または {{ic|ID_SERIAL_SHORT}} を使います ({{ic|/dev/sdb}} は必要に応じて変更してください):
  +
  +
$ udevadm info /dev/sdb | grep ID_SERIAL
  +
  +
それから {{ic|/etc/udev/rules.d/}} にルールを作成して udisks または udisks2 の変数を設定します。
  +
  +
udisks の場合、{{ic|1=UDISKS_SYSTEM_INTERNAL="0"}} を設定することでデバイスがリムーバブルとして扱われるようになり、自動マウントできるようになります (詳しくは {{man|7|udisks|url=http://manpages.ubuntu.com/manpages/trusty/man7/udisks.7.html}} を参照):
  +
  +
{{hc|/etc/udev/rules.d/50-external-myhomedisk.rules|2=
  +
ENV{ID_SERIAL_SHORT}=="''serial_number''", ENV{UDISKS_SYSTEM_INTERNAL}="0"
  +
}}
  +
  +
udisks2 の場合、{{ic|1=UDISKS_AUTO="1"}} を設定することでデバイスが自動マウントされ、{{ic|1=UDISKS_SYSTEM="0"}} を設定することでデバイスがリムーバブルとして認識されます。詳しくは {{man|8|udisks}} を参照。
  +
  +
{{hc|/etc/udev/rules.d/99-removable.rules|2=
  +
ENV{ID_SERIAL_SHORT}=="''serial_number''", ENV{UDISKS_AUTO}="1", ENV{UDISKS_SYSTEM}="0"
  +
}}
   
{{ic|UDISKS_SYSTEM_INTERNAL<nowiki>=</nowiki>0}} を設定するカスタム udev ルールを作成してください。くは、udisks の man ページを見
+
{{ic|udevadm control --reload}} ''udev'' ルールをリロードしてください。デバイスを接続すると外付けドライブとして認識れるはずです
   
 
=== 自動ロードの既知の問題 ===
 
=== 自動ロードの既知の問題 ===
362行目: 344行目:
 
バージョン 170 から、udev は CD-ROM/DVD-ROM ドライブをサポートしておらず、伝統的な IDE ドライブとして {{ic|ide_cd_mod}} モジュールを使ってロードされ {{ic|/dev/hd*}} として表示します。cdparanoia など、ハードウェアに直接アクセスするツールでは問題なくドライブを使えますが、KDE などのより高い次元のユーザースペースのプログラムにはドライブが見えなくなります。
 
バージョン 170 から、udev は CD-ROM/DVD-ROM ドライブをサポートしておらず、伝統的な IDE ドライブとして {{ic|ide_cd_mod}} モジュールを使ってロードされ {{ic|/dev/hd*}} として表示します。cdparanoia など、ハードウェアに直接アクセスするツールでは問題なくドライブを使えますが、KDE などのより高い次元のユーザースペースのプログラムにはドライブが見えなくなります。
   
  +
sr_mod など他のモジュールよりも先に ide_cd_mod モジュールがロードされる理由は、何らかの理由で initramfs で piix モジュールをロードしているなどが考えられます。その場合、{{ic|/etc/mkinitcpio.conf}} で piix を ata_piix に置き換えることができます。
A cause for the loading of the ide_cd_mod module prior to others, like sr_mod, could be e.g. that you have for some reason the module piix loaded with your initramfs. In that case you can just replace it with ata_piix in your {{ic|/etc/mkinitcpio.conf}}.
 
   
 
=== オプティカルドライブのグループ ID が "disk" に設定される ===
 
=== オプティカルドライブのグループ ID が "disk" に設定される ===
378行目: 360行目:
   
 
* [https://www.kernel.org/pub/linux/utils/kernel/hotplug/udev/udev.html Udev ホームページ]
 
* [https://www.kernel.org/pub/linux/utils/kernel/hotplug/udev/udev.html Udev ホームページ]
* [http://www.linux.com/news/hardware/peripherals/180950-udev An Introduction to Udev]
+
* [https://www.linux.com/news/hardware/peripherals/180950-udev An Introduction to Udev]
* [http://vger.kernel.org/vger-lists.html#linux-hotplug Udev mailing list information]
+
* [http://vger.kernel.org/vger-lists.html#linux-hotplug Udev メーリングリストの情報]
 
* [http://jasonwryan.com/blog/2014/01/20/udev/ Scripting with udev]
 
* [http://jasonwryan.com/blog/2014/01/20/udev/ Scripting with udev]
* [http://www.reactivated.net/writing_udev_rules.html Writing udev rules]
+
* [http://www.reactivated.net/writing_udev_rules.html udev ルールの書き方] ([http://mux03.panda64.net/docs/udevrules_ja.html 日本語訳])
  +
* [http://lfsbookja.osdn.jp/8.1-sysdja/chapter07/udev.html LFS 環境のデバイスとモジュールの扱いについて]
  +
* [https://github.com/Ventto/xpub Running GUI or accessing display variables from udev rules]

2019年9月25日 (水) 23:55時点における版

関連記事

Wikipedia の記事より:

"udev とは、Linuxカーネル 用のデバイス管理ツールである。主に /dev ディレクトリ以下のデバイスノードを管理するために利用する。以前 /dev ディレクトリの管理を担っていた devfs と、ホットスワップやファームウェアのロードなどユーザー空間におけるデバイスのアクション全てを担っていた hotplug の後継ツールである。"

udevhotplughwdetect 両方の機能を置き換えます。

Udev は並列処理を利用してカーネルモジュールをロードするため順番にモジュールをロードするのと比べ良いパフォーマンスが得られます。従ってモジュールは非同期に読み込まれます。この方法の欠点として、起動した時 udev はいつも同じ順番ではモジュールをロードしません。マシンに複数のブロックデバイスがある場合、デバイスノードの名称がランダムに変化する可能性があります。例えば、マシンに2つハードドライブが接続されている場合、ランダムで /dev/sda/dev/sdb になるかもしれません。これについては下で詳しく説明しています。

インストール

現在 Udev は systemd に含まれているため Arch Linux ではデフォルトでインストールされています。詳しくは systemd-udevd.service(8)man ページを見て下さい。

AUR には独立したフォークが存在します: eudev

udev ルールについて

Udev ルールは管理者によって書かれます。/etc/udev/rules.d/ を見て下さい、ファイルの名前は .rules で終わる必要があります。様々なパッケージに udev ルールが含まれており /usr/lib/udev/rules.d/ に保存されます。同じ名前のファイルが /usr/lib/etc に存在する場合は、/etc 内のファイルが優先されます。

udev ルールを記述する

警告: リムーバブルドライブをマウントするのに、udev ルールから mount を呼ばないで下さい。FUSE ファイルシステムの場合、Transport endpoint not connected エラーが起こります。代わりに自動マウントを適切に処理する udisks を使って下さい。

以下はウェブカメラが接続されたときにシンボリックリンク /dev/video-cam1 を作るルールの例です。まず、カメラが接続されたときデバイス /dev/video2 にロードされていることを見つけたとします。このルールを書く理由は次のブート時にデバイスが /dev/video0 など他の名前で表示される可能性があるからです。

# udevadm info -a -p $(udevadm info -q path -n /dev/video2)
Udevadm info starts with the device specified by the devpath and then
walks up the chain of parent devices. It prints for every device
found, all possible attributes in the udev rules key format.
A rule to match, can be composed by the attributes of the device
and the attributes from one single parent device.

  looking at device '/devices/pci0000:00/0000:00:04.1/usb3/3-2/3-2:1.0/video4linux/video2':
    KERNEL=="video2"
    SUBSYSTEM=="video4linux"
    ...
  looking at parent device '/devices/pci0000:00/0000:00:04.1/usb3/3-2/3-2:1.0':
    KERNELS=="3-2:1.0"
    SUBSYSTEMS=="usb"
    ...
  looking at parent device '/devices/pci0000:00/0000:00:04.1/usb3/3-2':
    KERNELS=="3-2"
    SUBSYSTEMS=="usb"
    ...
    ATTRS{idVendor}=="05a9"
    ...
    ATTRS{manufacturer}=="OmniVision Technologies, Inc."
    ATTRS{removable}=="unknown"
    ATTRS{idProduct}=="4519"
    ATTRS{bDeviceClass}=="00"
    ATTRS{product}=="USB Camera"
    ...

video4linux デバイスから KERNEL=="video2"SUBSYSTEM=="video4linux" を使います、そして usb parent SUBSYSTEMS=="usb", ATTRS{idVendor}=="05a9", ATTRS{idProduct}=="4519" から製造者・製品 ID を使ってウェブカメラをマッチさせます。

/etc/udev/rules.d/83-webcam.rules
KERNEL=="video[0-9]*", SUBSYSTEM=="video4linux", SUBSYSTEMS=="usb", \
        ATTRS{idVendor}=="05a9", ATTRS{idProduct}=="4519", SYMLINK+="video-cam1"

上の例では SYMLINK+="video-cam1" を使ってシンボリックリンクを作成していますが OWNER="john"GROUP="video" を使ってユーザーやグループを設定したり MODE="0660" を使ってパーミッションを設定することも簡単にできます。

ただし、デバイスが取り除かれた時に何かを実行するルールを書く時は、デバイスの属性にアクセス出来ないことに注意してください。この場合、プリセットのデバイス環境変数を使う必要があります。これらの環境変数を監視するには、デバイスを抜いた時に次のコマンドを実行してください:

# udevadm monitor --environment --udev

このコマンドの出力の中に、ID_VENDOR_IDID_MODEL_ID などの、前に使っていた属性 "idVendor" と "idProduct" に一致する値があるはずです。デバイスの環境変数を使うルールは以下のようになります:

/etc/udev/rules.d/83-webcam-removed.rules
ACTION=="remove", SUBSYSTEM=="usb", ENV{ID_VENDOR_ID}=="05a9", ENV{ID_MODEL_ID}=="4519", RUN+="/path/to/your/script"

デバイスの属性を一覧する

ルールを書くときに使えるデバイスの属性全てのリストを表示するには、次のコマンドを実行してください:

# udevadm info -a -n [device name]

[device name]/dev/sda/dev/ttyUSB0 などシステム上のデバイスに置き換えてください。

デバイスの名前がわからない場合は特定のシステムパスの全ての属性をリストアップすることもできます:

# udevadm info -a -p /sys/class/backlight/acpi_video0

ロードする前にルールをテストする

# udevadm test $(udevadm info -q path -n [device name]) 2>&1

このコマンドは新しいルールの全てのアクションを実行はしませんが、既存のデバイスのシンボリックリンクのルールは処理します。ロードできないときに役に立つかもしれません。また、テストしたい udev ルールのデバイスのパスを直接指定することも可能です:

# udevadm test /sys/class/backlight/acpi_video0/

新しいルールをロードする

Udev はルールファイルの変更を自動で検知するため、変更をすぐ反映させるのに udev の再起動は必要ありません。しかしながら、既に存在するデバイスでルールの自動再始動は行われません。USB デバイスなどの、ホットプラグ可能なデバイスはおそらく、新しいルールを適用するために再接続したり、少なくとも ohci-hcd と ehci-hcd カーネルモジュールをアンロード・再ロードして全ての USB ドライバーを再ロードする必要があります。

自動的にルールがリロードされない場合:

# udevadm control --reload

udev に手動で強制的にルールを適用させるには:

# udevadm trigger

Udisks

Udisks を見て下さい。

ヒントとテクニック

ファームウェアプログラマや USB 仮想 comm デバイスにアクセス

以下のルールは users グループのユーザーが AVR マイクロコントローラの USBtinyISP USB プログラマにアクセスできるように設定します:

/etc/udev/rules.d/50-usbtinyisp.rules
SUBSYSTEMS=="usb", ATTRS{idVendor}=="1781", ATTRS{idProduct}=="0c9f", GROUP="users", MODE="0660"
SUBSYSTEMS=="usb", ATTRS{idVendor}=="16c0", ATTRS{idProduct}=="0479", GROUP="users", MODE="0660"

他のデバイスを使う場合は lsusb を使ってベンダー・プロダクト ID を確認してください。

USB 挿入で実行

Udisks または devmon ラッパースクリプト を参照してください。

VGA ケーブル接続時に実行

VGA モニターケーブルが接続されたときに arandr を起動するには以下の内容の /etc/udev/rules.d/95-monitor-hotplug.rules ルールを作成します:

KERNEL=="card0", SUBSYSTEM=="drm", ENV{DISPLAY}=":0", ENV{XAUTHORITY}="/home/username/.Xauthority", RUN+="/usr/bin/arandr"

ディスプレイマネージャによっては .Xauthority がユーザーのホームディレクトリに保存されないことがあります。その場合 ENV{XAUTHORITY} を修正する必要があります。例えば GDM なら以下のようになります:

$ printenv XAUTHORITY
/run/user/1000/gdm/Xauthority

新しい eSATA ドライブの検知

eSATA ドライブを挿入しても検知されない場合、いくつか試せることがあります。eSATA を挿入したまま再起動してください。もしくは次を実行してください:

# echo 0 0 0 | tee /sys/class/scsi_host/host*/scan

または (AUR から) scsiaddAUR をインストールして次を実行してください:

# scsiadd -s

うまくいけば、あなたのドライブが /dev にあります。ドライブがない場合、次を実行しながら上のコマンドを試して何が起こっているのか確認してください:

# udevadm monitor

内部 SATA ポートを eSATA とする

eSATA ベイや他の eSATA アダブタを接続するとシステムはディスクを内部 SATA ドライブとして認識します。GNOMEKDE はその度に root パスワードを尋ねることになります。以下の udev ルールは指定した SATA ポートを外部 eSATA ポートとして表示させます。これで、USB ドライブと同じように通常の GNOME ユーザーで eSATA ドライブを root パスワードなしでポートに接続することができるようになります。

/etc/udev/rules.d/10-esata.rules
DEVPATH=="/devices/pci0000:00/0000:00:1f.2/host4/*", ENV{UDISKS_SYSTEM}="0"
ノート: eSATA ドライブを接続した後、以下のコマンドを使うことで DEVPATH がわかります (sdb は適宜置き換えてください):
# udevadm info -q path -n /dev/sdb
/devices/pci0000:00/0000:00:1f.2/host4/target4:0:0/4:0:0:0/block/sdb
# find /sys/devices/ -name sdb
/sys/devices/pci0000:00/0000:00:1f.2/host4/target4:0:0/4:0:0:0/block/sdb

固定デバイス名の設定

udev は全てのモジュールを非同期にロードするので、初期化される順番は異なってしまいます。この結果デバイスの名前がランダムで変わる可能性があります。udev ルールを追加すれば固定デバイス名を使えます:

iscsi デバイス

scsi_id からの出力をテストしてください:

# /usr/lib/udev/scsi_id --whitelisted --replace-whitespace --device=/dev/sdb
3600601607db11e0013ab5a8e371ce111
/etc/udev/rules.d/75-iscsi.rules
#The iscsi device rules.
#This will create an iscsi device for each of the targets.
KERNEL=="sd*", SUBSYSTEM=="block", \
     PROGRAM="/usr/lib/udev/scsi_id --whitelisted --replace-whitespace /dev/$name", \ RESULT=="3600601607db11e0013ab5a8e371ce111", \
     NAME="isda"

ビデオドライバー

ウェブカメラをセットアップするなら、まずウェブカメラ設定を参照してください。

複数のウェブカメラを使うと、例えば motion (video4linux デバイスやウェブカメラから画像を取得するソフトウェアモーション検知プログラム) を使う場合、起動時にビデオデバイスはランダムで /dev/video0..n と割り当てられます。推奨される方法は udev ルールを使って (udev ルールの記述にある例のようにして) シンボリックリンクを作成する方法です。

/etc/udev/rules.d/83-webcam.rules
KERNEL=="video[0-9]*", SUBSYSTEM=="video4linux", SUBSYSTEMS=="usb", ATTRS{idVendor}=="05a9", ATTRS{idProduct}=="4519", SYMLINK+="video-cam1"
KERNEL=="video[0-9]*", SUBSYSTEM=="video4linux", SUBSYSTEMS=="usb", ATTRS{idVendor}=="046d", ATTRS{idProduct}=="08f6", SYMLINK+="video-cam2"
KERNEL=="video[0-9]*", SUBSYSTEM=="video4linux", SUBSYSTEMS=="usb", ATTRS{idVendor}=="046d", ATTRS{idProduct}=="0840", SYMLINK+="video-cam3"
ノート: /dev/video* 以外の名前を使うと v4l1compat.sov4l2convert.so のプリロードが破壊されます。

プリンター

複数のプリンターを使っている場合、起動時にランダムで /dev/lp[0-9] のデバイスが割り当てられ、CUPS の設定などを破壊してしまいます。

永続的なブロックデバイスの命名と同じように /dev/lp/by-id/dev/lp/by-path の下にシンボリックリンクを作成する、以下のルールを作成することが可能です:

/etc/udev/rules.d/60-persistent-printer.rules
ACTION=="remove", GOTO="persistent_printer_end"

# This should not be necessary
#KERNEL!="lp*", GOTO="persistent_printer_end"

SUBSYSTEMS=="usb", IMPORT{builtin}="usb_id"
ENV{ID_TYPE}!="printer", GOTO="persistent_printer_end"

ENV{ID_SERIAL}=="?*", SYMLINK+="lp/by-id/$env{ID_BUS}-$env{ID_SERIAL}"

IMPORT{builtin}="path_id"
ENV{ID_PATH}=="?*", SYMLINK+="lp/by-path/$env{ID_PATH}"

LABEL="persistent_printer_end"

USB デバイスでサスペンドから復帰

最初に、あなたのデバイスの製造者・製品 ID を見つけて下さい、例えば:

# lsusb | grep Logitech
Bus 007 Device 002: ID 046d:c52b Logitech, Inc. Unifying Receiver

デバイスが接続されている USB コントローラを検索するには:

# grep c52b /sys/bus/usb/devices/*/idProduct
/sys/bus/usb/devices/1-1.1.1.4/idProduct:c52b

デバイスと接続している USB コントローラの power/wakeup 属性を変更してください:

/etc/udev/rules.d/50-wake-on-device.rules
ACTION=="add", SUBSYSTEM=="usb", DRIVER=="usb", ATTRS{idVendor}=="046d", ATTRS{idProduct}=="c52b", ATTR{power/wakeup}="enabled", ATTR{driver/1-1.1.1.4/power/wakeup}="enabled"
ノート: # cat /proc/acpi/wakeup で USB コントローラが有効にされていることも確認してください。

トラブルシューティング

モジュールのブラックリスト

稀に、udev が間違って誤ったモジュールをロードすることがあります。これを止めさせるために、モジュールをブラックリストに入れることができます。ブラックリスト化すれば、udev は二度とそのモジュールをロードしません。カーネルモジュール#ブラックリストを見て下さい。起動時と hotplug のイベント時 (例: USB フラッシュドライブを入れた時) 両方です。

デバッグ出力

ハードウェアのデバッグ情報を取得したいときは、udev.log-priority=debug カーネルパラメータを使ってください。もしくは、以下を設定:

/etc/udev/udev.conf
udev_log="debug"

上記の設定ファイルを FILES 行に追加することで initramfs に組み込むこともできます:

/etc/mkinitcpio.conf
FILES="... /etc/udev/udev.conf"

設定後は initramfs を再生成してください:

# mkinitcpio -p linux

起動時に udevd が止まる

LDAP に移行したり LDAP を使っているシステムを更新した後 udevd が起動時 "Starting UDev Daemon" というメッセージを出したときに止まることがあります。これは通常 udevd が LDAP にある名前を検索しようとして、ネットワークがまだ立ち上がっておらず、失敗していることが原因です。解決方法は全てのシステムグループの名前をローカルで存在させることです。

udev ルールで記述されているグループ名とシステム上にあるグループ名を抽出してください:

# fgrep -r GROUP /etc/udev/rules.d/ /usr/lib/udev/rules.d | perl -nle '/GROUP\s*=\s*"(.*?)"/ && print $1;' | sort | uniq > udev_groups
# cut -f1 -d: /etc/gshadow /etc/group | sort | uniq > present_groups

違いを確認するために、side-by-side の diff を実行してください:

# diff -y present_groups udev_groups
...
network							      <
nobody							      <
ntp							      <
optical								optical
power							      |	pcscd
rfkill							      <
root								root
scanner								scanner
smmsp							      <
storage								storage
...

この場合、何らかの理由で pcscd グループがシステム上に存在しません。欠けているグループを追加してください:

# groupadd pcscd

また、LDAP に頼る前にローカルリソースが検索されるようにしてください。/etc/nsswitch.conf に次の行を含める必要があります:

group: files ldap

ハードウェアの既知の問題

BusLogic デバイスが壊れて起動中にフリーズする

これはカーネルのバグでありまだ修正されていません。

リムーバブルデバイスとして扱われなくてはならないデバイスがそう扱われない

問題のデバイスのカスタム udev ルールを作成する必要があります。デバイスの定義情報を取得するために ID_SERIAL または ID_SERIAL_SHORT を使います (/dev/sdb は必要に応じて変更してください):

$ udevadm info /dev/sdb | grep ID_SERIAL

それから /etc/udev/rules.d/ にルールを作成して udisks または udisks2 の変数を設定します。

udisks の場合、UDISKS_SYSTEM_INTERNAL="0" を設定することでデバイスがリムーバブルとして扱われるようになり、自動マウントできるようになります (詳しくは udisks(7) を参照):

/etc/udev/rules.d/50-external-myhomedisk.rules
ENV{ID_SERIAL_SHORT}=="serial_number", ENV{UDISKS_SYSTEM_INTERNAL}="0"

udisks2 の場合、UDISKS_AUTO="1" を設定することでデバイスが自動マウントされ、UDISKS_SYSTEM="0" を設定することでデバイスがリムーバブルとして認識されます。詳しくは udisks(8) を参照。

/etc/udev/rules.d/99-removable.rules
ENV{ID_SERIAL_SHORT}=="serial_number", ENV{UDISKS_AUTO}="1", ENV{UDISKS_SYSTEM}="0"

udevadm control --reloadudev ルールをリロードしてください。デバイスを接続すると外付けドライブとして認識されるはずです。

自動ロードの既知の問題

モジュールが自動でロードされないサウンドの問題

/etc/modprobe.d/sound.conf 内の古いエントリによって問題が起こる場合があります。このファイルを手入れして、それから再度試して下さい。

ノート: udev>=171 から、デフォルトで OSS エミュレーションモジュール (snd_seq_oss, snd_pcm_oss, snd_mixer_oss) は自動でロードされなくなりました。

カスタムカーネルの既知の問題

Udev が全く起動しない

あなたのカーネルバージョンが 2.6.32 以上であることを確認してください。それ以前のカーネルでは udev が自動ロードをするのに必要な uevent をサポートしていません。

IDE CD/DVD ドライブサポート

バージョン 170 から、udev は CD-ROM/DVD-ROM ドライブをサポートしておらず、伝統的な IDE ドライブとして ide_cd_mod モジュールを使ってロードされ /dev/hd* として表示します。cdparanoia など、ハードウェアに直接アクセスするツールでは問題なくドライブを使えますが、KDE などのより高い次元のユーザースペースのプログラムにはドライブが見えなくなります。

sr_mod など他のモジュールよりも先に ide_cd_mod モジュールがロードされる理由は、何らかの理由で initramfs で piix モジュールをロードしているなどが考えられます。その場合、/etc/mkinitcpio.conf で piix を ata_piix に置き換えることができます。

オプティカルドライブのグループ ID が "disk" に設定される

オプティカルドライブのグループ ID が disk に設定されていて、それを optical に設定したい場合、カスタム udev ルールを作成する必要があります:

/etc/udev/rules.d
# permissions for IDE CD devices
SUBSYSTEMS=="ide", KERNEL=="hd[a-z]", ATTR{removable}=="1", ATTRS{media}=="cdrom*", GROUP="optical"

# permissions for SCSI CD devices
SUBSYSTEMS=="scsi", KERNEL=="s[rg][0-9]*", ATTRS{type}=="5", GROUP="optical"

参照