[Ubuntu]openbox下U盘自动挂载

我使用的系统是Ubuntu12.04+openbox,没有使用gnome等集成环境,所以没有U盘自动挂载功能。从网上搜索了一下资料:


+ubuntu下usb自动挂载(ext4,ntfs,vfat,exfat格式的u盘) http://hi.baidu.com/blue_egg/item/db33a02074ca301c2b0f1c90


见到手动配置U盘自动挂载主要是使用udev功能。搜索了一下udev的资料:


+udev 维基百科,自由的百科全书 http://zh.wikipedia.org/wiki/Udev
+udev (简体中文) https://wiki.archlinux.org/index.php/Udev_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87)


感觉udev比较复杂(因为是用于管理所有设备,而不单单是U盘),所以只配置自己正在用的U盘能自动挂载就算了。


插上U盘后,用fdisk命令检查出放在 /dev/sdb1 中:
$ sudo fdisk -l
/dev/sdb1   *          63    15130079     7565008+   b  W95 FAT32
但后来不知什么原因又变成 /dev/sdc1 ...


建立规则文件:/etc/udev/rules.d/10_usbkey.rules,内容为:
KERNEL=="sd[b-z][0-9]",SUBSYSTEM=="block",ATTR{partition}=="1",RUN+="/sbin/usbmount.sh %k"


需要注意几个地方:
RUN中待执行的命令,一开始我是放在/home中的,结果没反映,后来改放到/root或/sbin中才生效。
一开始以为U盘BUS属性是usb不会错的,结果不是。
如果不加上ATTR{partition}=="1",RUN中的命令会执行两次,一次是因为匹配到/dev/sdc, 第二次是匹配到/dev/sdc1,使用udevadm info --name=/dev/sdc1 --attribute-walk命令找到/dev/sdc1中有ATTR{partition}=="1",加入规则中,这样RUN中的命令就只运行一次了。


但是,后来发现有ATTR{partition}=="1"时,只有add事件(U盘插入),没有remove事件(U盘拨出),一开始 /sbin/usbmount.sh 的内容是这样写的:
echo "$ACTION $1" >> /home/g/script/run.txt
所以能看到哪些事件和设置路径被触发。


然后从规则中删掉ATTR{partition}=="1",又发现RUN中的命令只运行一次了,并且add和remove事件都有(其它我什么都没改过,实难搞懂)。
所以,最后的规则文件内容是:
KERNEL=="sd[b-z][0-9]",SUBSYSTEM=="block",RUN+="/sbin/usbmount.sh %k"


一些参考资料:
+[原]简述udev的自定义规则 http://www.linuxfly.org/post/540/
+怎样编写udev规则 http://blog.csdn.net/leisure512/article/details/6683715


编写/sbin/usbmount.sh脚本,让U盘按/dev中的名称进行挂载(比如sdc1):
#!/bin/bash


# echo "$ACTION $1" >> /home/g/script/run.txt
# exit
len=${#1}
# eg. sdc
if [ $len == 3 ]; then
exit
fi
# eg. scd1


if [ $ACTION == "add" ]; then
mkdir "/media/usb$1" -p
mount -t auto -o rw,umask=000 "/dev/$1" "/media/usb$1"
fi


if [ $ACTION == "remove" ]; then
umount "/media/usb$1"
rmdir "/media/usb$1"
fi


给usbmount.sh加上可执行权限:
chmod a+x usbmount.sh


+通过udev自动挂载U盘的方法 http://blog.csdn.net/unbutun/article/details/3838196


现在插拨U盘后都能自动挂载和卸载了。并且挂载的目录按/dev中的设置路径命名,同时插多个U盘时不会冲突。


我还希望插入U盘后可以自动运行一些脚本,设想是:
在U盘一个固定的目录建立ukey文件,文件内记录待执行的脚本名称,如果发现这个标识文件,则到/home/script/usbautorun/目录下找对应的脚本文件执行。


在/sbin/usbmount.sh脚本挂载命令添加一行:
/home/g/script/usbautorun/mount.sh $1


然后编写mount.sh脚本:
#!/bin/bash


if [ -f "/media/usb$1/zjq/ukey" ]; then
ukey=`cat /media/usb$1/zjq/ukey`
path="/home/g/script/usbautorun/$ukey.sh"
if [ -f $path ]; then
echo `$path /media/usb$1/`
fi
fi


这样,就可以通过U盘的ukey文件指定自动执行 usbautorun/ 目录下的脚本文件了。

你可能感兴趣的:(Linux)