我试图在每次引导时更改/sys/bus/usb/devices/4-3/power/wakeup
的值(根据我的lsusb
,它是键盘ID)。
默认值是:
# cat /sys/bus/usb/devices/4-3/power/wakeup
enabled
经典的“在线”编辑如预期的那样工作:
# echo disabled > /sys/bus/usb/devices/4-3/power/wakeup
# cat /sys/bus/usb/devices/4-3/power/wakeup
disabled
我使用的是系统发行版,所以我想使用编辑“临时文件”的系统方式
我创建了以下文件:
# cat /etc/tmpfiles.d/disable-usb-wakeup.conf
w /sys/bus/usb/devices/4-3/power/wakeup - - - - disabled
但是每次引导之后,我仍然有这个文件中的默认值(即已启用)。
我做错什么了吗?
编辑:
这里还有一个测试:
# cat /etc/tmpfiles.d/scheduler.conf
w /sys/block/sda/queue/scheduler - - - - deadline
这个很好!启动后我得到:
# 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
只包含一个单词?(即没有空位)发布于 2014-08-19 10:41:34
我不认为tmpfiles.d
是正确的方式去这里。您真的应该执行udev
规则。看:
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==""
...
然后继续,沿着父设备树走过去。但是考虑一下,仅仅使用上面的信息,您可以:
KERNEL=="host[0-5]", SUBSYSTEM=="scsi_host", ATTR{link_power_management_policy}="min_power"
我相信你大部分的剧本都是这样。我想,你应该把上面的内容写在第60条之后。实际上,您应该为剩下的部分做到这一点--只是脚本中的sleep
位就足够了--它意味着一种竞争条件。udev
是添加和设置这些参数的那个--它是填充sysfs
的那个。只要让它做它已经在做的工作。
而对于你的键盘,你应该做同样的-和背光。只需从udevadm
获取有关这些设备的所需信息,编写一些规则并对它们进行udevadm test
。
发布于 2013-01-13 19:49:23
[我最初的想法是,这可能是因为systemd使用流I/O,而不打算与proc或sys一起使用是不对。我的第二个假设,关于换行符的意义,也错了.]
我只是看了一下/usr/lib/systemd/system/systemd-tmpfiles-setup.service
,其中有几个部分可能会引起人们的兴趣:
[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方法很好,只需在引导过程的后面执行,可能需要:
Requires=multi-user.target
After=multi-user.target
这意味着编写您自己的服务文件;如果由于某种原因它不能工作,您可以为脚本编写一个服务文件,以便使用echo
来完成它。
发布于 2014-08-19 08:19:52
最近我了解到/etc/tmpfiles.d是在填充/sys之前处理的,因此您必须创建正确的udev规则,以便每当设备出现或.使用肮脏的方式(但如果您问我,这是一个更灵活的方法),然后创建一个运行脚本的服务,其中包含要写入/sys的命令。
下面是一个关于如何创建这样的脚本的示例,https://bbs.archlinux.org/viewtopic.php?id=148170可以填充如下内容:
#### #!/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
...
https://unix.stackexchange.com/questions/61159
复制相似问题