Linuxでは各種デバイス(HDDとか)はデバイスファイル(/dev下にあるファイル)として存在し、各種デバイスをファイルとして扱うことができる。(このファイルのどうやって扱うのかは、デバイスドライバによって定義されている。)このデバイスファイルを操作することで、ユーザー空間からカーネル空間にあるデバイスを操作できる。
このデバイスファイルはudevというデーモンが管理している。udevが常に監視しており、デバイスが接続されたら/devの下に登録する。このudevの動きと使い方についてまとめる。
動作
ひとまず、udevの動作を見てみる。USBメモリを指してみてudevデーモンのログを見てみる。
$ systemctl status -l udev ● systemd-udevd.service - udev Kernel Device Manager ~~~~ 3月 30 23:44:59 ZV mtp-probe[26105]: checking bus 2, device 6: "/sys/devices/pci0000:00/0000:00:14.0/usb2/2-4" 3月 30 23:44:59 ZV mtp-probe[26105]: bus: 2, device: 6 was not an MTP device 3月 30 23:44:59 ZV mtp-probe[26108]: checking bus 2, device 6: "/sys/devices/pci0000:00/0000:00:14.0/usb2/2-4" 3月 30 23:44:59 ZV mtp-probe[26108]: bus: 2, device: 6 was not an MTP device
USBにデバイスが検出されている。そしてこのUSBは/dev/sddというファイルとして登録されていた。
デバイスファイル
先程のUSBは/dev/sddという名前であったが、USBが複数あったりすると/dev/sdfとかに名前が変わってしまう。これではいろいろと面倒が生じるので、固有情報によってデバイスファイルを固定させる。udevは下にある命名規則等がかかれたファイルに基づいて、デバイスファイルを生成している。
- /lib/udev/rules.d/
- デフォルトのルールが記載されている場所。
- /etc/udev/rules.d/
- ユーザー定義のルールを記載する場所。
自分の環境のUSBメモリの命名規則の記載したファイルは60-persistent-storage.rulesであった。中身のUSBメモリの命名規則場所は以下のようになっている。
# Fall back usb_id for USB devices KERNEL=="sd*[!0-9]|sr*", ENV{ID_SERIAL}!="?*", SUBSYSTEMS=="usb", IMPORT{builtin}="usb_id"