Як працює systemd-tmpfiles?


15

Я намагаюся змінити значення /sys/bus/usb/devices/4-3/power/wakeupкожного завантаження (4-3 відповідно до мого lsusb, це ідентифікатор клавіатури).

Значенням за замовчуванням є:

# 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
Чудове запитання, але на нього ніхто не відповідає. Незалежно від того, чи є це право , що потрібно зробити, питання слід відповісти з підходом, «якби я був зробити це, як би я?» Я на насправді потрібна відповідь на цей питання і знайшов це. Догляд нікому відповідь на фактичне питання?
Джонатан Комар

Відповіді:


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 і не розділяється комами?
Pro резервне копіювання

@ProBackup - можливо, тому, що міна зламана. Я не думаю, що цей ACTIONбіт необхідний.
mikeserv

Для тестування на link_power_management_policy, наприклад:udevadm test /devices/pci0000:00/0000:00:1f.2/ata1/host0/scsi_host/host0/
Pro Backup

Це дійсно правильний шлях. Люди дійсно повинні використовувати правила udev у випадках, коли потрібна синхронізація з подіями додавання / видалення пристрою.
intelfx

2

[Моя первісна думка, що це могло бути тому, що systemd-tmpfiles використовує потік вводу-виводу і не призначений для використання з 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

"Хоче", "Після" та "Перед" дають деяку інформацію про те, коли це відбувається; Я думаю, що ваш пристрій зареєстровано до цього моменту, але може з’явитися щось наступне, що скидає значення sysfs.

Найбільш корисним бітом є рядок ExecStart, оскільки це фактична команда, яка припадає на цю послугу. Про це фактично йдеться у man systemd-tmpfiles:

Наприклад, під час завантаження виконується наступний командний рядок, щоб забезпечити видалення та створення всіх тимчасових та мінливих каталогів відповідно до файлу конфігурації:

systemd-tmpfiles --remove - створювати

Отже, щоб перевірити це, встановіть для sysfs значення "увімкнено", а потім спробуйте запустити, systemd-tmpfiles --createяке обробить вашу директиву "w" в /etc/tmpfiles.d. Якщо це працює (це повинно!), То ви знаєте, що метод 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: Я, мабуть, помилявся з цього приводу, але якщо ви все ще розчаровані, спробуйте мою другу гіпотезу вище.
золотинок

Використовуючи echo -n disabled > /sys/...роботи, тому, ймовірно, присутність нового рядка в цьому випадку не має значення. Але tmpfiles все ще не працює, я спробував і те, disabled\nі"disabled\n"
eang

Я відредагував першу публікацію з іншим тестом та деякою гіпотезою.
eang

@ital Sheesh. Гаразд, я впевнений, що моя третя здогадка є щасливою, тому я відредагував це вище знову, хаха. Якщо після цього вам потрібні основи для написання та реєстрації системної служби, задайте нове запитання та, можливо, посилайтесь на це; Я можу пояснити це без усієї суєти, ми отримаємо певний внесок від інших, і питання може означати потомство (я ще не бачу тут жодного, який би вирішував це дуже добре).
goldilocks

0

Нещодавно я дізнався про важкий спосіб обробки /etc/tmpfiles.d до заповнення / sys, тому ви повинні створити правильні правила 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 / populacija? Ось ще одна нитка Arch, де були запропоновані tmpfiles.
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

І вам слід добре піти.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.