Linux USB断电唤醒技巧 (linux u 断电 wakeup)

随着科技的不断发展,USB设备已经成为了我们家庭或办公室中不可或缺的设备之一。USB设备给我们的生活带来了很多便利,如鼠标、键盘、摄像头、打印机、外置硬盘等等。在Linux中,当我们连接USB设备到计算机上时,计算机将自动检测并安装驱动程序,然后开始与设备进行通讯。然而,有些时候我们需要在计算机休眠或关机时,通过USB设备来激活计算机。这时,就需要我们学习如何使用。

一、了解USB设备的休眠模式

USB设备在连到计算机的情况下有3种状态: 运行、挂起、休眠。在Linux中,一般情况下,USB设备默认为挂起状态,这是为了降低设备的功耗。当设备长时间不使用时,由于计算机会自动将设备挂起,而设备进入休眠状态。在USB设备进入休眠状态后,它的电源将被断开,因此将无法通过USB设备唤醒计算机。

二、使用USB_WAKEUP

USB_WAKEUP是Linux内核中用来解决USB设备断电唤醒机制的一个程序,主要用于在休眠状态下通过USB设备唤醒计算机。在开启USB_WAKEUP功能之前需要进行如下操作:

1. 使用工具lsu查看USB设备的相关信息;

2. 根据设备厂商与型号获取设备的venderid与productid;

3. 使用命令sudo modprobe uas_uhci rescan=1让USB设备重载。

在确定相关信息后,可以使用如下命令开启USB_WAKEUP功能:

sudo sh -c ‘for i in /sys/bus/u/devices/*/power/wakeup; do echo enabled > $i; done’

当需要关闭USB_WAKEUP功能时,只需执行以下命令即可:

sudo sh -c ‘for i in /sys/bus/u/devices/*/power/wakeup; do echo disabled > $i; done’

三、编写udev规则

udev是Linux下的一种驱动管理机制,它允许用户通过udev规则控制设备的属性和行为,包括USB设备联机与断电。为了让USB设备在断电时能够唤醒计算机,需要在Linux下创建一个udev规则。

1. 打开/etc/udev/rules.d目录;

2. 使用文本编辑器创建一个以50-u-wakeup.rules命名的文件,输入以下内容:

ACTION==”add”, SUBSYSTEM==”u”, ATTRS{idVendor}==”1234″ , ATTRS{idProduct}==”abcd”, RUN+=”/bin/sh -c ‘echo enabled > %S%p/power/wakeup'”

此值中的idVendor与idProduct是USB设备的veniderid与productid,需要将它们改为实际设备的具体信息。

3. 使用命令sudo udevadm control –reload-rules重载udev规则。

通过以上步骤,USB设备就可以通过断电唤醒计算机了。

四、测试效果

使用udev规则来控制USB设备的断电唤醒机制,理论上可以在任何时候使用USB设备来唤醒计算机。这是因为在Linux中,当USB设备连接上计算机时,udev规则会自动与内核进行交互,以实现USB设备的连接和断开。为了确保这种方法的可行性,可以在计算机还没有进入休眠状态时进行测试,测试效果如下:

1. 连接USB设备到计算机上;

2. 输入命令sudo systemctl suspend让计算机进入休眠状态;

3. 使用USB设备进行测试,观察计算机是否能在之一时间唤醒。

在测试中,如果计算机能够在之一时间唤醒,说明USB设备的断电唤醒机制已经成功地解决了这个问题。

在Linux中使用USB设备进行断电唤醒计算机,可以带来很大的便利,尤其是在需要灵活控制自己计算机的时候。不过,在使用USB设备断电唤醒机制之前,需要注意设备是否支持该功能,可以通过查询设备的官方说明或使用其他工具进行测试。此外,还需要在操作系统中启用USB_WAKEUP功能并编写udev规则,以实现自动控制USB设备的联机和断电。在以上过程中需要保证操作的正确性与稳定性,以避免对计算机造成不必要的影响。

相关问题拓展阅读:

linux 下 USB的热插拔问题?

目前一些主流桌面系统(如Gnome,KDE,Xfce)的较新版本都支持自动挂载(mount)U盘了. 一个流传很广的说法是 HAL(硬件抽象层) 起了自动挂载的作用, 其实这是误解. 对于2.6内核而言, udev 才是直接从内核接收设备连接或断开信息的主体.

udev 从内核得到信息后,根据一些简单规则(注意,是简单规则), 在 /dev 目录下创建相应的设备节点, 并进行某些相关操作. HAL 所做的事情是在 udev 的规则中加上一条(或几条), 让 udev 把收到的信息也传递给 HAL. 接派颤裂下来, HAL 用更为复杂的规则来匹配和描述当前连接着的硬件. 举一个简单的例子, udev 知道的是U盘已经连接了并且有一个分区; 而 HAL 能更进一步知道这个分区的卷标名及其它一些信息.

上面这些都还不能自动挂载U盘. Gnome 等桌面系统会启动一个守护进程(daemon), 通过 D-Bus 从 HAL 那里得到硬件信息, 如果发现有U盘连接了就由它们来挂载它(实际是调用 pmount).

问题是, 如果你不想用Gnome,KDE,Xfce这些桌面系统, 那么由它们提供的U盘自动挂载功能也洞郑就失效了,有解决办法么?

解决的办法之一, 便是让 udev 来干这件事情!

udev 的主要功能是实时地在 /dev 目录下创建和删除设备节点, 但它也能在创建节点的同时, 执行一个额外地程序. 具体的原理这里就不详说了, 有时间请仔细阅读 Writing udev rules 这篇文章. 写规则时特别注意 KERNEL, SUBSYSTEM 等这些关键字单数和复数(最后有没有’S’)的区别. 复数(比如 KERNELS)表示你想用父设备的属性来匹配, 单数(比如 KERNEL)是要匹配设备本身的属性.

在 /etc/udev/rules.d 目录下创建文件 10_ukey.rules, 其内容如下

KERNEL==”sda1″, SUBSYSTEM==”block”, RUN+=”/root/umount.sh”

然后, 在 /root 目录中创建文件 umount.sh, 其内容为

#!/bin/bash

LOG=/var/log/u-hotplug.log

lap=$(date –rfc-3339=ns)

echo “$lap: $DEVPATH requesting $ACTION” >> $LOG

if

then

mount -t vfat -o umask=000,noatime,async,codepage=936,iocharset=gb2312 \

/dev/sda1 /media/ukey

elif

then

umount -l /media/ukey

fi

并把该文件属性设置为可执行, chmod a+x umount.sh

注意, 如果你的 linux 上 locale 是 zh_CN.utf-8, 需要把上面的 iocharset=gb2312 改成 iocharset=utf8

最后创建目尘闭录, mkdir /media/ukey

这是一个非常简单但可用的例子. U盘插上后自动 mount 到 /media/ukey , 拔出后自动 umount. 你可以查看 /var/log/u-hotplug.log , 里面会有些简单的调用记录.

关于linux u 断电 wakeup的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。


数据运维技术 » Linux USB断电唤醒技巧 (linux u 断电 wakeup)