ean*_*ang 15 arch-linux systemd sysfs
我试图/sys/bus/usb/devices/4-3/power/wakeup
在每次启动时更改 的值(根据我的 4-3 lsusb
,这是键盘 ID)。
默认值为:
# cat /sys/bus/usb/devices/4-3/power/wakeup
enabled
Run Code Online (Sandbox Code Playgroud)
经典的“在线”编辑按预期工作:
# echo disabled > /sys/bus/usb/devices/4-3/power/wakeup
# cat /sys/bus/usb/devices/4-3/power/wakeup
disabled
Run Code Online (Sandbox Code Playgroud)
我正在使用 systemd 发行版,所以我想使用systemd 方式来编辑“临时文件”
我创建了以下文件:
# cat /etc/tmpfiles.d/disable-usb-wakeup.conf
w /sys/bus/usb/devices/4-3/power/wakeup - - - - disabled
Run Code Online (Sandbox Code Playgroud)
但每次启动后我仍然在这个文件中使用默认值(即启用)
难道我做错了什么?
编辑:
这是另一个测试:
# cat /etc/tmpfiles.d/scheduler.conf
w /sys/block/sda/queue/scheduler - - - - deadline
Run Code Online (Sandbox Code Playgroud)
这个很好用!启动后我得到:
# cat /sys/block/sda/queue/scheduler
noop [deadline] cfq
Run Code Online (Sandbox Code Playgroud)
(默认的是 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
只包含一个词?(即没有空格)我不相信这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==""
...
Run Code Online (Sandbox Code Playgroud)
然后继续,沿着父设备树向上走。但请考虑一下,仅使用上述信息,您可以执行以下操作:
KERNEL=="host[0-5]", SUBSYSTEM=="scsi_host", ATTR{link_power_management_policy}="min_power"
Run Code Online (Sandbox Code Playgroud)
我相信这适用于您的大部分脚本。我想你会想把上面的放在第 60 条规则之后。实际上,您应该为其余部分执行此操作 -sleep
脚本中的一点就足够了 - 它意味着竞争条件。udev
是添加和设置这些参数的一个 - 它是填充sysfs
. 只要求它做它已经在做的工作。
对于您的键盘,您绝对应该这样做 - 以及背光。只需从 获取您需要的有关这些设备的信息udevadm
,编写一些规则和udevadm test
它们。
[我最初的想法是,这可能是因为 systemd-tmpfiles 使用流 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
Run Code Online (Sandbox Code Playgroud)
“想要”、“之后”和“之前”提供了有关何时发生这种情况的一些信息;我认为您的设备此时已注册,但后续可能会重置 sysfs 值。
最有用的位是 ExecStart 行,因为这是负责此服务的实际命令。这实际上在man systemd-tmpfiles
:
例如,在引导期间执行以下命令行以确保根据配置文件删除和创建所有临时和易失目录:
systemd-tmpfiles --删除 --创建
因此,要对此进行测试,请将 sysfs 值设置为“enabled”,然后尝试运行systemd-tmpfiles --create
它将处理 /etc/tmpfiles.d 中的“w”指令。 如果这有效(应该!),那么您就知道 systemd-tmpfile 方法很好,只是您必须稍后在启动过程中执行此操作,也许可以使用:
Requires=multi-user.target
After=multi-user.target
Run Code Online (Sandbox Code Playgroud)
这意味着编写您自己的服务文件;如果由于某种原因它不起作用,您始终可以为脚本编写一个服务文件来使用echo
.
归档时间: |
|
查看次数: |
11592 次 |
最近记录: |