[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

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



From: KOJIMA Mitsuhiro <kojima@xxxxxxxxxxx>
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 のバージョンとかに関係してたりするのだろうか?

------
こじま


[検索ページ] [メール一覧]
Plamo ML 公開システム