|
板子上挂载U盘的问题,udev不能执行我的脚本?
[复制链接]
小弟我想板子检测到u盘后会执行我写的一个脚本。遇到了问题。具体做法如下:
rcS里
PATH=/usr/myscript:/usr/gpephone/bin:/bin:/sbin:/usr/bin:/usr/sbin
export PATH
/bin/mount -t proc proc /proc
echo "Starting udevd..."
/sbin/udevd --daemon
/sbin/udevstart
my.rules文件如下
KERNEL=="sd[a-z]", NAME="%k", SYMLINK+="usbhd-%k", GROUP="users", OPTIONS="last_rule" RUN+="/sbin/usbmount_0.sh"
ACTION=="add", KERNEL=="sd[a-z][0-9]", SYMLINK+="usbhd-%k", GROUP="users", NAME="%k"
ACTION=="remove", KERNEL=="sd[a-z][0-9]", RUN+="/sbin/usbmount.sh"
ACTION=="remove", KERNEL=="sd[a-z][0-9]", RUN+="/bin/umount -l /media/usbhd-%k"
ACTION=="remove", KERNEL=="sd[a-z][0-9]", RUN+="/bin/rmdir /media/usbhd-%k", OPTIONS="last_rule"
但实现不了。我在启动tiny-x,matchbox和d-bus碰到打出如下信息:
udevd-event[861]: unlink_secure: chown(/dev/vcs1, 0, 0) failed: Operation not permitted
udevd-event[864]: unlink_secure: chown(/dev/vcsa1, 0, 0) failed: Operation not permitted
udevd-event[862]: udev_node_mknod: chmod(/dev/vcs2, 020660) failed: Operation not permitted
udevd-event[863]: udev_node_mknod: chmod(/dev/vcsa2, 020660) failed: Operation not permitted
插入U盘时打出如下信息,不会执行我的脚本/sbin/usbmount.sh
usb 1-1: new full speed USB device using s3c2410-ohci and address 2
scsi0 : SCSI emulation for USB Mass Storage devices
Vendor: USB 2.0 Model: ????USB?豸 Rev: 2.00
Type: Direct-Access ANSI SCSI revision: 02
SCSI device sda: 258304 512-byte hdwr sectors (132 MB)
sda: Write Protect is off
sda: assuming drive cache: write through
SCSI device sda: 258304 512-byte hdwr sectors (132 MB)
sda: Write Protect is off
sda: assuming drive cache: write through
sda: <7>usb-storage: queuecommand called
sda1
Attached scsi removable disk sda at scsi0, channel 0, id 0, lun 0
udevd-event[890]: udev_node_mknod: chown(/dev/sda, 0, 100) failed: Operation not permitted
udevd-event[896]: udev_node_mknod: chown(/dev/sda1, 0, 100) failed: Operation not permitted
拔出时,
usb 1-1: USB disconnect, address 2
udevd-event[919]: unlink_secure: chown(/dev/sda1, 0, 0) failed: Operation not permitted
udevd-event[925]: unlink_secure: chown(/dev/sda, 0, 0) failed: Operation not permitted
貌似权限的问题,但我chmod 777 /dev -R后还是不行。各位大侠帮帮忙.有没有实现了的或者是更好的方法的阿???
用网上的一篇文章来作也不行:文章如下
通过udev自动挂载U盘的方法
目前一些主流桌面系统(如Gnome,KDE,Xfce)的较新版本都支持自动挂载(mount)U盘了. 一个流传很广的说法是 HAL(硬件抽象层) 起了自动挂载的作用, 其实这是误解. 对于2.6内核而言, udev 才是直接从内核接收设备连接或断开信息的主体.
udev 从内核得到信息后,根据一些简单规则(注意,是简单规则), 在 /dev 目录下创建相应的设备节点, 并进行某些相关操作. HAL 所做的事情是在 udev 的规则中加上一条(或几条), 让 udev 把收到的信息也传递给 HAL. 接下来, HAL 用更为复杂的规则来匹配和描述当前连接着的硬件. 举一个简单的例子, udev 知道的是U盘已经连接了并且有一个分区; 而 HAL 能更进一步知道这个分区的卷标名及其它一些信息.
上面这些都还不能自动挂载U盘. Gnome 等桌面系统会启动一个守护进程(daemon), 通过 D-Bus 从 HAL 那里得到硬件信息, 如果发现有U盘连接了就由它们来挂载它(实际是调用 pmount).
问题是, 如果你不想用Gnome,KDE,Xfce这些桌面系统, 那么由它们提供的U盘自动挂载功能也就失效了,有解决办法么?
解决的办法之一, 便是让 udev 来干这件事情!
udev 的主要功能是实时地在 /dev 目录下创建和删除设备节点, 但它也能在创建节点的同时, 执行一个额外地程序. 具体的原理这里就不详说了, 有时间请仔细阅读 Writing udev rules 这篇文章. 写规则时特别注意 KERNEL, SUBSYSTEM 等这些关键字单数和复数(最后有没有'S')的区别. 复数(比如 KERNELS)表示你想用父设备的属性来匹配, 单数(比如 KERNEL)是要匹配设备本身的属性.
在 /etc/udev/rules.d 目录下创建文件 10_usbkey.rules, 其内容如下
KERNEL=="sda1", SUBSYSTEM=="block", RUN+="/root/usbmount.sh"
然后, 在 /root 目录中创建文件 usbmount.sh, 其内容为
#!/bin/bash
LOG=/var/log/usb-hotplug.log
lap=$(date --rfc-3339=ns)
echo "$lap: $DEVPATH requesting $ACTION" >> $LOG
if [ $ACTION == "add" ]
then
mount -t vfat -o umask=000,noatime,async,codepage=936,iocharset=gb2312 \
/dev/sda1 /media/usbkey
elif [ $ACTION == "remove" ]
then
umount -l /media/usbkey
fi
并把该文件属性设置为可执行, chmod a+x usbmount.sh
注意, 如果你的 linux 上 locale 是 zh_CN.utf-8, 需要把上面的 iocharset=gb2312 改成 iocharset=utf8
最后创建目录, mkdir /media/usbkey
这是一个非常简单但可用的例子. U盘插上后自动 mount 到 /media/usbkey , 拔出后自动 umount. 你可以查看 /var/log/usb-hotplug.log , 里面会有些简单的调用记录.
|
|