使用Linux控制USB电源(开/关)


164

使用Linux可以通过USB手动打开/关闭电源吗?

有一个外部USB冷却风扇(您用来冷却自己而不是PC的那种),能够从终端进行控制很好,因为我想将风扇放置在较远的地方。

我想这也可能对许多其他事情也有用,因为那里有很多USB玩具。也许是空气净化器,等等。(我听说它们并没有真正起作用)。


9
让我回顾一下>> 2.6.38的Linux:现在不建议使用该文件 power/level ;使用 power/control 代替。(power/wakeup可以)。此外,它仅接受“自动”和“开启”,不再接受“暂停”。“自动”足够智能,如果在闲置状态下没有关闭电源,那是设备的故障。无论如何,您无法手动关闭电源。如需更多信息,请参见下面的答案tlwhitec和内核的文档:kernel.org/doc/Documentation/usb/power-management.txt
teika kazura


2
此功能确实值得一个不错的GUI
mikebabcock 2014年

需要任何特殊的硬件吗?这是不是从答案很清楚,
Vojtěch多纳尔

Answers:


63

注意。此答案中的信息与较早的内核(最高2.6.32)相关。有关较新内核的信息,请参见tlwhitec的答案

# disable external wake-up; do this only once
echo disabled > /sys/bus/usb/devices/usb1/power/wakeup 

echo on > /sys/bus/usb/devices/usb1/power/level       # turn on
echo suspend > /sys/bus/usb/devices/usb1/power/level  # turn off

