我的 USB 设备出现了一些问题,我知道我可以通过拔下并重新插入该设备来解决该问题。
我尝试使用来自的脚本重置 USB 端口如何从命令行重置 USB 设备?但这似乎还不够。
我知道以前udisksctl power-off
当我想移除 USB 闪存驱动器时我会关闭它们,但当我将它用于通用设备时它会失败。
有没有办法可以对网络摄像头等通用 USB 设备执行类似的功能?
答案1
旋转减速
首先,您需要找到设备的 sysfs 路径(例如使用 lsusb)
如果 USB 设备的 sysfs 节点的完整路径是:
/sys/devices/pci0000:00/0000:00:14.0/usb1/1-13/1-13.2/1-13.2.1/
udisksctl power-off -b /dev/sdz
做的事情非常类似:
hdparm -Y /dev/sdz
echo 1 > /sys/block/sdz/device/delete
echo 1 > /sys/devices/pci0000:00/0000:00:14.0/usb1/1-13/1-13.2/1-13.2.1/remove
(为了改善脚本中的行为,您可以使用 /dev/disk/by-id/thingy-name01234 而不是 /dev/sdz)
然后删除:
/sys/devices/pci0000:00/0000:00:14.0/usb1/1-13/1-13.2/1-13.2.1/
目录。
父设备:
/sys/devices/pci0000:00/0000:00:14.0/usb1/1-13/1-13.2/
代表 USB 端口本身,现在处于“禁用”状态。
要重置它:
您可以告诉它更改应该使用的 USB 配置,并且为了使用该配置,它需要重置所有内容。
告诉它使用与当前相同的配置也应该重置它:
# cat /sys/devices/pci0000:00/0000:00:14.0/usb1/1-13/1-13.2/bConfigurationValue
1
# echo 1 >/sys/devices/pci0000:00/0000:00:14.0/usb1/1-13/1-13.2/bConfigurationValue
这样,端口就会重新启用,就像我再次插入设备一样(即 .../1-13.2.1 子目录重新出现,端口上的设备被探测,内核在那里发现一个 USB 存储设备,等等)。
重新扫描
然后(重新)扫描,例如查看新连接的设备(如果未自动找到)或者再次查看上述“已删除”的内容,例如:
# (for tmp in /sys/class/scsi_host/host*/scan; do echo '- - -' >> "$tmp"; done)
重置
重置设备:
for X in /sys/bus/usb/devices/*; do
echo "$X"
cat "$X/idVendor" 2>/dev/null
cat "$X/idProduct" 2>/dev/null
echo
done
列出它们,然后使用
sudo sh -c "echo 0 > /sys/bus/usb/devices/1-4.6/authorized"
sudo sh -c "echo 1 > /sys/bus/usb/devices/1-4.6/authorized"
重置它
在 USB 设备上启用智能
如果你不能获得智能值,
- 注意供应商/产品编号:
$ lsusb | grep -i seagate
Bus 003 Device 004: ID 0bd1:2027 Seagate RSS LLC Expansion HDD
请执行下列操作前重置总线配置(禁用端口后):
$ echo “0x0bd1:0x2027:u” | sudo tee /sys/module/usb_storage/parameters/quirks