2007年12月 2日

[plamo:28669] Re: Plamo 4.22 (10/15 Ver.)で USBストレージが自動検出来ない


From: KOJIMA Mitsuhiro <kojima@xxxxx>
Subject: [plamo:28659] Re: Plamo 4.22 (10/15 Ver.) で USB ストレージが自動検出来ない
Date: Fri, 30 Nov 2007 09:28:37 +0900 (JST)

> 詳しくは調べてないけど,デスクトップ環境に依存せず udev rules のレベル
> で頑張るのが一番汎用的になるんじゃないかな?
>

> USB なり,フラッシュなりが挿された時に sysfs 経由でどういう情報が飛んで
> くるかがわかれば,udevd がそれに応じた操作をするようなシェルスクリプト
> を起動するみたいなこともできたと思うので.

少し調べてみました.元ネタは http://gentoo-wiki.com/UDEV のあたり.

1) /etc/udev/rules.d/50-udev.rules に

# mount block device when added
SUBSYSTEM=="block", ACTION=="add", RUN+="/usr/local/bin/mount-device.sh /dev/%k"
SUBSYSTEM=="block", ACTION=="remove", RUN+="/bin/umount /dev/%k"

という記述を追加して udevcontrol reload_rules を実行

2) /usr/local/bin/mount-device.sh として以下のようなスクリプトを用意

---------------------
#!/bin/sh

DEVICE="$1"
GID=`grep plugdev /etc/group | cut -d: -f 3`

if [ "$DEVICE" = "" ] ; then exit 1 ; fi

# wait a moment till' hal has information about the device
sleep 2

HAL_UDI=`hal-find-by-property --key block.device --string "$DEVICE"`

function get_hal_label {
CUR_UDI=$1
LABEL=""
COUNTER=0;
while [ -z "$LABEL" -a $COUNTER -lt 4 ]; do
LABEL=`hal-get-property --key volume.label --udi "$CUR_UDI" 2>/dev/null`
if [ -z "$LABEL" ]; then
LABEL=`hal-get-property --key storage.serial --udi "$CUR_UDI" 2>/dev/null`
fi
CUR_UDI=`hal-get-property --key info.parent --udi "$CUR_UDI" 2>/dev/null`
let COUNTER=COUNTER+1
done

if [ -z $LABEL ]; then
LABEL=${DEVICE##/dev/}
fi
}

function get_hal_removable {
CUR_UDI=$1
REMOVABLE=""
COUNTER=0
while [ -z "$REMOVABLE" -a $COUNTER -lt 4 ]; do
REMOVABLE=`hal-get-property --key storage.removable --udi "$CUR_UDI" 2>/dev/null`
if [ -z "$REMOVABLE" ]; then
BUS=`hal-get-property --key storage.bus --udi "$CUR_UDI" 2>/dev/null`
if [ "$BUS" = "usb" ]; then
REMOVABLE="true"
fi
fi
CUR_UDI=`hal-get-property --key info.parent --udi "$CUR_UDI" 2>/dev/null`
let COUNTER=COUNTER+1
done

if [ -z "$REMOVABLE" ]; then
logger "assuming $HAL_UDI is removable for safety reasons"
REMOVABLE="true"
fi
}

if [ -z "$HAL_UDI" ]; then # can't find device in hal db
logger "hald didn't know about $DEVICE"
LABEL=${DEVICE##/dev/}
else # device found in hal db.
get_hal_label "$HAL_UDI"
get_hal_removable "$HAL_UDI"
fi

logger "Mounting HAL_UDI $HAL_UDI as $DEVICE to $LABEL (removable: $REMOVABLE)"

SYNC_OPT=""

if [ $REMOVABLE = "true" ]; then
SYNC_OPT="--sync"
fi

#pmount --umask 007 $SYNC_OPT "$DEVICE" "$LABEL"

# if you do not want to use pmount (why should you?)
MOUNTPOINT=/media/${LABEL}
mkdir -p "$MOUNTPOINT" &&
touch "$MOUNTPOINT"/.created_by_pmount &&
mount "$DEVICE" "$MOUNTPOINT" -o uid=1000,gid=100,umask=007 ||
rm "$MOUNTPOINT"/.created_by_pmount &&
rmdir "$MOUNTPOINT"

--------------

一応,これぐらいで,USB なメモリを挿せば自動的に /media/sdc1 等にマウン
トしてくれる模様.ただ,HAL との連携がうまくいっていないようで GNOME の
デスクトップに自動的にアイコンが出てくる,みたいなのは実現できてないで
す.

なぜうまくいってないかもある程度は追いかけていて,上記スクリプト中の

HAL_UDI=`hal-find-by-property --key block.device --string "$DEVICE"`

という部分で挿した USB メモリの HAL_UDI を調べているのだけど,手元の
HAL の環境では hal-device で調べても USB なフラッシュには block.device
というプロパティが無いため,デバイスの HAL_UDI が取れてないのが原因っぽ
いのですが,どういう風に対応するのがいいかは不明です.

# HAL のバージョンとかに関係してたりするのだろうか?

------
こじま

投稿者 xml-rpc : 2007年12月 2日 10:22
役に立ちました?:
過去のフィードバック 平均:(0) 総合:(0) 投票回数:(0)
本記事へのTrackback: http://hoop.euqset.org/blog/mt-tb2006.cgi/67101
トラックバック
コメント
コメントする




画像の中に見える文字を入力してください。