一尘不染

在Linux中编写USB设备安装脚本的更好方法

linux

我正在为与用户提供的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

这样我就可以解析结果以获得相对路径

../../sdc

然后,我可以安装USB记忆棒。

这是一个繁琐的过程,几乎所有基于文本的过程,而且当有人引入奇怪的字符或非标准的序列号字符串时,也很容易出错。它可以与我拥有的所有2个USB记忆棒一起使用。我试图映射/
var / log /
messages的输出,但是最终还是文本比较。lsusb,fdisk,udevinfo,lsmod和其他文件的输出仅显示所需数据的一半。

我的问题:在没有D-Bus消息的情况下,如何确定分配给USB记忆棒的/ dev设备,而无需用户干预或事先了解所插入设备的详细信息?

谢谢,对这本书很抱歉。


阅读 285

收藏
2020-06-07

共1个答案

一尘不染

这似乎很有效/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可能也不是找到磁盘本身并筛选出分区的最佳方法,但到目前为止对我来说仍然有效。

2020-06-07