使用Linux可以通过USB手动打开/关闭电源吗?
有一个外部USB冷却风扇(您用来冷却自己而不是PC的那种),能够从终端进行控制很好,因为我想将风扇放置在较远的地方。
我想这也可能对许多其他事情也有用,因为那里有很多USB玩具。也许是空气净化器,等等。(我听说它们并没有真正起作用)。
使用Linux可以通过USB手动打开/关闭电源吗?
有一个外部USB冷却风扇(您用来冷却自己而不是PC的那种),能够从终端进行控制很好,因为我想将风扇放置在较远的地方。
我想这也可能对许多其他事情也有用,因为那里有很多USB玩具。也许是空气净化器,等等。(我听说它们并没有真正起作用)。
Answers:
注意。此答案中的信息与较早的内核(最高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
sudo foo > bar
解析形式为命令的命令作为直接输出到bar
,然后foo
使用运行sudo
。重定向失败,因为它发生在您获得root访问权限之前。解决方案是使用sudo sh -c 'echo disabled > /sys/bus/usb/devices/usb1/power/wakeup'
,依此类推:获得root权限,运行新的地狱以执行重定向,然后将某些内容输出到重定向的文件描述符中。
根据该文档,内核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"
从字面上看,这意味着在设备变为空闲时暂停。
因此,除非您的风扇是可以被视为设备并由驱动程序控制的“智能”设备,否则您对当前内核可能不会有太多的运气。
echo "on" > "/sys/bus/usb/devices/usbX/power/control"
,但我认为您需要了解其原始目的。这里的自动挂起功能仅用于使空闲设备进入低功耗状态(可能会显示为关闭状态),仅在以后需要时通过主机或某些外部事件来恢复。那会自动发生(或应该发生)。实际上,端口本身从未真正关闭过。确实,请
dmesg | grep "usb"
然后使用“ usb”之后的数字即可,例如:usb 2-4.4: SerialNumber: A0848020
您将使用:/sys/bus/usb/devices/2-4.4/power/...
。另外,请确保未使用该设备。我创建了一个脚本来简化此过程
我发现以下解决方案至少对正确配置的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设备只是执行“冷重启”。一般想做的。我修补的集线器在这里
Intel的PowerTOP允许您实时切换USB外围设备等设备。这些被称为“可调参数”。
sudo apt install powertop
sudo powertop
请注意,不良表示设备始终处于开机状态。在预设的非活动保存时间(默认为2000ms)后,切换为“ 良好”将关闭设备。
有关如何使这些更改永久生效的详细信息,请参阅PowerTOP文档。
它为您生成配置脚本(与该线程上其他发布者所描述的差不多)。
注意:这些脚本不会影响USB引脚的电源(始终打开)。
这些仅发送驱动程序协议来激活和停用设备。
如果要控制引脚电源,则可以使用受支持的智能USB集线器,也可以使用更好的微控制器。
我想这样做,但是用我的USB硬件却做不到。我在这里写了一种怪异的方法:
http://pintant.cat/2012/05/12/power-off-usb-device/。
简而言之:我使用USB继电器打开/关闭另一条USB电缆的V CC ...
echo '2-1' |sudo tee /sys/bus/usb/drivers/usb/unbind
适用于ubuntu
人们之所以发布这样的问题,是由于令人恐惧的-确实是“ 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自动挂起。
希望这可以使禁用USB自动暂停功能更加轻松,并且可以编写更多脚本,
power/level
;使用power/control
代替。(power/wakeup
可以)。此外,它仅接受“自动”和“开启”,不再接受“暂停”。“自动”足够智能,如果在闲置状态下没有关闭电源,那是设备的故障。无论如何,您无法手动关闭电源。如需更多信息,请参见下面的答案被tlwhitec和内核的文档:kernel.org/doc/Documentation/usb/power-management.txt