如何在命令行上断开和重新连接USB设备?

如何在命令行上断开和重新连接USB设备?

我想知道gnome-disk正在做什么,如何在命令行上执行相同的操作以及如何撤消gnome-disk所做的一切。 (它无法撤消它自己所做的一切。)

我已经做了一些实验,发现了以下情况:我玩的 USB 闪存拇指驱动器(“棒”)至少有 3 个“状态级别”可以切换,其中 2 个可以使用gnome-drive“弹出”按钮进行切换(开和关)和“断电”(仅关)。

从最高层到最低层,我发现:

  1. 喷射
    • gnome-drive的弹出按钮
    • 驱动器不会消失,无论是从 gnome-drive 还是其他地方
    • 命令行:eject /dev/sdb
    • 无法撤消gnome-drive
    • 撤消:eject --trayclose /dev/sdb
    • 内核消息 ( journalctl -k)
      • 喷射
        • sdb: detected capacity change from 30253056 to 0
      • 取消弹出
        • sd 4:0:0:0: [sdb] 30253056 512-byte logical blocks: (15.5 GB/14.4 GiB)
        • sdb: detected capacity change from 0 to 30253056
        • sdb: [partition details of my drive]
  2. (解除)绑定
    • 没有找到等效项gnome-drive
    • 命令行:echo 3-6 > /sys/bus/usb/drivers/usb/unbind
    • gnome-drive设备完全消失
    • 没有内核消息
    • lsusb -t仍然可以看到该设备,但不再显示类(“大容量存储”)或驱动程序(“usb-storage”)
    • /sys/bus/usb/drivers/usb/3-6目录消失了
    • 撤消与echo 3-6 > /sys/bus/usb/drivers/usb/bind
      • 这会引发内核消息
        • usb-storage 3-6:1.0: USB Mass Storage device detected
        • scsi host4: usb-storage 3-6:1.0
        • scsi 4:0:0:0: Direct-Access TOSHIBA TransMemory PMAP PQ: 0 ANSI: 6
        • sd 4:0:0:0: Attached scsi generic sg2 type 0
        • sd 4:0:0:0: [sdb] 30253056 512-byte logical blocks: (15.5 GB/14.4 GiB)
        • sd 4:0:0:0: [sdb] Write Protect is off
        • sd 4:0:0:0: [sdb] Mode Sense: 45 00 00 00
        • sd 4:0:0:0: [sdb] Write cache: disabled, read cache: enabled, doesn't support DPO or FUA
        • sdb: [partition details of my drive...]
        • sd 4:0:0:0: [sdb] Attached SCSI removable disk
  3. 关闭电源
    • gnome-drive的电源关闭按钮
    • 设备在所有东西上消失,就像物理拔掉插头一样
    • 与真正的拔掉插头没有区别
    • 内核消息:
      • usb 3-6: USB disconnect, device number 10
    • 如何通过命令行关闭电源?
    • 如何在不重新插入电源的情况下重新开机?

为了完整起见:重新插入棒会分配新的设备编号(11),总线和端口保持不变(3-6),并且显示这些内核消息:

usb 3-6: new high-speed USB device number 11 using xhci_hcd
usb 3-6: New USB device found, idVendor=0930, idProduct=6545, bcdDevi>
usb 3-6: New USB device strings: Mfr=1, Product=2, SerialNumber=3
usb 3-6: Product: TransMemory
usb 3-6: Manufacturer: TOSHIBA
usb 3-6: SerialNumber: C03FD5F7713EE2B1B000821E
[plus all kernel messages as quoted under (re-)bind above]

答案1

多年来一直有人提出类似的问题(与您标题中的问题相同),例如[1],[2],[3](如果您花时间搜索,可能有十多个...)由于代码的更改,现在大多数答案不再有效...
无论如何,我已经好几年没有使用过GNOME,但要专注于您的第一个问题邮政:

我想知道gnome-disk正在做什么,如何在命令行上执行相同的操作

最简单的方法是查看例如的源gnome-disk代码gduwindow.c使用两个函数:udisks_drive_call_eject ()udisks_drive_call_power_off ()-记录在这里它说他们调用Eject()和 分别是PowerOff()D-Bus 方法,这意味着您可以通过d-bus调用在 cli 上调用这些方法。
示例:闪存驱动器ADATA被标识为sda但未安装

