首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >是如何工作的?

是如何工作的?
EN

Unix & Linux用户
提问于 2013-01-13 18:57:13
回答 4查看 12.3K关注 0票数 16

我试图在每次引导时更改/sys/bus/usb/devices/4-3/power/wakeup的值(根据我的lsusb,它是键盘ID)。

默认值是:

代码语言:javascript
运行
复制
# cat /sys/bus/usb/devices/4-3/power/wakeup
enabled

经典的“在线”编辑如预期的那样工作:

代码语言:javascript
运行
复制
# echo disabled > /sys/bus/usb/devices/4-3/power/wakeup
# cat /sys/bus/usb/devices/4-3/power/wakeup
disabled

我使用的是系统发行版,所以我想使用编辑“临时文件”的系统方式

我创建了以下文件:

代码语言:javascript
运行
复制
# cat /etc/tmpfiles.d/disable-usb-wakeup.conf 
w /sys/bus/usb/devices/4-3/power/wakeup - - - - disabled

但是每次引导之后,我仍然有这个文件中的默认值(即已启用)。

我做错什么了吗?

编辑:

这里还有一个测试:

代码语言:javascript
运行
复制
# cat /etc/tmpfiles.d/scheduler.conf 
w /sys/block/sda/queue/scheduler - - - - deadline

这个很好!启动后我得到:

代码语言:javascript
运行
复制
# cat /sys/block/sda/queue/scheduler 
noop [deadline] cfq 

(默认的是cfq调度程序)

为什么这个有用而另一个不行?

  • 因为/sys/bus/usb/devices/4-3/power/wakeup/sys/devices/pci0000:00/0000:00:12.1/usb4/4-3/的符号链接?
  • 因为/sys/bus/usb/devices/4-3/power/wakeup只包含一个单词?(即没有空位)
EN

回答 4

Unix & Linux用户

发布于 2014-08-19 10:41:34

我不认为tmpfiles.d是正确的方式去这里。您真的应该执行udev规则。看:

代码语言:javascript
运行
复制
udevadm info -a -p /sys/class/scsi_host/host*

Udevadm info starts with the device specified by the devpath and then
walks up the chain of parent devices. It prints for every device
found, all possible attributes in the udev rules key format.
A rule to match, can be composed by the attributes of the device
and the attributes from one single parent device.

  looking at device '/devices/pci0000:00/0000:00:11.0/ata1/host0/scsi_host/host0':
    KERNEL=="host0"
    SUBSYSTEM=="scsi_host"
    DRIVER==""
    ATTR{unchecked_isa_dma}=="0"
    ATTR{state}=="running"
    ATTR{cmd_per_lun}=="1"
...
    ATTR{ahci_host_version}=="10200"
    ATTR{prot_guard_type}=="0"
    ATTR{eh_deadline}=="off"
    ATTR{link_power_management_policy}=="max_performance"
    ATTR{host_busy}=="0"

  looking at parent device '/devices/pci0000:00/0000:00:11.0/ata1/host0':
    KERNELS=="host0"
    SUBSYSTEMS=="scsi"
    DRIVERS==""
...

然后继续,沿着父设备树走过去。但是考虑一下,仅仅使用上面的信息,您可以:

代码语言:javascript
运行
复制
KERNEL=="host[0-5]", SUBSYSTEM=="scsi_host", ATTR{link_power_management_policy}="min_power"

我相信你大部分的剧本都是这样。我想,你应该把上面的内容写在第60条之后。实际上,您应该为剩下的部分做到这一点--只是脚本中的sleep位就足够了--它意味着一种竞争条件。udev是添加和设置这些参数的那个--它是填充sysfs的那个。只要让它做它已经在做的工作。

而对于你的键盘,你应该做同样的-和背光。只需从udevadm获取有关这些设备的所需信息,编写一些规则并对它们进行udevadm test

票数 5
EN

Unix & Linux用户

发布于 2013-01-13 19:49:23

[我最初的想法是,这可能是因为systemd使用流I/O,而不打算与proc或sys一起使用是不对。我的第二个假设,关于换行符的意义,也错了.]

我只是看了一下/usr/lib/systemd/system/systemd-tmpfiles-setup.service,其中有几个部分可能会引起人们的兴趣:

代码语言:javascript
运行
复制
[Unit]
Description=Recreate Volatile Files and Directories
Documentation=man:tmpfiles.d(5)
DefaultDependencies=no
Wants=local-fs.target
After=systemd-readahead-collect.service systemd-readahead-replay.service local-fs.target
Before=sysinit.target shutdown.target

[...]

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/bin/systemd-tmpfiles --create --remove

“希望”、“之后”和“之前”提供了一些有关何时发生这种情况的信息;我认为此时您的设备已经注册,但是后面可能会有一些重置sysfs值的内容。

最有用的位是ExecStart行,因为这是解释此服务的实际命令。在man systemd-tmpfiles中实际上提到了这一点:

例如,在引导期间执行以下命令行,以确保根据配置文件删除和创建所有临时和易失性目录: systemd-tmpfiles -remove-create

因此,要测试这一点,请将sysfs值设置为“已启用”,然后尝试运行systemd-tmpfiles --create,它将在/etc/tmpfiles.d中处理'w‘指令。如果这有效(它应该!),那么您就知道systemd-tmpfile方法很好,只需在引导过程的后面执行,可能需要:

代码语言:javascript
运行
复制
Requires=multi-user.target
After=multi-user.target

这意味着编写您自己的服务文件;如果由于某种原因它不能工作,您可以为脚本编写一个服务文件,以便使用echo来完成它。

票数 2
EN

Unix & Linux用户

发布于 2014-08-19 08:19:52

最近我了解到/etc/tmpfiles.d是在填充/sys之前处理的,因此您必须创建正确的udev规则,以便每当设备出现或.使用肮脏的方式(但如果您问我,这是一个更灵活的方法),然后创建一个运行脚本的服务,其中包含要写入/sys的命令。

下面是一个关于如何创建这样的脚本的示例,https://bbs.archlinux.org/viewtopic.php?id=148170可以填充如下内容:

代码语言:javascript
运行
复制
#### #!/bin/sh

sleep 2

#### # Enforce energy tweaks provided by PowerTop
echo min_power > /sys/class/scsi_host/host0/link_power_management_policy;
echo min_power > /sys/class/scsi_host/host1/link_power_management_policy;
echo min_power > /sys/class/scsi_host/host2/link_power_management_policy;
echo min_power > /sys/class/scsi_host/host3/link_power_management_policy;
echo min_power > /sys/class/scsi_host/host4/link_power_management_policy;
echo min_power > /sys/class/scsi_host/host5/link_power_management_policy;
echo 1 > /sys/module/snd_hda_intel/parameters/power_save;
echo auto > /sys/bus/pci/devices/0000:7f:00.1/power/control;
echo auto > /sys/bus/pci/devices/0000:01:00.1/power/control;

...

echo 4880 > /sys/class/backlight/intel_backlight/brightness

...
票数 0
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/61159

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档