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


15

私は/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を使用して「一時ファイル」を編集したい

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

# 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つだけ含まれているためですか?(つまりスペースなし)

1
すばらしい質問ですが、誰も答えていません。かかわらず、あるかどうかの行うためのもの、私があれば、質問は「アプローチで答えられるべきでなかったこれを行うには、どのようにだろう I?」私は実際にこの答えを必要とし、これを見つけた。誰ケア実際に答えるために質問?
ジョナサンKomar

回答:


5

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それらを記述します。


wiki.archlinux.org/index.php/...同様の例がありますACTION=="add", SUBSYSTEM=="scsi_host", KERNEL=="host*", ATTR{link_power_management_policy}="min_power"。ここのUDEVルールにACTIONステートメントが含まれておらず、カンマで区切られていない理由を説明してください。
プロバックアップ14

@ProBackup-おそらく私のものが壊れています。ACTIONしかし、私はビットが必要だとは思わない。
mikeserv 14

例えばlink_power_management_policyをテストするには:udevadm test /devices/pci0000:00/0000:00:1f.2/ata1/host0/scsi_host/host0/
Proのバックアップ

これは確かに適切な方法です。デバイスの追加/削除イベントへの同期が必要な場合は、実際にudevルールを使用する必要があります。
intelfx 14

2

[これはsystemd-tmpfilesがストリームI / Oを使用し、procまたはsysで使用することを意図していなかったためである可能性があるという私の最初の考えは間違っています。改行の重要性に関する私の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

「Wants」、「After」、および「Before」は、これがいつ発生するかについての情報を提供します。デバイスはこの時点で登録されていると思いますが、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


systemdが仮想ファイルシステムに書き込むことができないとは思わない。上のTMPFILES使用し/proc/acpi/wakeupた作品の罰金、例えば(wiki.archlinux.org/index.php/Systemd#Temporary_files
eang

@ital:私はおそらくそれについて間違っていましたが、まだイライラしている場合は、上記の私の2番目の仮説を試してください。
goldilocks

echo -n disabled > /sys/...作品を使用するので、おそらくこの場合、改行の存在は気にしません。しかし、TMPFILESはまだ私は両方試した、動作していないdisabled\n"disabled\n"
eang

最初の投稿を別のテストといくつかの仮説で編集しました。
eang

@ital Sheesh。さて、私の3番目の推測が幸運な推測であることをかなり確信しているので、私はそれを上記でもう一度編集しました、笑。その後、systemdサービスの作成と登録の基本が必要な場合は、新しい質問をして、おそらくこの質問を参照してください。この混乱なしに説明できます。他の人から何らかの情報を得ることができ、質問は後世を表すことができます(これについてはまだよくわかりません)。
goldilocks

0

最近、/ sysが読み込まれる前に/etc/tmpfiles.dが処理される難しい方法を学びました。そのため、適切な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

...

tmpfilesおよび/ sys /の生成順序に関するステートメントを確認するリンクを投稿できますか?ここに、tmpfilesが提案された別のArchスレッドがあります。
mlt

0

これは少しやり過ぎかもしれませんが、私の場合、他の回答で言及された両方の方法が失敗していました。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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.