sda           8:0    1 14,9G  0 disk 
├─sda1        8:1    1 14,6G  0 part

首先,获取对应的驱动器ID sda

busctl get-property org.freedesktop.UDisks2 /org/freedesktop/UDisks2/block_devices/sda org.freedesktop.UDisks2.Block Drive

这将打印类似

o "/org/freedesktop/UDisks2/drives/ADATA"

d-bus然后,您可以使用引号中的部分作为调用弹出或关闭驱动器电源的对象:

busctl call  org.freedesktop.UDisks2 /org/freedesktop/UDisks2/drives/ADATA org.freedesktop.UDisks2.Drive Eject 'a{sv}' 0

busctl call  org.freedesktop.UDisks2 /org/freedesktop/UDisks2/drives/ADATA org.freedesktop.UDisks2.Drive PowerOff 'a{sv}' 0

gdbus具体相同GNOME

gdbus call --system --dest org.freedesktop.UDisks2 --object-path /org/freedesktop/UDisks2/drives/ADATA --method org.freedesktop.UDisks2.Drive.Eject {}

gdbus call --system --dest org.freedesktop.UDisks2 --object-path /org/freedesktop/UDisks2/drives/ADATA --method org.freedesktop.UDisks2.Drive.PowerOff {}

请注意,如果安装了文件系统(驱动器正在使用),这些命令将出错。另外,正如您在文档中看到的,没有un-ejectorun-power-off方法,这就是为什么gnome-disk无法撤消任何这些操作的原因。
我不确定为什么有人会使用上面的命令(我不太明白eject()在闪存驱动器的上下文中的意义,但这是另一个讨论)...
我(像许多其他人一样)卸载文件系统

udisksctl unmount -b /dev/sda1

进而关闭驱动器电源

udisksctl power-off -b /dev/sda

为了重新连接已关闭电源的驱动器,您必须运行某种 USB 端口重置/重新扫描/重新配置(普通用户无法完成)。其他帖子中的解决方案都不适合我使用内核 6.6.2,所以我现在无法提出任何建议......

答案2

如何在命令行下关闭电源?

echo 1 > /sys/bus/usb/devices/3-2.1/port/disable

端口是bus_nr-port.by.port.hub.chain.seperated.with.dots,即3-33-2.4.6。在这两个示例中,端口位于总线 3 上。第一个示例只是端口 3,第二个示例是两个集线器链,其中第一个集线器位于总线 3 的端口 2 中,第二个集线器位于第一个集线器的端口 4 中。该设备位于第二个集线器的端口 6 上。

如何在不重新插入电源的情况下重新开机?

echo 0 > '/sys/devices/pci0000:00/0000:00:14.0/usb3/3-0:1.0/usb3-port3/disable'

或者因为3-2.1它可能是

echo 0 > '/sys/devices/pci0000:00/0000:00:14.0/usb3/3-2/3-2:1.0/3-2-port1/disable'

当端口启用时,您可以pwd -P在该文件所在的目录中disable预先查看相应集线器的端口管理界面的真实位置。对于建立 USB 总线的主机控制器列表来说,ls -l /sys/bus/usb/devices/usb*是一个好的开始。

也可以看看如何解释lsusb了解更多提示。 (或者内核文档.)

答案3

如何在命令行下关闭电源?

更新:我终于发现了——请参阅我的其他答案。

如何在不重新插入电源的情况下重新开机?

一个粗暴的方法(它暂时杀死了我的鼠标和键盘,所以确保你可以启动这两个命令......)是重新绑定 USB 主机 PCI 设备。这似乎会像启动或物理重新插入一样重新启动所有端口。至少对于我来说:

echo 0000:00:14.0 > /sys/bus/pci/drivers/xhci_hcd/unbind
echo 0000:00:14.0 > /sys/bus/pci/drivers/xhci_hcd/bind

当然,该数字需要根据您的环境进行调整。看看你有什么:

lspci -t

透露xhci_hcdUSB总线由和驱动

ls -la /sys/bus/pci/drivers/xhci_hcd/ | grep ^l

仅显示0000:00:14.0为设备。

相关内容