起動するたびに変更したい値です/sys/bus/usb/devices/4-3/power/wakeup
(4-3によると、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
私はsystemdディストリビューションを使用しているので、使用したいと思います。「一時ファイル」を編集する体系的な方法
次のファイルを作成しました。
# 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
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
。
答え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
「希望」、「以降」、「以前」は、この時点であなたのデバイスが登録されていると仮定していますが、いくつかの問題があるかもしれません。フォローsysfs 値をリセットします。
最も有用なビットはExecStartラインです。これは、このサービスを担当する実際のコマンドだからです。実際には次のようになりますman systemd-tmpfiles
。
たとえば、起動中に次のコマンドラインを実行して、設定ファイルに基づいてすべての一時ディレクトリと揮発性ディレクトリが削除され、生成されることを確認します。
systemd-tmpfiles --delete--create
したがって、これをテストするには、sysfsの値を "enabled"に設定し、/etc/ systemd-tmpfiles --create
tmpfiles.dの "w"ディレクティブを処理する実行を試みます。 これがうまくいけば(しなければなりません!)そうであれば、systemd-tmpfileアプローチは問題ありません。起動プロセスの後半で、次のように実行する必要があります。
Requires=multi-user.target
After=multi-user.target
これは、独自のサービスファイルを作成することを意味します。何らかの理由で動作しない場合は、いつでもスクリプトで使用するサービスファイルを作成できますecho
。
答え3
私は最近/ 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
...
答え4
これは少し過剰かもしれませんが、私の場合、他の答えで言及された両方の方法が失敗しました。これ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
行ってもいいです。