5种无需断开手就可以断开和连接USB设备的方法

在很多情况下,当我们使用计算机时,我们会断开USB设备的连接(必须安全地断开连接),此后,我们立即意识到我们忘记了复制文件,或者必须确保数据在其中。我们的单位。 对于这些情况,当我们进行远程工作时,虚拟断开USB驱动器通常非常有用。

弹出设备后,我们不再在设备列表中看到它,但是硬盘驱动器或Pendrive仍通过USB端口连接,并且在当今的许多发行版中,安全弹出驱动器后,我们也看不到该设备,并且我们做不到 安装 从我们的终端。 最快的解决方案是在某些情况下,由于不得不起床的懒惰或由于我们正在访问不在前面的计算机且周围没有人而导致的连接断开,然后重新连接电缆。

有关USB设备的信息

在开始之前,让我们看一下如何获取有关连接到系统的USB设备的信息。 为此,我们可以使用 的lsusb,它将立即列出已连接的设备。 我举例说明了我现在在计算机上得到的东西,但是也许与您得到的东西有很大的不同:

$ lsusb总线002设备001:ID 1d6b:0003 Linux Foundation 3.0根集线器总线001设备006:ID 8087:0a2a英特尔公司总线001设备007:ID 046d:c52b Logitech,Inc.统一接收器总线001设备005:ID 1a40 :0101 Terminus Technology Inc.集线器总线001设备010:ID 125f:c93a A-DATA Technology Co.,Ltd. 4GB笔式驱动器总线001 Device 003:ID 04f2:b424 Chicony Electronics Co.,Ltd.总线001设备001:ID 1d6b :0002 Linux Foundation 2.0根集线器

如果需要更多信息,可以使用-t修饰符,该修饰符将以树的形式向我们显示输出,其中包含有关模块的信息:

$ lsusb -t /:总线02.Port 1:Dev 1,Class = root_hub,Driver = xhci_hcd / 8p,5000M /:总线01.Port 1:Dev 1,Class = root_hub,Driver = xhci_hcd / 16p,480M | __端口4:Dev 3,如果为0,类别=视频,驱动程序= uvcvideo,480M | __端口4:Dev 3,如果为1,类别=视频,驱动程序= uvcvideo,480M | __端口5:Dev 10,如果为0,类别=大容量存储,驱动程序= usb存储,480M | __端口6:开发人员5,如果为0,类=集线器,驱动程序=集线器/ 4p,12M | __端口4:开发人员7,如果为0,类=人机接口设备驱动程序= usbhid,12M | __端口4:Dev 7,如果为1,类=人机接口设备,驱动程序= usbhid,12M | __端口4:Dev 7,如果为2,类=人机接口设备,驱动程序= usbhid,12M | __端口9:Dev 6,如果为0,类=无线,驱动程序= btusb,12M | __端口9:Dev 6,如果为1,类=无线,驱动程序= btusb,12M

如果我们需要更多信息,可以使用 lsusb -v (输出非常大),此外,例如,我们可以通过以下方式知道传递给设备的最大功率:

$ lsusb -v 2> / dev / null | egrep“ ^ Bus | MaxPower”总线002设备001:ID 1d6b:0003 Linux Foundation 3.0根集线器MaxPower 0mA总线001设备006:ID 8087:0a2a英特尔公司MaxPower 100mA总线001设备007:ID 046d:c52b Logitech,Inc.统一接收器MaxPower 98mA总线001设备005:ID 1a40:0101 Terminus Technology Inc.集线器MaxPower 100mA总线001设备010:ID 125f:c93a A-DATA Technology Co.,Ltd. 4GB笔式驱动器MaxPower 480mA总线001设备003:ID 04f2:b424 Chicony Electronics Co.,Ltd MaxPower 500mA总线001设备001:ID 1d6b:0002 Linux Foundation 2.0根集线器MaxPower 0mA

其他非常有用的命令是 USB设备, HWINFO,或者,例如,如果我们拥有设备的路径(在/ dev /内部),则可以向系统询问有关该设备及其必须经过的子系统的所有可能信息。 例如,如果我们连接USB硬盘,以便能够查看设备的使用方式,则需要SCSI驱动程序(对于/ dev / sdX),还需要USB存储驱动程序,该驱动程序可通过除其他中间系统外,属于集线器的USB端口已插入PCI端口。 我们可以看到的一切

