当前位置: > Linux发行版 > Fedora >

在Linux Fedora10中,接受U盘设备挂接消息

时间:2016-12-06 14:19来源:linux.it.net.cn 作者:IT

在Fedora10等Linux操作系统中,如果用户插入U盘或者移动硬盘等USB存储设备,将会自动mount到文件系统中。

当U盘插入后,如何收到U盘挂接的通知?
挂接的U盘设备可能的名称是sdb sdc sdd ... 如果有多个U盘胡乱地插拔,如何知道当前插拔的是哪个设备?
当设备被挂接后,如何获得被挂接后的文件系统路径呢?


因为对Linux不够熟悉,解决这些问题我弄了1天,走了不少弯路,现在终于解决了。

首先,添加一条udev的规则。
在/etc/udev/rules.d/目录下,建立一个空文本文件,命名为:99_usb_detection.rules
99表示优先级是最低的,也是最后执行的。
然后在此文本文件中加入一行。

  1. KERNAL=="sd*", SUBSYSTEM=="block", ACTION=="add", RUN+="/你的程序的绝对路径"

我开始在这里钻了半天的牛角尖,老想去挂接 SUBSYSTEM="usb", 导致一直不能找到很好的方法获取到U盘的挂接路径。

那么,编辑此文件后,每当U盘没自动挂接就会启动你的程序的一个实例,就算没有GUI登陆也会自动启动。
在启动的进程中,可以通过环境变量获取到相关参数。获取环境变量可以用getenv函数,不过想看到所有的环境变量可以采用main函数的扩展版本。

  1. int main(int argc, char** argv, char **envp)

第3个参数就是字符串序列,可以通过它来得到环境变量。这里可以看看有哪些环境变量可以利用。

  1. UDEV_LOG=3
  2. ACTION=add
  3. 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
  4. SUBSYSTEM=block
  5. MAJOR=8
  6. MINOR=16
  7. DEVTYPE=disk
  8. SEQNUM=1412
  9. UDEVD_EVENT=1
  10. ID_VENDOR=USB_2.0
  11. ID_MODEL=Flashdisk_USB_2.0
  12. ID_REVISION=%z!Y
  13. ID_SERIAL=USB_2.0_Flashdisk_USB_2.0_200602190750-0:0
  14. ID_SERIAL_SHORT=200602190750
  15. ID_TYPE=disk
  16. ID_INSTANCE=0:0
  17. ID_BUS=usb
  18. ID_PATH=pci-0000:02:00.0-usb-0:1:1.0-scsi-0:0:0:0
  19. ID_FS_USAGE=filesystem
  20. ID_FS_TYPE=vfat
  21. ID_FS_VERSION=FAT16
  22. ID_FS_UUID=006E-1F87
  23. ID_FS_UUID_ENC=006E-1F87
  24. ID_FS_LABEL=USBFDD-BOOT
  25. ID_FS_LABEL_ENC=USBFDD-BOOT
  26. ID_FS_LABEL_SAFE=USBFDD-BOOT
  27. DEVNAME=/dev/sdb
  28. 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就能够获取到挂接的路径了。也可以通过一些其它参数判断当前设备是否是期望的设备。

最后,获取挂接的文件系统的命令是:

  1. # cat /etc/mtab | grep /"/dev/sdb/" | awk '{print $2}'

弄出来发现还蛮简单。




(责任编辑:IT)
------分隔线----------------------------