我正在为与用户提供的 USB 内存棒交互的设备编写 python 模块。用户可以在设备的 USB 插槽中插入 USB 内存棒,设备会自动将数据转储到内存棒上,而无需用户干预。如果设备在用户插入 USB 内存棒时正在运行,我已经连接到 D-Bus 并完成了自动安装例程。新的问题是,如果在设备断电时插入棒子怎么办?在设备开机后,我没有收到 D-Bus 插入事件,也没有收到有关内存棒的任何相关信息 block 。
我找到了一种通过调用/proc 中的 USB 设备来获取设备节点 (/dev/sd?) 的方法:
ls /proc/scsi/usb-storage
如果您对该文件夹中的每个文件进行 cat,这将提供 scsi 设备信息。
然后我从 usb 存储记录中获取供应商、产品和序列号字段,生成一个标识符字符串,然后在
ll /dev/disc/by-id/usb_[vendor]<code>_[product]</code>_[serial_number]-0:0
所以我可以通过结果解析得到相对路径
../../sdc
然后,我可以挂载 U 盘了。
这是一个繁琐的过程,几乎都是基于文本的,当有人引入奇怪的字符或非标准的序列号字符串时,就会出现错误。它适用于我拥有的所有 2 个 USB 内存棒。我试图映射/var/log/messages 的输出,但最终也是文本比较。 lsusb、fdisk、udevinfo、lsmod 等的输出仅显示所需数据的一半。
我的问题:在没有 D-Bus 消息的情况下,我如何确定分配给 USB 内存棒的/dev 设备而不需要用户干预,或者事先知道插入设备的具体信息?
谢谢,对小说感到抱歉。
最佳答案
这似乎可以结合 /proc/partitions
和 ephimient 采用的 /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
我不确定它的便携性和可靠性如何,但它适用于我的 U 盘。当然find("/usb")
可以做成更严谨的正则表达式。执行 mod 16 也可能不是查找磁盘本身和过滤掉分区的最佳方法,但到目前为止它对我有用。
关于python - 在 Linux 中编写 USB 设备挂载脚本的更好方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2384290/