$ udevadm info --query =路径--name = / dev / sdX --attribute-walk

o

$ udevadm信息-a -n / dev / sdX

如果我们想冒险,我们也可以输入 / sys /总线/ usb 并查看其中的所有内容,我们将看到很多信息,但是幸运的是,以上命令对所有这些信息进行了分类。

特权和设备

要执行此任务,我们将需要知道要使用的设备 重新连接。 为此,我们可以运行:

$ dmesg | tail [24年19月50日星期四04:2016:7] sd 0:0:0:3:附加的scsi通用sg0类型798339.431677 [7] sd 0:0:0:15806464:512:[sdc] 8.09 7.54字节逻辑块:( 798339.431840 GB / 7 GiB)[0] sd 0:0:798339.431848:7:[sdc]写保护已关闭[0] sd 0:0:00:00:[sdc]模式检测:00 00 798339.431988 7 [0] sd 0:0:798339.431996:7:[sdc]请求缓存数据失败[0] sd 0:0:798339.434157:1:2:[sdc]假设驱动器缓存:写入[798339.446812] sdc:sdc7 sdc0 [0] sd 0 :798360.808588:9660:3:[sdc]附加的SCSI可移动磁盘[​​798360.809353] ISO 9660扩展名:Microsoft Joliet Level 1991 [XNUMX] ISO XNUMX扩展名:RRIP_XNUMXA

在此输出中,我们将看到正在使用的设备是 SDC (sdc1和sdc2将是该磁盘中的分区)。 对于我将使用此设备的示例,在您的情况下,您将必须可视化拥有的帐户。

在下面的示例中,我将使用 须藤 以以下特权执行命令 。 尽管拥有足够权限的用户就足够了。 如果我们想查看必要的特权,请执行 ls 到设备:

$ ls -latr / dev / sdc brw-rw ---- 1个根磁盘8,32 Nov 24 19:50 / dev / sdc

在那里,我们看到所有者是根,组是 磁盘。 拥有一个属于组磁盘的用户就足够了。

方法1.将其像CD / DVD一样对待

这是最简单的。 当然,如果您使用GNU / Linux已有多年,那么在使用CD-ROM或DVD时,您会使用弹出命令。 好了,弹出用于打开CDROM,弹出-t用于关闭托盘。 好吧,如果我们在U​​SB设备之前执行此操作:

$ sudo弹出-t / dev / sdc

该设备应显示为好像我们已再次连接它。

方法2。拔出和虚拟插入

在某些系统上(只要硬件支持),当您安全地卸下USB设备时,该设备将停止供电,并且该设备将不再显示。 与执行操作时相同:

udisksctl关机-b / dev / sdc

在这种情况下, 的/ dev / SDC 这是我的设备,并使用此命令模拟了虚拟电源断开连接。

问题是,现在/ dev / sdc不存在,而且,如果我们看一下dmesg,我们将得到如下内容:

$ dmesg | 尾巴[281954.693298] USB 1-5:USB断开连接,设备号3

因此,如果我们尝试使用 喷射 不起作用。 注意:我已突出显示 USB 1-5 我们很快就会明白为什么。

如果您是远程工作,这可能是个好主意。 假设您有USB驱动器连接到备份。 在制作副本时,让系统知道已连接磁盘是很好的,但是,当我们一方面不使用它们时,我们必须 节约能源 并避免光盘磨损,因此最好减少电流, 我们不希望恶意应用看到它们的存在 这些磁盘,因此它们不会被感染。 (是的,在GNU / Linux中存在病毒)。

现在如何连接电流?

我们必须呼叫USB端口,为此有一个名为 集线器 (我链接到原始项目的一个分支,因为在这里修复了一个错误,该错误可以删除更多设备上的电流,而不仅仅是我们想要的设备)。 还有更多项目(例如 超人),但这与我们进行编译时没有依赖关系,它也只是hubpower.c文件。
首先,我们编译它,

$ gcc -o hubpower hubpower.c

现在,您还记得 dmesg的好吧,我们将要使用它们,我们将必须断开设备并重新连接它,如下所示:

$ sudo ./hubpower 1:1电源5断开端口5状态:0000关机$ sudo ./hubpower 1:1电源5断开端口5状态:0100开机

