AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 762514
Accepted
Robert Siemer
Robert Siemer
Asked: 2023-11-28 02:38:24 +0800 CST2023-11-28 02:38:24 +0800 CST 2023-11-28 02:38:24 +0800 CST

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

  • 772

我想知道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]
linux
  • 3 3 个回答
  • 248 Views

3 个回答

  • Voted
  1. don_crissti
    2023-11-29T02:27:47+08:002023-11-29T02:27:47+08:00

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

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

    最简单的方法是查看源代码,例如gnome-disk使用gduwindow.c两个函数:udisks_drive_call_eject ()和udisks_drive_call_power_off ()-记录在此处Eject(),其中表示它们分别调用和PowerOff()d-Bus 方法,这意味着您可以通过调用在 cli 上调用这些方法d-bus。
    示例:闪存驱动器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
  2. Best Answer
    Robert Siemer
    2023-12-13T08:11:33+08:002023-12-13T08:11:33+08:00

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

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

    端口是bus_nr-port.by.port.hub.chain.seperated.with.dots,即3-3或3-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以获取更多提示。(或者内核文档。)

    • 0
  3. Robert Siemer
    2023-11-28T03:13:00+08:002023-11-28T03:13:00+08:00

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

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

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

    一个粗暴的方法(它暂时杀死了我的鼠标和键盘,所以确保你可以启动这两个命令...)是重新绑定 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
    

    据透露,USB总线是由xhci_hcd和驱动的

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

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

    • -1

相关问题

  • 有没有办法让 ls 只显示某些目录的隐藏文件?

  • 使用键盘快捷键启动/停止 systemd 服务 [关闭]

  • 需要一些系统调用

  • astyle 不会更改源文件格式

  • 通过标签将根文件系统传递给linux内核

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve