Bagaimana cara kerja systemd-tmpfiles?

15

Saya mencoba mengubah nilai /sys/bus/usb/devices/4-3/power/wakeuppada setiap boot (4-3 menurut saya lsusb, itu adalah keyboard ID).

Nilai default adalah:

# cat /sys/bus/usb/devices/4-3/power/wakeup
enabled

Pengeditan "online" klasik berfungsi seperti yang diharapkan:

# echo disabled > /sys/bus/usb/devices/4-3/power/wakeup
# cat /sys/bus/usb/devices/4-3/power/wakeup
disabled

Saya menggunakan distro systemd jadi saya ingin menggunakan cara systemd untuk mengedit "file temp"

Saya telah membuat file berikut:

# cat /etc/tmpfiles.d/disable-usb-wakeup.conf 
w /sys/bus/usb/devices/4-3/power/wakeup - - - - disabled

tetapi setelah setiap boot saya masih memiliki nilai default dalam file ini (yaitu diaktifkan)

Apakah saya melakukan sesuatu yang salah?

EDIT:

Di sini tes lain:

# cat /etc/tmpfiles.d/scheduler.conf 
w /sys/block/sda/queue/scheduler - - - - deadline

dan yang ini berfungsi dengan baik! Setelah boot saya mendapatkan:

# cat /sys/block/sda/queue/scheduler 
noop [deadline] cfq 

(yang standar adalah penjadwal cfq)

Jadi, mengapa yang ini berhasil dan yang lain tidak?

  • Karena /sys/bus/usb/devices/4-3/power/wakeupsymlink to /sys/devices/pci0000:00/0000:00:12.1/usb4/4-3/?
  • Karena /sys/bus/usb/devices/4-3/power/wakeuphanya mengandung satu kata? (yaitu tidak ada spasi)
eang
sumber
1
Pertanyaan yang bagus, tetapi tidak ada yang menjawabnya. Terlepas dari apakah itu adalah hak hal yang harus dilakukan, pertanyaan harus dijawab dengan pendekatan, 'jika saya berada untuk melakukan hal ini, bagaimana akan saya?" Aku benar-benar membutuhkan jawaban untuk ini dan menemukan. Perawatan ini Siapa saja jawaban pada aktual pertanyaan?
Jonathan Komar

Jawaban:

5

Saya tidak percaya tmpfiles.dadalah cara yang tepat untuk pergi ke sini. Anda benar-benar harus melakukan udevaturan. Lihat:

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==""
...

Dan itu berlanjut, berjalan di pohon perangkat induk. Tetapi pertimbangkan itu, hanya dengan menggunakan informasi di atas, Anda dapat melakukan:

KERNEL=="host[0-5]", SUBSYSTEM=="scsi_host", ATTR{link_power_management_policy}="min_power"

Dan saya percaya hal itu berlaku untuk sebagian besar naskah Anda. Anda akan ingin meletakkan di atas setelah aturan 60, saya pikir. Dan sungguh, Anda harus melakukan ini untuk sisanya - hanya sleepsedikit dalam skrip Anda cukup alasan - ini menyiratkan kondisi balapan. udevadalah orang yang menambah dan mengatur parameter ini - itu yang mengisi sysfs. Hanya meminta untuk melakukan pekerjaan yang sudah dilakukan.

Dan untuk keyboard Anda, Anda harus melakukan hal yang sama - dan lampu latar. Dapatkan saja informasi yang Anda perlukan tentang perangkat-perangkat ini udevadm, tulis beberapa aturan dan udevadm testsemuanya.

mikeserv
sumber
Di wiki.archlinux.org/index.php/… ada contoh serupa ACTION=="add", SUBSYSTEM=="scsi_host", KERNEL=="host*", ATTR{link_power_management_policy}="min_power". Bisakah Anda jelaskan mengapa aturan UDEV Anda di sini tidak menyertakan pernyataan TINDAKAN dan tidak dipisahkan koma?
Pro Backup
@ ProBackup - mungkin menyebabkan milik saya rusak. Saya pikir tidak ACTIONperlu sedikit.
mikeserv
Untuk menguji link_power_management_policy misalnya:udevadm test /devices/pci0000:00/0000:00:1f.2/ata1/host0/scsi_host/host0/
Pro Backup
Ini memang cara yang tepat untuk pergi. Orang-orang harus benar-benar menggunakan aturan udev dalam kasus di mana sinkronisasi dengan penambahan / penghapusan peristiwa perangkat diperlukan.
intelfx
2

[Gagasan asli saya bahwa ini bisa jadi karena systemd-tmpfiles menggunakan aliran I / O dan tidak dimaksudkan untuk digunakan dengan proc atau sys salah . Hipotesis kedua saya, tentang pentingnya baris baru, juga salah ...]