如果设备未检测到我们,我们可以尝试执行以下操作:

$ sudo ./hubpower 1:1将绑定驱动程序请求发送到内核

这样,我们将再次看到连接的USB设备。

如果我们不想要C程序...我在perl中有它

C程序很难编译和测试我们要执行的操作是否非常简单,因此我们可以在perl中编写的10行代码中尝试使用此小端口:

#!/ bin / perl需要“ sys / ioctl.ph”; $ device =“05“;打开(我的$ usbdev,”>“,” / dev / bus / usb/ 001/001“); $ data = pack(“ H *”,“ 23010800”。$ device。“ 000000FFFFFF8813”); ioctl($ usbdev,0xC0185500,$ data); $ data = pack(“ H *”,“ 23030800”。$ device。“ 000000FFFFFF8813”); ioctl($ usbdev,0xC0185500,$ data); 关闭($ usbdev);

我们必须尊重 $设备,端口号(在我的例子中是5),它是一个十六进制值,因此10将是A,11将是B,15将是F,16将是10 ...我们还必须监视设备并总线,我们可以从/ dev / bus / usb /访问001/001,数字必须以前导零开头,因为我们正在调用该文件。

如我们所见,密钥在ioctl()中,它是一个从文件系统中特殊文件中操作设备参数的函数。 在使用的十六进制值中,我们发现 0xC0185500,一个称为USBDEVFS_CONTROL的常量,我们将使用该常量将控制命令发送到USB设备,其他代码属于断开和连接请求(您可以在C语言程序中找到更多信息)。

方法3.隐藏和显示设备

断开设备连接的另一种方法是:

回声'1-5'| sudo tee / sys /总线/ usb /驱动程序/ usb /解除绑定

我们可以通过执行以下操作来恢复它:

回声'1-5'| sudo tee / sys /总线/ usb /驱动程序/ usb /绑定

此方法不会导致设备完全断开连接。 这只会使操作系统不与之对话,并且当计算机不想知道任何有关设备的信息时,许多设备都将进入低功耗模式,因为我们不会要求任何东西。

方法4.设备授权

这种方法的缺点是,在许多系统中,可以暂时停用更多设备,这不仅是我们所需要的,而且还会攻击整个USB集线器。 例如:

$ echo 0 | sudo tee / sys /总线/ usb /设备/ usb1 /授权的$ echo 1 | sudo tee / sys /总线/ usb /设备/ usb1 /授权

当然,我们可以连续运行其中的所有内容:

$ echo 0 | sudo tee / sys /总线/ usb /设备/ usb1 /授权; 回声1 | sudo tee / sys /总线/ usb /设备/ usb1 /授权

我们必须小心,如果有更多的磁盘连接到同一USB端口(并且几乎总是在我们的计算机中,内部连接到集线器的USB端口数量比我们看到的要多),因此会有多个端口具有相同的USB 父亲,以某种方式表示。

方法5。重新启动USB子系统

如果要重新启动USB子系统。 也就是说,一方面刷新所有USB设备,例如拔出所有USB设备,然后我们重新下载它们,然后重新加载USB内核模块:

$ sudo modprobe -r ehci_hcd; sudo modprobe ehci_hcd#用于USB2 $ sudo modprobe -r xhci_hcd; sudo modprobe xhci_hcd#用于USB3

尽管某些发行版(包括最新版本的Ubuntu及其衍生版本)具有 集成USB模块 并且无法下载。 另一方面,由于其他模块(打印机,存储设备,接口设备等)正在使用中,系统可能不允许我们下载它们,并且如果我们开始下载模块并破坏东西,则可能必须重新启动最后的计算机。 因此,我们可以通过另一种方式:

$ echo'0000:00:14.5'| sudo tee / sys /总线/ pci /驱动程序/ xhci_hcd /取消绑定$ echo'0000:00:14.5'| sudo tee / sys /总线/ pci /驱动程序/ xhci_hcd /绑定

要找到我们的设备,我们可以在/ sys / bus / pci / drivers / xhci_hcd里面做ls,将会出现几件事,我们必须寻找一个看起来像这样的东西 aaaa:bb:cc:dd.e。 您的USB端口可能不是xhci_hcd(USB3),而是ehci_hcd(USB2)


14条评论,留下您的评论

