Sirius -旧ブログ、更新されません-

2010年12月13日(月) 22:19

udev を使って USB メモリをマウントする。

USB メモリの自動マウント・アンマウントを実現させます。

まず、USB メモリをさすと、デバイスファイルができるのでそれを使って情報を取得します。



$ udevadm info -a -p $(udevadm info -q path -n /dev/sdb)

デバイスのシリアルを探します。場合によっては、manufacturer と product でも良いのですが、私は同じデバイスを複数使っていたりするので、確実に認識するようにシリアルを使います。

例えば、PQI の 16GB のメモリの場合、次のようになりました。※

looking at parent device '/devices/pci0000:00/0000:00:0e.1/usb2/2-1/2-1.2':

KERNELS=="2-1.2"

SUBSYSTEMS=="usb"

DRIVERS=="usb"

ATTRS{configuration}==""

ATTRS{bNumInterfaces}==" 1"

ATTRS{bConfigurationValue}=="1"

ATTRS{bmAttributes}=="80"

ATTRS{bMaxPower}==" 98mA"

ATTRS{urbnum}=="452426"

ATTRS{idVendor}=="3538"

ATTRS{idProduct}=="0901"

ATTRS{bcdDevice}=="0100"

ATTRS{bDeviceClass}=="00"

ATTRS{bDeviceSubClass}=="00"

ATTRS{bDeviceProtocol}=="00"

ATTRS{bNumConfigurations}=="1"

ATTRS{bMaxPacketSize0}=="64"

ATTRS{speed}=="12"

ATTRS{busnum}=="2"

ATTRS{devnum}=="4"

ATTRS{version}==" 2.00"

ATTRS{maxchild}=="0"

ATTRS{quirks}=="0x0"

ATTRS{authorized}=="1"

ATTRS{manufacturer}=="PQI"

ATTRS{product}=="PQI USB Flash Drive"

ATTRS{serial}=="01ACxxxxxxxxxx"



この "01ACxxxxxxxxxx"を使い、udev のルールを作成します。

ルールは、/etc/udev/rules.d の下に作成します。私は、99-local.rules にしました。



---------------------------------ここから-------------------------------

# USB Flash

KERNEL!="sd*", GOTO="USBmemory_auto_mount_end"



# default options

KERNEL=="sd*", ENV{mount_point}="%k", \

IMPORT{program}="/sbin/blkid -o udev -p %N"

KERNEL=="sd*", ENV{ID_FS_LABEL}!="", \

ENV{mount_point}="$env{ID_FS_LABEL}-%k"

# Add

ACTION=="add", SYMLINK="usb_%k", ENV{mount_options}="relatime"

ACTION=="add", ENV{ID_FS_TYPE}=="vfat|ntfs", \

ENV{mount_options}="$env{mount_options},utf8"

# Remove



# PQI 16GB(Music)

KERNEL=="sd?1", ENV{ID_FS_UUID}=="943E-C47E", \

ENV{mount_point}="usbmusic"

KERNEL=="sd?1", ATTRS{serial}=="01ACxxxxxxxxxx", \

ENV{mount_point}="usbmusic"

KERNEL=="sd?1", ATTRS{serial}=="01ACxxxxxxxxxx", \

ACTION=="add", SYMLINK+="$env{mount_point}%n"



# general mount

KERNEL=="sd*" ACTION=="add", ENV{mount_point}!="", \

RUN+="/bin/mkdir /media/$env{mount_point}", \

RUN+="/bin/mount -o $env{mount_options} /dev/%k /media/$env{mount_point}"



# general unmount

KERNEL=="sd*", ACTION=="remove", ENV{mount_point}!="", \

RUN+="/bin/umount -l /dev/%k", \

RUN+="/bin/rmdir /media/$env{mount_point}"



LABEL="USBmemory_auto_mount_end"

---------------------------------ここまで-------------------------------



はじめにデバイスが sd でない場合は、USBmemory_auto_mount_end まで飛びます。

次にデフォルトの設定をしています。

マウントポイントのデフォルトを定義します。

まず、マウントポイントのデフォルトはデバイス名(%k)にしておきます。ここで blkid コマンドを利用してデバイスのパラメータを環境変数に設定します。環境変数を見てラベルが設定されていたら、マウントポイントを "ラベル名-デバイス名" に設定します。



blkid コマンドでデバイスを指定すると次のような出力が得られます。

$ /sbin/blkid -o udev -p /dev/sdb1

ID_FS_LABEL=PQIUSB16GB

ID_FS_LABEL_ENC=PQIUSB16GB

ID_FS_UUID=943E-C47E

ID_FS_UUID_ENC=943E-C47E

ID_FS_VERSION=FAT32

ID_FS_TYPE=vfat

ID_FS_USAGE=filesystem



次にデバイスが追加されたときにデバイスファイルへのシンボリックリンクを作成してマウントオプションのデフォルトを設定します。

ファイルシステムが vfat か ntfs の場合はさらに、エンコードを utf8 にします。

今回はデバイスが取り外されたときのデフォルトオプションはありません。



次にデバイスごとのオプションを指定していきます。

ここでは PQI の USB メモリを個別に設定します。マウントポイントとシンボリックリンクの作成を設定します。

シリアルを使って設定しますが、なぜかデバイスの追加は OK ですが、取り外しのときはシリアルが使えないようなので UUID も併用しています。



最後にデバイスが追加されたときの動作と、取り外されたときの動作を設定します。どちらもマウントポイントが決まっている場合のみ定義します。

デバイスが追加されたときは、マウントポイントを /media の下に作成し、マウントします。

デバイスが取り外されたときは、アンマウントして、マウントポイントを削除します。





ファイルを変更すると即座に udev が読み込みしなおすようです。設定ファイルを修正するだけで大丈夫です。



USB メモリをさすと、/media の下のマウントポイントにマウントされ、抜くとアンマウントされました。

SD-USB 変換のアダプタを利用して SD がマウントされることも確認しました。



※この PQI のメモリは、購入時点ではパーティションをきらずにフォーマットされていました。マウントするデバイスは /dev/sdb といった感じでパーティションを指定するのではなく、デバイスそのものを指定してマウントするタイプです。例では、再フォーマットしたものを使っているので、普通どおりパーティションを作成しています。

written by sirius [玄箱] [この記事のURL] [コメントを書く] [コメント(0)] [TB(0)]

この記事へのトラックバックPingURL

Comments

TrackBacks

Sirius -旧ブログ、更新されません-

MySketch 2.7.2 written by 夕雨