J'essaie de changer la valeur de /sys/bus/usb/devices/4-3/power/wakeup
à chaque démarrage (4-3 selon moi lsusb
, c'est l'ID du clavier).
La valeur par défaut est:
# cat /sys/bus/usb/devices/4-3/power/wakeup
enabled
L'édition classique "en ligne" fonctionne comme prévu:
# echo disabled > /sys/bus/usb/devices/4-3/power/wakeup
# cat /sys/bus/usb/devices/4-3/power/wakeup
disabled
J'utilise une distribution systemd donc j'aimerais utiliser la méthode systemd pour éditer des "fichiers temporaires"
J'ai créé le fichier suivant:
# cat /etc/tmpfiles.d/disable-usb-wakeup.conf
w /sys/bus/usb/devices/4-3/power/wakeup - - - - disabled
mais après chaque démarrage, j'ai toujours la valeur par défaut dans ce fichier (c'est-à-dire activée)
Est-ce que je fais quelque chose de mal?
ÉDITER:
Voici un autre test:
# cat /etc/tmpfiles.d/scheduler.conf
w /sys/block/sda/queue/scheduler - - - - deadline
et celui-ci fonctionne très bien! Après le démarrage, j'obtiens:
# cat /sys/block/sda/queue/scheduler
noop [deadline] cfq
(celui par défaut était le planificateur cfq)
Alors, pourquoi celui-ci fonctionne et l'autre non?
- Car
/sys/bus/usb/devices/4-3/power/wakeup
est un lien symbolique vers/sys/devices/pci0000:00/0000:00:12.1/usb4/4-3/
? - Parce qu'il
/sys/bus/usb/devices/4-3/power/wakeup
ne contient qu'un seul mot? (c.-à-d. sans espaces)
arch-linux
systemd
sysfs
eang
la source
la source
Réponses:
Je ne crois pas que ce
tmpfiles.d
soit la bonne façon d'aller ici. Vous devriez vraiment suivre lesudev
règles. Regardez:Et cela continue, en remontant l'arborescence des périphériques parents. Mais considérez que, en utilisant uniquement les informations ci-dessus, vous pouvez faire:
Et je crois que cela le fait pour la majorité de votre script. Vous voudrez mettre ce qui précède après la règle 60, je pense. Et vraiment, vous devriez le faire pour le reste - juste le
sleep
bit dans votre script est une raison suffisante - cela implique une condition de concurrence.udev
est celui qui ajoute et définit ces paramètres - c'est celui qui remplitsysfs
. Demandez-lui simplement de faire le travail qu'il fait déjà.Et pour votre clavier, vous devriez certainement faire de même - et le rétro-éclairage. Obtenez simplement les informations dont vous avez besoin sur ces appareils
udevadm
, écrivez quelques règles etudevadm test
celles - ci.la source
ACTION=="add", SUBSYSTEM=="scsi_host", KERNEL=="host*", ATTR{link_power_management_policy}="min_power"
. Pourriez-vous expliquer pourquoi votre règle UDEV n'inclut pas d'instruction ACTION et n'est pas séparée par des virgules?ACTION
bit soit nécessaire cependant.udevadm test /devices/pci0000:00/0000:00:1f.2/ata1/host0/scsi_host/host0/
[Mon idée originale que cela pourrait être dû au fait que systemd-tmpfiles utilise les E / S de flux et n'était pas destinée à être utilisée avec proc ou sys est erronée . Ma 2e hypothèse, sur la signification d'une nouvelle ligne, était également fausse ...]
Je viens de regarder
/usr/lib/systemd/system/systemd-tmpfiles-setup.service
et il y a quelques morceaux qui peuvent être intéressants:Les «Veut», «Après» et «Avant» donnent des informations sur le moment où cela se produit; Je pense que votre appareil est enregistré à ce stade, mais il pourrait y avoir quelque chose par la suite qui réinitialise la valeur sysfs.
Le bit le plus utile est la ligne ExecStart, car c'est la commande réelle qui représente ce service. Ceci est en fait mentionné dans
man systemd-tmpfiles
:Donc, pour tester cela, définissez la valeur sysfs sur "enabled", puis essayez d'exécuter
systemd-tmpfiles --create
qui traitera votre directive "w" dans /etc/tmpfiles.d. Si cela fonctionne (cela devrait!), Alors vous savez que la méthode systemd-tmpfile est très bien, il vous suffit de le faire plus tard dans le processus de démarrage, peut-être avec:Ce qui signifie écrire votre propre fichier de service; si pour une raison quelconque cela ne fonctionne pas, vous pouvez toujours écrire un fichier de service pour un script pour le faire
echo
.la source
/proc/acpi/wakeup
fonctionne bien, par exemple ( wiki.archlinux.org/index.php/Systemd#Temporary_files )echo -n disabled > /sys/...
œuvres, donc probablement la présence de la nouvelle ligne ne se soucie pas dans ce cas. Mais tmpfiles ne fonctionne toujours pas, j'ai essayé les deuxdisabled\n
et"disabled\n"
J'ai récemment appris à la dure comment /etc/tmpfiles.d est traité avant que / sys ne soit rempli, vous devez donc créer les règles udev appropriées pour qu'elles soient activées chaque fois que les périphériques apparaissent ou ... vont dans le mauvais sens (mais si vous demandez-moi, plus flexible) et créez un service qui exécute un script avec les commandes à écrire dans / sys.
Jetez un œil ici pour un exemple sur la façon de créer un tel script, https://bbs.archlinux.org/viewtopic.php?id=148170 que vous pouvez remplir avec quelque chose comme:
la source
Cela peut être un peu exagéré, mais dans mon cas, les deux méthodes mentionnées dans d'autres réponses ont échoué. Le
tmpfiles.d
effectue les modifications avant que les/sys/
entrées ne soient remplies et laudev
méthode n'a pas trouvé l'entrée (qui était un périphérique réseau virtuelbr0
). En tant que tel, j'ai créé un nouveau fichier de service. Créez simplement un nouveau fichier/etc/systemd/system/disable-usb-wakeup.service
et placez ce qui suit à l'intérieur:Maintenant, pour vous assurer que cette unité est démarrée à chaque démarrage, lancez simplement:
Et vous devriez être prêt à partir.
la source