发表您的评论

您的电子邮件地址将不会被发表。 必填字段标有 *

*

*

  1. 负责数据:MiguelÁngelGatón
  2. 数据用途:控制垃圾邮件,注释管理。
  3. 合法性:您的同意
  4. 数据通讯:除非有法律义务,否则不会将数据传达给第三方。
  5. 数据存储:Occentus Networks(EU)托管的数据库
  6. 权利:您可以随时限制,恢复和删除您的信息。

  1.   克里斯蒂安

    优秀的文章!

    1.    汽油

      非常感谢克里斯蒂安! 希望您发现它有用。

  2.   安东尼奥·胡安

    在本文中,并没有说任何时候要放置它时,它都与正确的东西相反,您必须将其转过来……呵呵呵。 很棒的文章。

    1.    汽油

      谢谢安东尼奥·胡安! 好吧,当我尝试张贴在帖子中的所有内容时,您不知道我发生了多少次! 🙂

  3.   罗姆萨

    大。 上乘的物品。 它的标题应为:“只需拔下USB记忆棒,即可了解Linux系统。” 恭喜你
    来自马拉加的问候。

    1.    汽油

      好吧,是的,我不知道是否有人会开始用C编程并从本文中访问设备! 也来自马拉加! 我们无处不在🙂

  4.   HO2Gi

    令人印象深刻的文章。 您已经被这类材料所困扰。

    1.    汽油

      谢谢HO2Gi! 在我的个人博客上( http://totaki.com/poesiabinaria )还有很多风格的教程🙂

  5.   阿塔瓦尔帕

    朋友,非常感谢您。 我从linux开始,特别是从linux mint开始,并且遇到以下问题:在控制台中,我可以看到我的手机已连接到计算机,但未在文件管理器中连接。 因此,我不能将其用作调制解调器以连接到Internet。 我可以做什么?

    1.    加斯帕尔·费尔南德斯(Gaspar Fernandez)

      有些电话不允许您作为调制解调器进行连接,但可以进行网络共享

  6.   米拉佐

    优秀的文档!
    感谢您抽出宝贵的时间分享经验。
    我将其用作遇到的另一类问题的参考:断开Ubuntu中的USB端口(#42〜precision1-Ubuntu SMP Wed Aug 14 15:31:16 UTC 2013)
    有时系统会在dmesg中抛出-110并重新启动PC,这可能是由于连接设备的USB(USB3.0)的电源不足而导致的故障。

    现在,我使用lsusb -v检查设备的功率水平,但是它抛出2mA的信号,这是完全荒谬的……仅LED消耗的电流超过了该电流……

    我连接了华为E4 USB-8372G调制解调器,但是maxpower指示2mA,这是不可思议的,现在这种怀疑已经改变,并且出现了其他问题:
    MaxPower是设备或操作系统上默认提供的属性吗?
    USB端口将提供的最大功率的参数吗?
    如果是参数
    是否可以修改此参数并将其设置为USB端口提供的最大值(900mAh- 3.0 / 500mAh- 2.0)?
    如果不是参数,
    它是USB消耗的实时测量值(不太可能)吗?
    如果是另一种选择,请向我解释,因为我对参考信息有疑问。

    我对此MaxPower值有一些疑问,如果您有任何其他信息,我将不胜感激。

    lsusb -v 2> / dev / null | egrep“ ^总线| MaxPower | bDeviceClass | iProduct”

    总线002设备006:ID 1a86:7523勤恒电子HL-340 USB串行适配器
    bDeviceClass 255供应商特定的类
    iProduct 2 USB2.0-串行
    最大功率96mA
    总线002设备008:ID 12d1:14db华为技术有限公司
    bDeviceClass 2通信
    iProduct 2 HUAWEI_MOBILE
    最大功率2mA

  7.   匿名

    可以应用于Windows吗?

  8.   Chelo酒店

    非常感谢。 在我的外部磁盘上使用udisksctl power-off -b / dev / sdc足以解决头痛问题。 如果卸载本身可以选择执行此操作会更好吗?

  9.   玛丽莎

    天哪! 有人读过整个遗嘱吗? 和上面的板后我们仍然不知道如何关闭DAC / USB声音接口,打印机,图形输入板......好吧,没有什么不是秒杀或外部磁盘。 多么浪费时间...