Geek-Side

<< < 1 > >>

udevでAuto Mount


USBカードリーダーにSDカードを刺すたびに、mountコマンドを打つのが億劫なので、
udevでAuto Mountするように設定してみました。

他のディストリビューションなら、そういうところまで整備されてるんでしょうけど、
未整備が故に色々調べれるのもGentooのいいところですね。

udevは "userspace device management" の略で、kernelが検出したデバイスに対してデバイスファイルを割り当てる仕組みです。
/sys/classを検索してdevファイルを探し、/devに対応するデバイスファイルを生成します。

私の環境では下記のudev関連のdaemonが動いていました。

root      2120     1  0 15:33 ?        00:00:00 /usr/lib/systemd/systemd-udevd --daemon

このdaemonはデバイスが追加されたり取り除かれたりした際のイベント、ueventをkernelから直接受け取ります。
この様子はudevadmコマンドで見ることができます。

# kernelとudevイベントをモニター
$ udevadm monitor
monitor will print the received events for:
UDEV - the event which udev sends out after rule processing
KERNEL - the kernel uevent

KERNEL[152621.041326] change   /devices/pci0000:00/0000:00:12.0/usb3/3-2/3-2.4/3-2.4:1.0/host7/target7:0:0/7:0:0:0/block/sdc (block)
KERNEL[152621.055301] change   /devices/pci0000:00/0000:00:12.0/usb3/3-2/3-2.4/3-2.4:1.0/host7/target7:0:0/7:0:0:0/block/sdc (block)
KERNEL[152621.065291] change   /devices/pci0000:00/0000:00:12.0/usb3/3-2/3-2.4/3-2.4:1.0/host7/target7:0:0/7:0:0:0/block/sdc (block)
UDEV  [152621.900706] change   /devices/pci0000:00/0000:00:12.0/usb3/3-2/3-2.4/3-2.4:1.0/host7/target7:0:0/7:0:0:0/block/sdc (block)
UDEV  [152621.913050] change   /devices/pci0000:00/0000:00:12.0/usb3/3-2/3-2.4/3-2.4:1.0/host7/target7:0:0/7:0:0:0/block/sdc (block)
UDEV  [152621.924742] change   /devices/pci0000:00/0000:00:12.0/usb3/3-2/3-2.4/3-2.4:1.0/host7/target7:0:0/7:0:0:0/block/sdc (block)
KERNEL[152626.399018] change   /devices/pci0000:00/0000:00:12.0/usb3/3-2/3-2.4/3-2.4:1.0/host7/target7:0:0/7:0:0:0/block/sdc (block)
UDEV  [152626.429341] change   /devices/pci0000:00/0000:00:12.0/usb3/3-2/3-2.4/3-2.4:1.0/host7/target7:0:0/7:0:0:0/block/sdc (block)

さて、SDカードを挿すと /dev/sdc1 にデバイスファイルが作成されました。
/dev/sdc1の情報を udevadmで調査します。

# USBをさして/dev/sdc1にマッピングされた時、/dev/sdc1の情報を取得する
sudo udevadm info --query=all --name=/dev/sdc1
.
.
.
E: ID_PATH=pci-0000:00:12.0-usb-0:2.4:1.0-scsi-0:0:0:0
E: ID_PATH_TAG=pci-0000_00_12_0-usb-0_2_4_1_0-scsi-0_0_0_0
E: ID_REVISION=1.00
E: ID_SERIAL=Multiple_Card_Reader_058F63666438-0:0
E: ID_SERIAL_SHORT=058F63666438
E: ID_TYPE=disk
E: ID_USB_DRIVER=usb-storage
E: ID_USB_INTERFACES=:080650:
E: ID_USB_INTERFACE_NUM=00
E: ID_VENDOR=Multiple
E: ID_VENDOR_ENC=Multiple
E: ID_VENDOR_ID=058f
E: MAJOR=8
E: MINOR=33
E: SUBSYSTEM=block
E: USEC_INITIALIZED=218061

ルールファイルを作成します。/etc/udev/rules.d/99-local.rulesです。

# start at sdb to ignore the system hard drive  
KERNEL!="sd[c-z][1-9]", GOTO="exit"  
# flash card
ENV{ID_VENDOR_ID}=="058f", GOTO="mount"
# USB Storage
ENV{ID_VENDOR_ID}=="13fe", GOTO="mount"

LABEL="mount"
ENV{ID_FS_LABEL}!="", ENV{dir_name}="%E{ID_FS_LABEL}"  
ENV{ID_FS_LABEL}=="", ENV{dir_name}="flash_drive_%k"  

ACTION=="add", RUN+="/bin/mkdir -p '/media/%E{dir_name}'" 

# filesystem-specific mount options (777/666 dir/file perms for vfat) 
ACTION=="add",ENV{mount_options_vfat}="gid=100,dmask=000,fmask=111,utf8,flush,rw,noatime,users"

# mount device  
ACTION=="add", ENV{ID_FS_TYPE}=="vfat", RUN+="/bin/mount -t auto -o %E{mount_options_vfat} /dev/%k '/media/%E{dir_name}'"  

# exit  
LABEL="exit

作ったルールをテストしてみます。

# ルールをテストする
udevadm test $(udevadm info -q path -n /dev/sdc1)
.
.
.
ID_VENDOR=Multiple
ID_VENDOR_ENC=Multiple
ID_VENDOR_ID=058f
MAJOR=8
MINOR=33
SUBSYSTEM=block
USEC_INITIALIZED=218061
dir_name=Eye-Fi
mount_options_vfat=gid=100,dmask=000,fmask=111,utf8,flush,rw,noatime,users
run: '/bin/mkdir -p '/media/Eye-Fi''
run: '/bin/mount -t auto -o gid=100,dmask=000,fmask=111,utf8,flush,rw,noatime,users /dev/sdc1 '/media/Eye-Fi''
unload module index
Unloaded link configuration context.

/media/Eye-Fi にmountされました。