当前位置: 首页 > 面试题库 >

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

吴德辉
2023-03-14
问题内容

我正在为与用户提供的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设备,而无需用户干预或事先了解所插入设备的详细信息?

谢谢,对这本书很抱歉。


问题答案:

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



 类似资料:
  • 根据上一节的分析:我们最终编写的Tweak程序如下: #import <CoreLocation/CoreLocation.h> %hook MomoLocationManager - (void)setLocation:(CLLocation* )location { %log; CLLocation *location1 = [[CLLocation alloc] initWithLati

  • 问题内容: 我想创建模块自动更新USB设备列表(不仅是大容量存储)。现在它的工作非常不礼貌- 它具有附加线程,该线程在1秒钟后更新了设备列表。但是也许您知道如何处理一些插件事件,这些事件会生成OS(例如Windows XP及更高版本),或者通过另一种方式简化此过程。感谢您的时间! 问题答案: 这个问题似乎是一半的设计,一半的实现。似乎您最担心要为Java USB服务(例如jUSB)找到某种方式来服

  • 简介 USB 即 Universal Serial Bus 是一种支持热插拔的通用串行总线,在 USB 体系中又分为 USB Host 和 USB Device。本文将基于 stm32l475-atk-pandora 开发板,讲解基于 RT-Thread Studio 开发 USB Device 驱动。 USB Device 设备驱动的开发可总结为如下几个步骤: 新建 RT-Thread 完整版项

  • 问题内容: 我使用Amazon Linux实例,并且有几个脚本来填充数据并安装所有使用的程序,但是有几个程序会问: 并暂停安装。我想在所有情况下都自动回答“ Y”,我现在确定该怎么做。 问题答案: 在“是”命令将回声“Y”(或任何你问它)无限期。用作: 或者,如果要求大写字母“ Y”:

  • 鼓励文件的重用,尽量使用include和role避免重复的代码。 尽量把大的文件分成小的文件 https://github.com/ansible/ansible-examples production # inventory file for production servers staging # inventory file

  • 编写HTTP/1.1和HTTP/2.0脚本 有时,我们希望编写一个快速的脚本而不会遇到创建类的麻烦。addons机制具有一种速记方式,可以将模块作为一个整体视为一个addon对象。这使我们可以将事件处理程序函数放在模块作用域中。例如,下面是一个完整的脚本,它向每个请求添加标头。 def request(flow): flow.request.headers["myheader"] = "v