(您可能需要将usb1更改为usb n

资料来源:Documentation / usb / power-management.txt.gz


1
哇,谢谢你。我以为无论如何我都必须通过libUSB。知道如何获取所连接设备的名称吗?
kamziro 2011年

根据这篇文章,没有特殊的硬件是不可能的吗? blog.andrew.net.au/2009/01/17
NoBugs 2011年

7
即使使用sudo,我也会收到权限被拒绝的错误!
Wally 2014年

3
对我来说一样,即使使用了sudo,其“权限也被拒绝”
Raulp

2
拒绝权限是因为sudo foo > bar解析形式为命令的命令作为直接输出到bar,然后foo使用运行sudo。重定向失败,因为它发生在您获得root访问权限之前。解决方案是使用sudo sh -c 'echo disabled > /sys/bus/usb/devices/usb1/power/wakeup',依此类推:获得root权限,运行新的地狱以执行重定向,然后将某些内容输出到重定向的文件描述符中。

60

根据该文档,内核2.6.32对USB电源管理进行了一些更改,这些更改似乎在2.6.38中解决了。现在,您需要等待设备变为空闲状态,这由特定的设备驱动程序控制。驱动程序需要支持它,否则设备将永远无法达到此状态。不幸的是,现在用户没有机会强制这样做。但是,如果幸运的话,您的设备可能会变得空闲,那么要关闭此功能,您需要:

echo "0" > "/sys/bus/usb/devices/usbX/power/autosuspend"
echo "auto" > "/sys/bus/usb/devices/usbX/power/level"

或者,对于2.6.38及更高版本的内核:

echo "0" > "/sys/bus/usb/devices/usbX/power/autosuspend_delay_ms"
echo "auto" > "/sys/bus/usb/devices/usbX/power/control"

从字面上看,这意味着在设备变为空闲时暂停

因此,除非您的风扇是可以被视为设备并由驱动程序控制的“智能”设备,否则您对当前内核可能不会有太多的运气。


看来这将导致USB设备连续断电...(?)在此工作之后,应如何恢复电源?我的目标是重新启动设备一次,而不是永久更改其挂起配置。
matanster

4
恢复已暂停的设备,您可以使用再次禁用“自动暂停”功能echo "on" > "/sys/bus/usb/devices/usbX/power/control",但我认为您需要了解其原始目的。这里的自动挂起功能仅用于使空闲设备进入低功耗状态(可能会显示为关闭状态),仅在以后需要时通过主机或某些外部事件来恢复。那会自动发生(或应该发生)。实际上,端口本身从未真正关闭过。确实,请
务必

4
我可以确认它适用于内核> 3.10。只需确保您使用的设备“ id”是正确的:,dmesg | grep "usb"然后使用“ usb”之后的数字即可,例如:usb 2-4.4: SerialNumber: A0848020您将使用:/sys/bus/usb/devices/2-4.4/power/...。另外,请确保未使用该设备。我创建了一个脚本来简化此过程
lepe 2016年

有没有一种方法可以保存此配置,以便每次插入时都不会更改为默认值?我有一台设备,需要将电源控制设置为“开”才能充电。
quickblueblur

@quickblueblur 在我看来像是udev规则
tlwhitec

24

我发现以下解决方案至少对正确配置的Terminus FE 1.1 USB集线器芯片有效:

1.要关闭集线器所有USB端口的电源,可以使用以下方法将集线器与内核解除绑定:

echo "1-4.4.4" > /sys/bus/usb/drivers/usb/unbind

重新打开电源-您可以使用

echo "1-4.4.4" > /sys/bus/usb/drivers/usb/bind

2.分别切换每个端口的电源比较棘手:我能够使用hubpower来控制每个端口-但是它有一个缺点:hubpower首先会断开usbdevfs,这会导致所有USB设备与系统断开连接,至少是在ubuntu上断开连接:

usb_ioctl.ioctl_code = USBDEVFS_DISCONNECT;
rc = ioctl(fd, USBDEVFS_IOCTL, &usb_ioctl);

ioctl禁用此功能的情况下,我无需断开所有设备即可关闭单个端口的电源-但电源会立即重新打开(可能是由于内核看到未初始化的设备),这导致USB设备只是执行“冷重启”。一般想做的。我修补的集线器在这里


确认bind / unbind条目可在Linux内核2.6.34,ICH8芯片组和Ubuntu 10.04上运行。
user1357196

5
无论芯片组如何,bind / unbind都不会关闭USB端口的电源。该设备仍然可以通电...
themihai 2014年

1
鼠标激光关闭,键盘无法打字,调制解调器停止闪烁-在我的平台上都很好
eri

24

Intel的PowerTOP允许您实时切换USB外围设备等设备。这些被称为“可调参数”。

sudo apt install powertop
sudo powertop
  • 移至“可调项”。
  • 向下滚动到您的设备。
  • 按Enter键切换省电模式( /

在此处输入图片说明

请注意,不良表示设备始终处于开机状态。在预设的非活动保存时间(默认为2000ms)后,切换为“ 良好”将关闭设备。

有关如何使这些更改永久生效的详细信息,请参阅PowerTOP文档。
它为您生成配置脚本(与该线程上其他发布者所描述的差不多)。

注意:这些脚本不会影响USB引脚的电源(始终打开)。
这些仅发送驱动程序协议来激活和停用设备。

如果要控制引脚电源,则可以使用受支持的智能USB集线器,也可以使用更好的微控制器


2
太棒了!:DI认为这是用户友好的方法(尽管在较低级别上,它的操作与其他答案中概述的方法相同。)谢谢,并且您的答案可能会达到顶峰;)
Matyas

1
感谢您的回答。我必须从哪里开始挖掘以更改预设的非活动保存时间?
mikezter '16

如先前的发帖人所述,内核文档在此处: kernel.org/doc/Documentation/usb/power-management.txt
Dominic Cerisano

10

您可以使用我的工具uhubctl来控制兼容USB集线器的每个端口的USB电源。


osx上的好工具,但对我来说在debian上找不到任何“受支持的智能中心”。
抖动

1
在Linux上,您需要以root身份(在sudo下)运行它,或配置udev设备权限。您的Linux主机也可能没有连接兼容的集线器。
mvp

顺便说一句。
抖动


5
echo '2-1' |sudo tee /sys/bus/usb/drivers/usb/unbind

适用于ubuntu


1
您的解决方案是您唯一的选择。我正在使用acer make笔记本电脑12.04LTS Ubuntu。
RicoRicochet 2014年

1
不关闭设备电源,仅将其从设备列表中删除。如何关闭USB端口的电源?
rustyx 2014年

1
这也是唯一适用于我的Wacom Intuos5 touch M平板电脑断电而无需拔下电源的解决方案(在Fedora 28上)
user1738984

2

USB 5v电源始终处于打开状态(即使在关闭计算机,在某些计算机和某些端口上也是如此)。您可能需要使用某种开关对Arduino进行编程,并通过插入USB的串行库通过串行库进行控制。电脑。

换句话说,开关教程和教程通过串行库与通过USB插入的Arduino通信的组合。


2

人们之所以发布这样的问题,是由于令人恐惧的-确实是“ EVIL ”-USB Auto-Suspend“ 功能 ”。

自动挂起将关闭“空闲” USB设备的电源,除非该设备的驱动程序正确支持此功能,否则该设备可能无法连接。因此,打开/关闭USB端口的电源是问题的征兆,而不是问题本身。

我将向您展示如何全局禁用自动挂起,而无需手动打开和关闭USB端口:

简短答案:

你不需要编辑“ autosuspend_delay_ms ”独立:USB autosuspend可全局和禁用持续使用下面的命令:

sed -i 's/GRUB_CMDLINE_LINUX_DEFAULT="/&usbcore.autosuspend=-1 /' /etc/default/grub

update-grub

systemctl reboot

在“长答案”的结尾处是一个Ubuntu 18.04屏幕截图,它说明了如何实现我的结果。

长答案:

确实,USB Power Management Kernel Documentation(USB电源管理内核文档)指出autosuspend已被弃用,而在原来的位置“ autosuspend_delay_ms ”用于禁用USB autosuspend:

"In 2.6.38 the "autosuspend" file will be deprecated
and replaced by the "autosuspend_delay_ms" file."

无论其我的测试显示设置usbcore.autosuspend=-1的/ etc /默认/ grub中,如下可以作为一个全球切换为USB autosuspend functionality-你就不要需要编辑个人“ autosuspend_delay_ms ”文件。

上面链接的同一文档指出,值“ 0”已启用,负值禁用

power/autosuspend_delay_ms

    <snip> 0 means to autosuspend
    as soon as the device becomes idle, and negative
    values mean never to autosuspend.  You can write a
    number to the file to change the autosuspend
    idle-delay time.

在下面带注释的Ubuntu 18.04屏幕截图中,说明了如何实现我的结果(并且可重复),请在autosuspend_delay_ms中将默认值标记为“ 0”(启用)。

然后请注意,usbcore.autosuspend=-1在Grub中设置后,重新启动后这些值现在为负(禁用)。这将使我免于编辑各个值的麻烦,并且现在可以编写脚本来禁用USB自动挂起。

screengrab:自动暂停值在全局编辑之前和之后

希望这可以使禁用USB自动暂停功能更加轻松,并且可以编写更多脚本,


1

连接Android手机时出现问题,无法打开手机充电,因为先打开电源再关闭... PowerTop让我找到此设置,对解决问题很有用(自动值引起了问题):

echo 'on' | sudo tee /sys/bus/usb/devices/1-1/power/control
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.