アクセス権の変更
udevでルールを記述する場合の代表的な例がアクセス権限の変更です。
USBなどのデバイスをホットプラグしたものの,
たとえばUSBシリアルコンソールデバイスを接続したときを考えてみましょう。一般的なUSBシリアルコンソールデバイスなら接続すると同時に
$ ls -l /dev/ttyUSB0 crw-rw---- 1 root dialout 188, 0 2月 3 19:48 /dev/ttyUSB0
そして一般ユーザーは,
$ sudo adduser $USER dialout
ちなみにグループ変更の設定を反映するためには,
さて,
ACTION=="remove", GOTO="serial_end"
SUBSYSTEM!="tty", GOTO="serial_end"
SUBSYSTEMS=="usb", IMPORT{builtin}="usb_id", IMPORT{builtin}="hwdb --subsystem=usb"
SUBSYSTEMS=="usb-serial", ENV{.ID_PORT}="$attr{port_number}"
SUBSYSTEMS=="usb", ENV{ID_USB_INTERFACE_NUM}="$attr{bInterfaceNumber}"
LABEL="serial_end"
最初の2行からこのルールは切断されたとき以外でなおかつサブシステムがttyのときのみ適用されることがわかります。またusbサブシステムやusb-serialサブシステムの下に接続されている場合は,
ポイントはIMPORT{builtin}
」
hwdbはもう少し複雑です。実はシステム上には
ちなみに次のようにsysfs上のパスを指定することで,
$ udevadm test-builtin usb_id /sys/class/tty/ttyUSB0 calling: test-builtin Load module index Parsed configuration file /lib/systemd/network/99-default.link Created link configuration context. /sys/devices/pci0000:00/0000:00:14.0/usb3/3-1/3-1:1.0: if_class 255 protocol 0 ID_VENDOR=FTDI ID_VENDOR_ENC=FTDI ID_VENDOR_ID=0403 ID_MODEL=TTL232R-3V3 ID_MODEL_ENC=TTL232R-3V3 ID_MODEL_ID=6001 ID_REVISION=0600 ID_SERIAL=FTDI_TTL232R-3V3_FTGC0U6E ID_SERIAL_SHORT=FTGC0U6E ID_TYPE=generic ID_BUS=usb ID_USB_INTERFACES=:ffffff: ID_USB_INTERFACE_NUM=00 ID_USB_DRIVER=ftdi_sio Unload module index Unloaded link configuration context.
さてシリアルコンソールデバイスに関する諸々の設定は
- OWNER:所有者の設定
- GROUP:所有グループの設定
- MODE:パーミッションの設定
上記3つをどう設定するかはケースバイケースでしょう。よく例としてあがるのが,
そういえば前に出力していた/dev/
SUBSYSTEM=="tty", KERNEL=="ptmx", GROUP="tty", MODE="0666"
SUBSYSTEM=="tty", KERNEL=="tty", GROUP="tty", MODE="0666"
SUBSYSTEM=="tty", KERNEL=="tty[0-9]*", GROUP="tty", MODE="0620"
SUBSYSTEM=="tty", KERNEL=="sclp_line[0-9]*", GROUP="tty", MODE="0620"
SUBSYSTEM=="tty", KERNEL=="ttysclp[0-9]*", GROUP="tty", MODE="0620"
SUBSYSTEM=="tty", KERNEL=="3270/tty[0-9]*", GROUP="tty", MODE="0620"
SUBSYSTEM=="vc", KERNEL=="vcs*|vcsa*", GROUP="tty"
KERNEL=="tty[A-Z]*[0-9]|ttymxc[0-9]*|pppox[0-9]*|ircomm[0-9]*|noz[0-9]*|rfcomm[0-9]*", GROUP="dialout"
この最後の行が効いていたために,
- ※3
- あまり良い例ではありません。本当は
「0600」 なものを 「0660」 にするような設定を例示したかったのですが手元に良いデバイスがありませんでした。
設定例はいくつかあります。まずシンプルにカーネル上のファイル名に合わせて一括変換する方法です。
ACTION=="remove", GOTO="serial_end"
SUBSYSTEM!="tty", GOTO="serial_end"
KERNEL=="ttyUSB[0-9]*", MODE="0666"
LABEL="serial_end"
ttyUSBxすべてではなく,
ACTION=="remove", GOTO="serial_end"
SUBSYSTEM!="tty", GOTO="serial_end"
ENV{ID_VENDOR_ID}=="0403", ENV{ID_MODEL_ID}=="6001", MODE="0666"
LABEL="serial_end"
上記ではベンダーIDとモデルIDで絞っています。これらの値はたとえばlsusbなどで確認できます。
$ lsusb (中略) Bus 003 Device 004: ID 0403:6001 Future Technology Devices International, Ltd FT232 USB-Serial (UART) IC
FTDIのチップが載った一般的なUSBシリアルコンソールケーブルです。ルールを追加したら,
$ sudo udevadm control --reload
さらにUSBシリアルコンソールを接続し直しましょう。
$ ls -l /dev/ttyUSB0 crw-rw-rw- 1 root dialout 188, 0 2月 3 20:11 /dev/ttyUSB0
これでシリアルコンソールを使うために,