web-dev-qa-db-ja.com

systemd-tmpfilesはどのように機能しますか?

ブートのたびに/sys/bus/usb/devices/4-3/power/wakeupの値を変更しようとしています(私のlsusbに応じて4〜3です。これはキーボード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

私はsystemdディストリビューションを使用しているので、 systemd-way to edit "temp files" を使用したいと思います。

次のファイルを作成しました。

# 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に含まれる単語は1つだけですか? (つまり、スペースなし)
15
eang

信じられない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それら。

5
mikeserv

[これは、systemd-tmpfilesがストリームI/Oを使用しており、procまたはsysで使用するためのものではなかったという私の当初の考えは wrong です。改行の重要性に関する私の2番目の仮説も間違っていました...]

私は/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値をリセットする何かsubsequentが存在する可能性があります。

最も役立つビットは、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を使用してスクリプトを実行するためのサービスファイルをいつでも作成できます。

2
goldilocks

これは少しやり過ぎかもしれませんが、私の場合、他の回答で述べられている両方の方法が失敗していました。 tmpfiles.d/sys/エントリが入力される前に変更を行いますudevメソッドはエントリ(仮想ネットワークデバイスbr0)を見つけられませんでした。そのため、新しいサービスファイルを作成しました。新しいファイル/etc/systemd/system/disable-usb-wakeup.serviceを作成し、以下を内部に配置するだけです。

[Unit]
Description=Set multicast snoop to off
After=network-online.target

[Service]
Type=oneshot
ExecStart=/usr/bin/bash -c "echo disabled >> /sys/bus/usb/devices/4-3/power/wakeup"
RemainAfterExit=true
ExecStop=/usr/bin/bash -c "echo enabled >> /sys/bus/usb/devices/4-3/power/wakeup"
StandardOutput=journal

[Install]
WantedBy=multi-user.target

さて、このユニットがすべてのブートジャスト問題で開始されることを確認するために:

# systemctl enable disable-usb-wakeup.service

そして、あなたは行ってもいいはずです。

0
Stunts

/ sysが入力される前に/etc/tmpfiles.dが処理されるという難しい方法を最近知りました。デバイスが表示されるたびに有効になるように、適切なudevルールを作成する必要があります。より柔軟な方法で私に聞いてください)、/ sysに書き込むコマンドを使用してスクリプトを実行するサービスを作成します。

このようなスクリプトを作成する方法の例については、こちらをご覧ください https://bbs.archlinux.org/viewtopic.php?id=14817 次のようなもので埋めることができます:

#### #!/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
cig0