家庭コンピュータ環境の模索 >Linux にUSBストレージクラスを接続する
最終更新 (2001/08/25)

Linux にUSBストレージクラスを接続する。

私の環境は Vine Linux 2.5CR、kernel 2.4.18、ホットプラグマネージャとしてmurasaki 0.5.4 を使っています。この文書は、その環境で、USB ストレージ機器を接続したときに、自動で認識してマウントする方法について解説します。

Equipment(使用機器)

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 ストレージデバイスを接続すると次のことが怒ります。

自動マウントスクリプトの製作

3つのファイルを製作します。

/etc/murasaki/murasaki.call

次の行を含めておいて下さい。

usb-storage: /etc/murasaki/bin/mount-usb-storage2.sh

/etc/murasaki/bin/usb-storage-mountpoint

今回製作する mount-usb-storage2.sh が参照するデータベースファイルです。/etc/murasaki/bin/ ディレクトリは、新規作成しなければならない場合が多いでしょう。

お使いのUSBストレージ機器の情報を書き込みます。スペース区切りです。
1カラム目から「ベンダ ID」「プロダクトID」「マウントポイント」「ファイルシステム」「キーワード」「コメント」です。

ベンダID、プロダクト ID
機器を接続したあと、/proc/bus/usb の下のファイルや、/var/log/message に出てます。
マウントポイント
そのストレージ機器をマウントしたいマウントポイントです。当然、マウントポイントは作成しておく必要があります。
ファイルシステム
そのストレージ機器のファイルシステムです。
キーワード
その製品のSCSIのキーワードを書きます。/proc/scsi/scsi を見たときのモデル名でよいでしょう。
コメント
自由にコメントを書きます。ただし、コメント以外は空白を含めてはいけません。

私の場合は、次のようになります。もうじき、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

/etc/murasaki/bin/mount-usb-storage2.sh

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


これで、繋げば、希望するマウントポイントにマウントされるかもしれません。



近藤靖浩