Come funzionano i file systemd-tmp?


15

Sto provando a cambiare il valore di /sys/bus/usb/devices/4-3/power/wakeupad ogni avvio (4-3 secondo il mio lsusb, è l'ID della tastiera).

Il valore predefinito è:

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

Il classico editing "online" funziona come previsto:

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

Sto usando una distro systemd, quindi mi piacerebbe usare il modo systemd per modificare i "file temporanei"

Ho creato il seguente file:

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

ma dopo ogni avvio ho ancora il valore predefinito in questo file (cioè abilitato)

Sto facendo qualcosa di sbagliato?

MODIFICARE:

Ecco un altro test:

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

e questo funziona benissimo! Dopo l'avvio ottengo:

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

(quello predefinito era lo scheduler cfq)

Quindi, perché questo funziona e l'altro no?

  • Perché /sys/bus/usb/devices/4-3/power/wakeupè un link simbolico a /sys/devices/pci0000:00/0000:00:12.1/usb4/4-3/?
  • Perché /sys/bus/usb/devices/4-3/power/wakeupcontiene solo una parola? (cioè senza spazi)

1
Ottima domanda, ma nessuno sta rispondendo. Indipendentemente dal fatto che sia la giusta cosa da fare, le domande dovrebbero essere risolte con l'approccio, 'se io dovessi fare questo, come avrebbero io?" Ho bisogno la risposta a questo e ho trovato questo. Qualcuno vuole risposta sul reale domanda?
Jonathan Komar il

Risposte:


5

Non credo tmpfiles.dsia il modo giusto di andare qui. Dovresti davvero seguire le udevregole. Guarda:

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

E continua, salendo sull'albero del dispositivo genitore. Ma considera che, usando solo le informazioni sopra, puoi fare:

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

E credo che lo faccia per la maggior parte della tua sceneggiatura. Ti consigliamo di inserire quanto sopra dopo la regola 60, credo. E davvero, dovresti farlo per il resto - solo un sleeppo 'nella tua sceneggiatura è una ragione sufficiente - implica una condizione di razza. udevè quello che aggiunge e imposta questi parametri - è quello che popola sysfs. Chiedigli semplicemente di fare il lavoro che sta già facendo.

E per la tua tastiera dovresti assolutamente fare lo stesso - e la retroilluminazione. Basta ottenere le informazioni di cui hai bisogno su questi dispositivi udevadm, scrivere alcune regole e udevadm testloro.


A wiki.archlinux.org/index.php/… c'è un esempio simile ACTION=="add", SUBSYSTEM=="scsi_host", KERNEL=="host*", ATTR{link_power_management_policy}="min_power". Potresti spiegare perché la tua regola UDEV qui non include un'istruzione ACTION e non è separata da virgola?
Pro Backup

@ProBackup - probabilmente perché il mio è rotto. Non penso che il ACTIONpezzo sia necessario però.
Mikeserv,

Ad esempio, per testare link_power_management_policy:udevadm test /devices/pci0000:00/0000:00:1f.2/ata1/host0/scsi_host/host0/
Pro Backup

Questo è davvero il modo giusto di andare. Le persone dovrebbero davvero usare le regole udev nei casi in cui è richiesta la sincronizzazione con eventi di aggiunta / rimozione del dispositivo.
intelfx,

2

[La mia idea originale che ciò potrebbe essere dovuta al fatto che systemd-tmpfiles utilizza I / O stream e non era destinata all'uso con proc o sys è errata . Anche la mia seconda ipotesi, sul significato di una nuova linea, era sbagliata ...]

Ho appena guardato /usr/lib/systemd/system/systemd-tmpfiles-setup.servicee ci sono un paio di bit che potrebbero essere di interesse:

[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" e "Before" forniscono alcune informazioni su quando ciò accade; Penso che il tuo dispositivo sia registrato a questo punto, ma potrebbe esserci qualcosa di successivo che reimposta il valore di sysfs.

Il bit più utile è la linea ExecStart, perché è il comando effettivo che tiene conto di questo servizio. Questo è effettivamente menzionato in man systemd-tmpfiles:

Ad esempio, durante l'avvio viene eseguita la seguente riga di comando per garantire che tutte le directory temporanee e volatili vengano rimosse e create in base al file di configurazione:

systemd-tmpfiles --remove --create

Quindi, per verificarlo, imposta il valore sysfs su "enabled" e poi prova a eseguire systemd-tmpfiles --createche elaborerà la tua direttiva 'w' in /etc/tmpfiles.d. Se funziona (dovrebbe!), Allora sai che il metodo systemd-tmpfile va bene, devi solo farlo più tardi nel processo di avvio, forse con:

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

Ciò significa che scrivere il proprio file di servizio; se per qualche motivo non funziona, puoi sempre scrivere un file di servizio per uno script con cui farlo echo.


Non penso che systemd non possa scrivere su file system virtuali. Usare tmpfiles su /proc/acpi/wakeupfunziona benissimo, per esempio ( wiki.archlinux.org/index.php/Systemd#Temporary_files )
eang

@ital: Probabilmente mi sbagliavo, ma se sei ancora frustrato prova la mia seconda ipotesi sopra.
Riccioli d'oro

Utilizzando echo -n disabled > /sys/...lavori, quindi probabilmente la presenza di newline non importa in questo caso. Ma i tmpfiles non funzionano ancora, ho provato entrambi disabled\ne"disabled\n"
anche il

Ho modificato il primo post con un altro test e alcune ipotesi.
Eang

@ital Sheesh. Ok, sono abbastanza sicuro che la mia terza ipotesi sia quella fortunata, quindi l'ho modificato di nuovo sopra, lol. Se successivamente hai bisogno delle basi per scrivere e registrare un servizio systemd, fai una nuova domanda e magari fai riferimento a questa; Posso spiegarlo senza tutto questo disordine, otterremo alcuni input da altri e la domanda può significare i posteri (non ne vedo ancora qui che si rivolgono molto bene).
Riccioli d'oro

0

Ho imparato di recente che /etc/tmpfiles.d viene elaborato prima che venga popolato / sys, quindi è necessario creare le regole udev appropriate in modo che siano abilitate ogni volta che vengono visualizzati i dispositivi o ... andare nel modo sporco (ma se si chiedetemi, uno più flessibile) e creare un servizio che esegue uno script con i comandi per scrivere in / sys.

Dai un'occhiata qui per un esempio su come creare tale script, https://bbs.archlinux.org/viewtopic.php?id=148170 che puoi riempire con qualcosa come:

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

...

Potresti pubblicare un link che conferma la tua dichiarazione su tmpfiles e / sys / popolazione? Ecco un altro thread Arch in cui sono stati suggeriti i file tmp.
mlt

0

Questo può essere un po 'eccessivo, ma nel mio caso entrambi i metodi menzionati in altre risposte fallivano. La tmpfiles.d rende i cambiamenti prima che le /sys/voci sono popolate ed il udevmetodo non ha trovato la voce (che era un dispositivo di rete virtuale br0). Come tale, ho creato un nuovo file di servizio. Basta creare un nuovo file /etc/systemd/system/disable-usb-wakeup.servicee inserire quanto segue all'interno:

[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

Ora, per assicurarti che questa unità sia avviata ad ogni avvio basta emettere:

# systemctl enable disable-usb-wakeup.service

E dovresti essere bravo ad andare.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.