私の環境は Vine Linux 2.5CR、kernel 2.4.18、ホットプラグマネージャとしてmurasaki 0.5.4 を使っています。この文書は、その環境で、USB ストレージ機器を接続したときに、自動で認識してマウントする方法について解説します。
purple(Linux PC) | (の)が常用しているマシン。Vine Linux 2.5CR、kernel 2.4.18、murasaki 0.5.4 |
デジカメ C-2040 | オリンパスのデジカメ。デジカメとPCをUSBケーブルで接続すると、デジカメは、汎用のUSBストレージデバイスとして認識されます。Vendor ID = 0x7b4、Product ID=0x105 |
ポータブルハードディスク | IOデータの HDP-U40P という製品です。USB 2.0 & 1.1 で 40GB のハードディスクとして使えます。バスパワーで駆動でき、2.5inch タイプの小型のものです。Vendor ID = 0x4bb、Product ID=0x103 |
デジカメをつないだ時は /mnt/C2040 に、ポータブルHDDをつないだ時は /mnt/USB_HD に自動でマウントしたい。
murasaki を導入したマシンに USB ストレージデバイスを接続すると次のことが怒ります。
usb-storage: /etc/murasaki/bin/mount-usb-storage2.sh
$ cat /proc/scsi/scsi Attached devices: Host: scsi0 Channel: 00 Id: 00 Lun: 00 Vendor: CREATIVE Model: CD-RW RW4224E Rev: 1.36 Type: CD-ROM ANSI SCSI revision: 02 Host: scsi1 Channel: 00 Id: 00 Lun: 00 Vendor: OLYMPUS Model: C-2040ZOOM Rev: 1.00 Type: Direct-Access ANSI SCSI revision: 02 Host: scsi2 Channel: 00 Id: 00 Lun: 00 Vendor: IC25N040 Model: ATCS04-0 Rev: CA4O Type: Direct-Access ANSI SCSI revision: 02 You have mail in /var/spool/mail/nkon
3つのファイルを製作します。
次の行を含めておいて下さい。
usb-storage: /etc/murasaki/bin/mount-usb-storage2.sh
今回製作する mount-usb-storage2.sh が参照するデータベースファイルです。/etc/murasaki/bin/ ディレクトリは、新規作成しなければならない場合が多いでしょう。
お使いのUSBストレージ機器の情報を書き込みます。スペース区切りです。
1カラム目から「ベンダ ID」「プロダクトID」「マウントポイント」「ファイルシステム」「キーワード」「コメント」です。
私の場合は、次のようになります。もうじき、IO-DATA のポータブルHDDを ext3 でフォーマットしなおそうと思ってます。
# vendor product mountpoint fstype keyword comment 0x4bb 0x103 /mnt/USB_HD vfat ATCS04-0 IO-DATA HDP-U40P portable USB HDD 0x7b4 0x105 /mnt/C2040 vfat C-2040ZOOM Olympus C-2040Zoom Digital Camera
murasaki.call によって呼ばれるスクリプトです。今接続されたUSB機器のベンダID、プロダクトID から usb-storage-mountpoint データベースを検索して、それを希望のマウントポイントにマウントします。そのために、USB機器の SCSI デバイスファイルも検索します。
このスクリプトは実行属性をつけておく必要があります。
ただし、私の環境にべったりと依存しています。デバイスファイルなどは適切に振替える必要があります。
例えば、SCSI のホスト番号からデバイスファイルを検索する所、私の環境では Host0 に、常に ATAPI CD-R が接続されているので(上記参照) Host1 に接続されているUSBストレージが sda になります。
シェルスクリプト、sed スクリプトも、今日はじめて書いたので、不十分な所が多々あるでしょう。
#!/bin/sh CONFIG_FILE=/etc/murasaki/bin/usb-storage-mountpoint LOG_MESSAGE_FILE=/var/log/messages WORK_FILE=/etc/murasaki/bin/work ######################################### # find now conected device ######################################### if [ -f ${LOG_MESSAGE_FILE} ] ; then tac ${LOG_MESSAGE_FILE} | [行継続] grep 'murasaki\.usb\[[0123456789]\+\]:[行継続] vendor:[0123456789abcdefx]\+ product:[行継続] [0123456789abcdefx]\+ ' > ${WORK_FILE} read -a a_line < ${WORK_FILE} fi rm -f ${WORK_FILE} VENDOR=${a_line[5]} PRODUCT=${a_line[6]} VENDOR=${VENDOR/vendor:/} PRODUCT=${PRODUCT/product:/} # echo my vendor is ${VENDOR} and my product is ${PRODUCT} ######################################### # look up mount database ######################################### if [ -f ${CONFIG_FILE} ] ; then grep "${VENDOR} ${PRODUCT}" ${CONFIG_FILE} > ${WORK_FILE} read m_vendor m_product m_mountpoint m_fstype [行継続] m_keyword m_comment < ${WORK_FILE} fi rm -f ${WORK_FILE} # echo vendor is ${m_vendor} product is ${m_product} [行継続] mount point is ${m_mountpoint} fs_type is ${m_fstype} [行継続] keyword is ${m_keyword} comment is ${m_comment} ######################################### # find device file ######################################### rm -f ${WORK_FILE} /bin/sed ' /^Host/N s/\n// p D ' /proc/scsi/scsi | grep ${m_keyword} >> ${WORK_FILE} read -a a_line < ${WORK_FILE} case ${a_line[1]} in scsi1) DEVICE_FILE=sda1 ;; scsi2) DEVICE_FILE=sdb1 ;; esac rm -f ${WORK_FILE} # echo my device file is ${DEVICE_FILE} case $1 in start) /bin/mount -t $m_fstype /dev/${DEVICE_FILE} ${m_mountpoint} ;; stop) /bin/umount ${m_mountpoint} ;; esac
これで、繋げば、希望するマウントポイントにマウントされるかもしれません。