在Fedora10等Linux操作系统中,如果用户插入U盘或者移动硬盘等USB存储设备,将会自动mount到文件系统中。
当U盘插入后,如何收到U盘挂接的通知?
挂接的U盘设备可能的名称是sdb sdc sdd ... 如果有多个U盘胡乱地插拔,如何知道当前插拔的是哪个设备?
当设备被挂接后,如何获得被挂接后的文件系统路径呢?
因为对Linux不够熟悉,解决这些问题我弄了1天,走了不少弯路,现在终于解决了。
首先,添加一条udev的规则。
在/etc/udev/rules.d/目录下,建立一个空文本文件,命名为:99_usb_detection.rules
99表示优先级是最低的,也是最后执行的。
然后在此文本文件中加入一行。
-
KERNAL=="sd*", SUBSYSTEM=="block", ACTION=="add", RUN+="/你的程序的绝对路径"
我开始在这里钻了半天的牛角尖,老想去挂接 SUBSYSTEM="usb", 导致一直不能找到很好的方法获取到U盘的挂接路径。
那么,编辑此文件后,每当U盘没自动挂接就会启动你的程序的一个实例,就算没有GUI登陆也会自动启动。
在启动的进程中,可以通过环境变量获取到相关参数。获取环境变量可以用getenv函数,不过想看到所有的环境变量可以采用main函数的扩展版本。
-
int main(int argc, char** argv, char **envp)
第3个参数就是字符串序列,可以通过它来得到环境变量。这里可以看看有哪些环境变量可以利用。
-
UDEV_LOG=3
-
ACTION=add
-
DEVPATH=/devices/pci0000:00/0000:00:11.0/0000:02:00.0/usb2/2-1/2-1:1.0/host6/target6:0:0/6:0:0:0/block/sdb
-
SUBSYSTEM=block
-
MAJOR=8
-
MINOR=16
-
DEVTYPE=disk
-
SEQNUM=1412
-
UDEVD_EVENT=1
-
ID_VENDOR=USB_2.0
-
ID_MODEL=Flashdisk_USB_2.0
-
ID_REVISION=%z!Y
-
ID_SERIAL=USB_2.0_Flashdisk_USB_2.0_200602190750-0:0
-
ID_SERIAL_SHORT=200602190750
-
ID_TYPE=disk
-
ID_INSTANCE=0:0
-
ID_BUS=usb
-
ID_PATH=pci-0000:02:00.0-usb-0:1:1.0-scsi-0:0:0:0
-
ID_FS_USAGE=filesystem
-
ID_FS_TYPE=vfat
-
ID_FS_VERSION=FAT16
-
ID_FS_UUID=006E-1F87
-
ID_FS_UUID_ENC=006E-1F87
-
ID_FS_LABEL=USBFDD-BOOT
-
ID_FS_LABEL_ENC=USBFDD-BOOT
-
ID_FS_LABEL_SAFE=USBFDD-BOOT
-
DEVNAME=/dev/sdb
-
DEVLINKS=/dev/disk/by-id/usb-USB_2.0_Flashdisk_USB_2.0_200602190750-0:0 /dev/disk/by-path/pci-0000:02:00.0-usb-0:1:1.0-scsi-0:0:0:0 /dev/disk/by-uuid/006E-1F87 /dev/disk/by-label/USBFDD-BOOT
根据其中的DEVNAME就能够获取到挂接的路径了。也可以通过一些其它参数判断当前设备是否是期望的设备。
最后,获取挂接的文件系统的命令是:
-
# cat /etc/mtab | grep /"/dev/sdb/" | awk '{print $2}'
弄出来发现还蛮简单。
(责任编辑:IT) |