我正在为与用户提供的USB记忆棒进行交互的设备编写python模块。用户可以将USB记忆棒插入设备的USB插槽中,并且该设备无需用户干预即可将数据转储到该记忆棒中。如果用户插入USB记忆棒时设备正在运行,则说明我已经挂接到D- Bus,并已完成所有自动安装例程。新问题是,如果在关闭设备电源的情况下插入了棒,该怎么办?打开设备电源后,没有收到D- Bus插入事件,也没有任何有关记忆棒的相关信息。
我已经找到了一种方法,可以通过调用以下命令来从/ proc中的USB设备扫描中导出设备节点(/ dev / sd?):
ls /proc/scsi/usb-storage
如果为该文件夹中的每个文件分配了目录,则将提供scsi设备信息。
然后,我从USB存储记录中获取“供应商”,“产品”和“序列号”字段,生成一个标识符字符串,然后将其用于
ll /dev/disc/by-id/usb_[vendor]_[product]_[serial_number]-0:0
ll /dev/disc/by-id/usb_[vendor]
_[serial_number]-0:0
这样我就可以解析结果以获得相对路径
../../sdc
然后,我可以安装USB记忆棒。
这是一个繁琐的过程,几乎所有基于文本的过程,而且当有人引入奇怪的字符或非标准的序列号字符串时,也很容易出错。它可以与我拥有的所有2个USB记忆棒一起使用。我试图映射/ var / log / messages的输出,但是最终还是文本比较。lsusb,fdisk,udevinfo,lsmod和其他文件的输出仅显示所需数据的一半。
我的问题:在没有D-Bus消息的情况下,如何确定分配给USB记忆棒的/ dev设备,而无需用户干预或事先了解所插入设备的详细信息?
谢谢,对这本书很抱歉。
这似乎很有效/proc/partitions,并且/sys/class/block采用了短暂的方法。
/proc/partitions
/sys/class/block
#!/usr/bin/python import os partitionsFile = open("/proc/partitions") lines = partitionsFile.readlines()[2:]#Skips the header lines for line in lines: words = [x.strip() for x in line.split()] minorNumber = int(words[1]) deviceName = words[3] if minorNumber % 16 == 0: path = "/sys/class/block/" + deviceName if os.path.islink(path): if os.path.realpath(path).find("/usb") > 0: print "/dev/%s" % deviceName
我不确定它的便携性或可靠性,但是它可以用于我的USB记忆棒。当然find("/usb")可以做成更严格的正则表达式。进行mod 16可能也不是找到磁盘本身并筛选出分区的最佳方法,但到目前为止对我来说仍然有效。
find("/usb")