在linux系统里,如何检查新插入的USB设备是不是被系统识别?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在linux系统里,如何检查新插入的USB设备是不是被系统识别?相关的知识,希望对你有一定的参考价值。

1、在linux系统里,如何检查新插入的USB设备是否被系统识别?2、在linux系统里,使作fdisk和命令需要注意什么?3、在linux系统里,使用umount命令需要注意什么问题?三个问题!! 请高手指点~

1、在linux系统里,如何检查新插入的USB设备是否被系统识别?
答:在linux图形状态下(就是进入图形桌面)有两个办法:一、当插入usb设备时,桌面会跳出一个硬盘图标。二、在插入usb前console(命令行)下键入:df,插入usb后再键入:df,看看有没有新盘符出现。
2、在linux系统里,使作fdisk和命令需要注意什么?
答:fdisk是分区命令,需要有计划和谨慎行事,存盘前最好再确认一下。
3、在linux系统里,使用umount命令需要注意什么问题?
答:umount是硬盘卸载命令,当有进程在使用umount指定的卸载盘时,会出错,因此运行前确认没有进程使用要卸载的盘。
参考技术A 在linux图形状态下(就是进入图形桌面)有两个办法:一、当插入usb设备时,桌面会跳出一个硬盘图标。二、在插入usb前console(命令行)下键入:df,插入usb后再键入:df,看看有没有新盘符出现。 参考技术B 方法一:在/etc/init.d/rcS中添加mount -t usbfs none /proc/bus/usb.
方法二:在shell中输入mount -t usbfs /proc/bus/usb /proc/bus/usb.
前提是在编译内核时选中usb device filesystem。
# cat /proc/bus/usb /device
T: Bus=01 Lev=00 Prnt=00 Port=00 Cnt=00 Dev#= 1 Spd=12 MxCh= 2
B: Alloc= 0/900 us ( 0%), #Int= 1, #Iso= 0
D: Ver= 1.10 Cls=09(hub ) Sub=00 Prot=00 MxPS=64 #Cfgs= 1
P: Vendor=1d6b ProdID=0001 Rev= 2.06
S: Manufacturer=Linux 2.6.32.2-ltls ohci_hcd
S: Product=S3C24XX OHCI
S: SerialNumber=s3c24xx
C:* #Ifs= 1 Cfg#= 1 Atr=e0 MxPwr= 0mA
I:* If#= 0 Alt= 0 #EPs= 1 Cls=09(hub ) Sub=00 Prot=00 Driver=hub
E: Ad=81(I) Atr=03(Int.) MxPS= 2 Ivl=255ms
T: Bus=01 Lev=01 Prnt=01 Port=00 Cnt=01 Dev#= 2 Spd=12 MxCh= 4
D: Ver= 1.10 Cls=09(hub ) Sub=00 Prot=00 MxPS= 8 #Cfgs= 1
P: Vendor=0000 ProdID=0000 Rev= 1.25
C:* #Ifs= 1 Cfg#= 1 Atr=e0 MxPwr= 0mA
I:* If#= 0 Alt= 0 #EPs= 1 Cls=09(hub ) Sub=00 Prot=00 Driver=hub
E: Ad=81(I) Atr=03(Int.) MxPS= 1 Ivl=255ms
T: Bus=01 Lev=02 Prnt=02 Port=01 Cnt=01 Dev#= 7 Spd=12 MxCh= 0
D: Ver= 2.00 Cls=ff(vend.) Sub=00 Prot=00 MxPS=64 #Cfgs= 1
P: Vendor=160a ProdID=3184 Rev= 2.05
S: Manufacturer=VIA Networking Technologies, Inc.
S: Product=VNT USB-802.11 Wireless LAN Adapter
C:* #Ifs= 1 Cfg#= 1 Atr=80 MxPwr=500mA
I:* If#= 0 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=00 Prot=00 Driver=vntwusb
E: Ad=81(I) Atr=03(Int.) MxPS= 32 Ivl=1ms
E: Ad=82(I) Atr=02(Bulk) MxPS= 64 Ivl=0ms
E: Ad=03(O) Atr=02(Bulk) MxPS= 64 Ivl=0ms
参考技术C fdisk -l
列出所有发现的磁盘设备

如何在 Python 中侦听 Linux 中的“插入 USB 设备”事件?

【中文标题】如何在 Python 中侦听 Linux 中的“插入 USB 设备”事件?【英文标题】:How can I listen for 'usb device inserted' events in Linux, in Python? 【发布时间】:2010-10-02 22:12:27 【问题描述】:

我想在 Linux 中为 Amarok 编写一个 Python 脚本,以自动将 *** 播客复制到我的播放器。当我插入播放器时,它会挂载驱动器,复制任何待处理的播客,然后弹出播放器。如何收听“插入”事件?我已经浏览了一遍,但找不到一个很好的例子。

【问题讨论】:

哇,您能相信我们过去常常在没有始终连接到互联网的宽带连接的设备上收听播客吗? 【参考方案1】:

更新:正如 cmets 中所说,最近的发行版不支持 Hal,现在的标准是 udev,这是一个利用 glib 循环和 udev的小例子>,出于历史原因,我保留了 Hal 版本。

这基本上是 example in the pyudev documentation,适用于旧版本和 glib 循环,请注意过滤器应根据您的特定需要进行定制:

import glib

from pyudev import Context, Monitor

try:
    from pyudev.glib import MonitorObserver

    def device_event(observer, device):
        print 'event 0 on device 1'.format(device.action, device)
except:
    from pyudev.glib import GUDevMonitorObserver as MonitorObserver

    def device_event(observer, action, device):
        print 'event 0 on device 1'.format(action, device)

context = Context()
monitor = Monitor.from_netlink(context)

monitor.filter_by(subsystem='usb')
observer = MonitorObserver(monitor)

observer.connect('device-event', device_event)
monitor.start()

glib.MainLoop().run()

带有 Hal 和 d-bus 的旧版本:

您可以使用 D-Bus 绑定并收听 DeviceAddedDeviceRemoved 信号。 您必须检查已添加设备的功能才能仅选择存储设备。

这里是一个小例子,你可以把cmets去掉试试看。

import dbus
import gobject

class DeviceAddedListener:
    def __init__(self):

您需要使用系统总线连接到 Hal Manager。

        self.bus = dbus.SystemBus()
        self.hal_manager_obj = self.bus.get_object(
                                              "org.freedesktop.Hal", 
                                              "/org/freedesktop/Hal/Manager")
        self.hal_manager = dbus.Interface(self.hal_manager_obj,
                                          "org.freedesktop.Hal.Manager")

您需要将侦听器连接到您感兴趣的信号,在本例中为DeviceAdded

        self.hal_manager.connect_to_signal("DeviceAdded", self._filter)

我正在使用基于功能的过滤器。它将接受任何volume 并调用do_something,如果,您可以阅读 Hal 文档以找到更适合您需求的查询,或有关 Hal 设备属性的更多信息。

    def _filter(self, udi):
        device_obj = self.bus.get_object ("org.freedesktop.Hal", udi)
        device = dbus.Interface(device_obj, "org.freedesktop.Hal.Device")

        if device.QueryCapability("volume"):
            return self.do_something(device)

显示有关卷的一些信息的示例函数:

     def do_something(self, volume):
        device_file = volume.GetProperty("block.device")
        label = volume.GetProperty("volume.label")
        fstype = volume.GetProperty("volume.fstype")
        mounted = volume.GetProperty("volume.is_mounted")
        mount_point = volume.GetProperty("volume.mount_point")
        try:
            size = volume.GetProperty("volume.size")
        except:
            size = 0

        print "New storage device detectec:"
        print "  device_file: %s" % device_file
        print "  label: %s" % label
        print "  fstype: %s" % fstype
        if mounted:
            print "  mount_point: %s" % mount_point
        else:
            print "  not mounted"
        print "  size: %s (%.2fGB)" % (size, float(size) / 1024**3)

if __name__ == '__main__':
    from dbus.mainloop.glib import DBusGMainLoop
    DBusGMainLoop(set_as_default=True)
    loop = gobject.MainLoop()
    DeviceAddedListener()
    loop.run()

【讨论】:

我收到此代码错误:dbus.exception.DBusException: org.freedesktop.DBus.Error.ServiceUnknown: 名称 org.freedesktop.Hal 不是由任何 .service 文件提供的。你觉得你能帮我吗? @EtienneLepage-Lepitre Hal 现在已弃用,通常此解决方案将不再起作用:( 添加了使用 udev 的解决方案。【参考方案2】:

我自己没有尝试过编写这样的程序,但是我只是查看了以下两个链接(感谢 Google!),我认为这会有所帮助:

dbus-python tutorial(里面讲了如何使用 Python 访问 D-Bus) HAL 0.5.10 Specification(讨论 HAL 如何将事件发布到 D-Bus)

尤其要了解org.freedesktop.Hal.Manager 接口及其DeviceAddedDeviceRemoved 事件。 :-)

希望这会有所帮助!

【讨论】:

【参考方案3】:

这是一个 5 行的解决方案。

import pyudev

context = pyudev.Context()
monitor = pyudev.Monitor.from_netlink(context)
monitor.filter_by(subsystem='usb')

for device in iter(monitor.poll, None):
    if device.action == 'add':
        print(' connected'.format(device))
        # do something very interesting here.

将此保存到文件中,例如 usb_monitor.py,运行 python monitor.py。插入任何 USB,它会打印设备详细信息

→ python usb_monitor.py 
Device('/sys/devices/pci0000:00/0000:00:14.0/usb1/1-6/1-6:1.0') connected
Device('/sys/devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1:1.0') connected

使用pyudev==0.21.0 在 Python 3.5 上测试。

【讨论】:

【参考方案4】:

我认为 D-Bus 会像 Chris 提到的那样工作,但如果您使用 KDE4,您可能会以类似于 KDE4“新设备通知程序”小程序的方式使用 Solid 框架。

该小程序的 C++ 源代码是 here,它显示了如何使用 Solid 来检测新设备。使用 PyKDE4 将 Python 绑定到这些库,如 here 所示。

【讨论】:

以上是关于在linux系统里,如何检查新插入的USB设备是不是被系统识别?的主要内容,如果未能解决你的问题,请参考以下文章

Linux 下 USB 端口和设备的绑定

如何检测USB键盘是不是插入和拔出

如何使用python检测USB设备是不是插入?

linux系统下的USB口如何使用??

linux如何发现和加载对应的USB设备驱动

usb to serial