Saya baru saja melihat /usr/lib/systemd/system/systemd-tmpfiles-setup.servicedan ada beberapa bit di sana yang mungkin menarik:

[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

The 'Wants', 'After', dan 'Before' memberikan beberapa informasi tentang kapan ini terjadi; Saya pikir perangkat Anda terdaftar pada titik ini, tetapi mungkin ada sesuatu berikutnya yang mengatur ulang nilai sysfs.

Bit yang paling membantu adalah baris ExecStart, karena itulah perintah sebenarnya yang bertanggung jawab atas layanan ini. Ini sebenarnya disebutkan dalam man systemd-tmpfiles:

Misalnya, selama boot, baris perintah berikut dijalankan untuk memastikan bahwa semua direktori sementara dan volatile dihapus dan dibuat sesuai dengan file konfigurasi:

systemd-tmpfiles --remove --create

Jadi, untuk menguji ini, tetapkan nilai sysfs ke "diaktifkan" dan kemudian coba jalankan systemd-tmpfiles --createyang akan memproses arahan 'w' Anda di /etc/tmpfiles.d. Jika itu berhasil (seharusnya!), Maka Anda tahu bahwa metode systemd-tmpfile baik-baik saja, hanya Anda harus melakukannya nanti dalam proses boot, mungkin dengan:

Requires=multi-user.target
After=multi-user.target

Yang berarti menulis file layanan Anda sendiri; jika karena alasan tertentu itu tidak berfungsi, Anda selalu dapat menulis file layanan untuk skrip untuk melakukannya echo.

goldilocks
sumber
Saya tidak berpikir bahwa systemd tidak dapat menulis di sistem file virtual. Menggunakan tmpfiles pada /proc/acpi/wakeupberfungsi dengan baik, misalnya ( wiki.archlinux.org/index.php/Systemd#Temporary_files )
eang
@ital: Saya mungkin salah tentang itu, tetapi jika Anda masih frustrasi coba hipotesis kedua saya di atas.
goldilocks
Menggunakan echo -n disabled > /sys/...karya, jadi mungkin keberadaan baris baru tidak peduli dalam kasus ini. Tapi tmpfiles masih tidak bekerja, saya sudah mencoba baik disabled\ndan"disabled\n"
Eang
Saya telah mengedit posting pertama dengan tes lain dan beberapa hipotesis.
eang
@ital Sheesh. Oke, cukup yakin tebakan saya yang ketiga adalah yang beruntung, jadi saya mengeditnya lagi, lol. Jika setelah itu Anda memerlukan dasar-dasar untuk menulis dan mendaftarkan layanan systemd, ajukan pertanyaan baru dan mungkin rujuk yang ini; Saya bisa menjelaskannya tanpa semua kekacauan ini, kami akan mendapatkan beberapa masukan dari orang lain, dan pertanyaannya bisa berarti anak cucu (saya belum melihat apa pun di sini yang membahas hal ini dengan sangat baik).
goldilocks
0

Saya baru-baru ini belajar cara yang sulit bahwa /etc/tmpfiles.d diproses sebelum / sys diisi sehingga Anda harus membuat aturan udev yang tepat sehingga mereka diaktifkan setiap kali perangkat muncul atau ... pergi dengan cara yang kotor (tetapi jika Anda tanya saya, yang lebih fleksibel) dan buat layanan yang menjalankan skrip dengan perintah untuk menulis ke / sys.

Lihatlah contoh di sini tentang cara membuat skrip tersebut, https://bbs.archlinux.org/viewtopic.php?id=148170 yang dapat Anda isi dengan sesuatu seperti:

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

...
cig0
sumber
Bisakah Anda memposting tautan yang mengkonfirmasi pernyataan Anda tentang tmpfiles & / sys / populasi order? Berikut adalah thread Arch lain di mana tmpfiles disarankan.
mlt
0

Ini mungkin agak berlebihan, tetapi dalam kasus saya kedua metode yang disebutkan dalam jawaban lain gagal. The tmpfiles.d membuat perubahan sebelum /sys/entri dihuni dan udevmetode tidak menemukan entri (yang merupakan perangkat jaringan virtual br0). Karena itu, saya membuat file layanan baru. Cukup buat file baru /etc/systemd/system/disable-usb-wakeup.servicedan tempatkan yang berikut di dalam:

[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

Sekarang, untuk memastikan unit ini dijalankan pada setiap masalah boot saja:

# systemctl enable disable-usb-wakeup.service

Dan Anda harus baik untuk pergi.

Akrobat
sumber