Comment puis-je exécuter une commande hdparm après le démarrage et reprendre sur Fedora 19?

10

J'ai acheté un nouveau HD (WD5000BPVT) qui essaie malheureusement de dormir toutes les 5-8 secondes. Non seulement le bruit de cliquetis est assez audible, mais le temps de rotation de 1 seconde ajoute une latence très perceptible dans l'utilisation quotidienne.

J'ai trouvé que hdparm -B 254 /dev/sdacela désactivera le sommeil très court, mais je ne sais pas comment appliquer ce paramètre à chaque mise sous tension du lecteur. Les applications dconf-editoret les «Préférences de gestion de l'alimentation» ne font rien en ce qui concerne les paramètres HD. Je n'en ai /etc/hdparmni /etc/acpi. MATE est le gestionnaire de fenêtres.

Sur Fedora 19, comment puis-je forcer l'exécution de cette commande chaque fois que le lecteur est activé?

Pete
la source

Réponses:

12

J'ai eu le même problème, aucune des solutions ici ne convenait à mes besoins. L'utilisation de cron est vraiment une solution de contournement, pas une solution, les règles udev sont exécutées lorsque l'alimentation est connectée / déconnectée mais pas après la suspension / la reprise et pm-utilsne sont plus utilisées par défaut dans Fedora 19 lorsque vous fermez par exemple le couvercle de votre ordinateur portable.

Étant donné qu'il systemdest désormais responsable de la suspension / de l'hibernation, je pense que la seule façon appropriée de gérer cette situation est de créer une systemdunité qui fonctionnera à la fois après le démarrage et après la reprise de la suspension.

Remarques:

  • En utilisant /dev/disk/by-id/...au lieu de /dev/sda, vous êtes toujours sûr d'obtenir le bon disque (sda, b, c dépend de l'ordre dans lequel ils sont détectés par le noyau)
  • Vous pouvez avoir plusieurs ExecStartlignes pour configurer plusieurs disques

Voici l'unité que j'ai écrite:

[Unit]
Description=Silence HD
After=suspend.target

[Service]
Type=oneshot
# Disable automatic head parking for the main disk
ExecStart=/sbin/hdparm -B 254 /dev/disk/by-id/ata-ST3250824AS_4N127FD1
# Enable automatic spin down after 30 seconds for the second, infrequently used disk
ExecStart=/sbin/hdparm -S 6 /dev/disk/by-id/ata-ST31000528AS_BVP5H5X1

[Install]
WantedBy=suspend.target basic.target

Enregistrez ce fichier sous /etc/systemd/system/hdsilence.service, puis activez-le en utilisant:

systemctl enable hdsilence.service
systemctl daemon-reload
Krzysztof Adamski
la source
Fonctionne très bien ici sur Fedora 20 également. Je vous remercie!
Jakob
Ainsi, les modifications apportées à /etc/hdparm.conf sont obsolètes?
domih
@domih: Pour autant que je sache, le hdparm.conf est une chose Debian et il n'est pas pris en charge sur Fedora.
Krzysztof Adamski
6

Vous pouvez demander au système d'exécuter la commande lors du démarrage en créant votre propre service systemd ou en ajoutant la commande à /etc/rc.d/rc.local.

Si vous souhaitez que la commande s'exécute à chaque fois que vous réveillez le système après la mise en veille / veille prolongée, vous pouvez ajouter un script commençant par 2 chiffres dans /etc/pm/sleep.d/, consultez les autres scripts dans / usr / lib64 / pm-utils / sleep.d (en supposant x86_64) pour plus de détails. Fondamentalement, il prend un paramètre en fonction de l'état dans lequel il entre. Vous devrez peut-être également ajouter une connexion à power.d / dans le même répertoire parent si vous souhaitez fonctionner différemment sur batterie par rapport à la connexion.

jsbillings
la source
1
creating your own systemd servicePeux-tu être plus précis? Je n'ai pas de fichier /etc/rc.d/rc.local.
Pete
1
La documentation systemd explique la syntaxe d'une unité de service systemd. Le /etc/rc.d/rc.localfichier n'est qu'un script shell, créez-le et assurez-vous de son exécutable.
jsbillings
3

Pour différents paramètres lors de l'exécution sur AC / batterie, je le ferais via une udevrègle simple , par exemple
/etc/udev/rules.d/98-apmsettings.rules:

SUBSYSTEM=="power_supply", ENV{POWER_SUPPLY_ONLINE}=="0", RUN+="/usr/bin/hdparm -B 128 /dev/sda"
SUBSYSTEM=="power_supply", ENV{POWER_SUPPLY_ONLINE}=="1", RUN+="/usr/bin/hdparm -B 254 /dev/sda"

Cela mis apmà 254quand l'ordinateur portable est branché et respectivement 128lorsqu'il est débranché. En outre, cela devrait toujours fonctionner, même après la reprise de la suspension.

don_crissti
la source
1
Pour ceux qui aiment la copie mot pour mot, les nouvelles versions ont hdparmen /usr/sbin, de sorte que les chemins régler.
Roman
2

J'ai le même disque (et le même problème). Ma solution stupide mais fonctionnelle: je l'ai mise dans /etc/crontab:

-*/5  * * * *   root  hdparm -B 254 /dev/sda
Hauke ​​Laging
la source
Cela n'accède-t-il pas simplement au lecteur toutes les 12 secondes? J'ai envisagé quelque chose dans ce sens, mais j'aimerais un peu de sommeil quand je suis désamarré.
Pete
Toutes les cinq minutes. Vous pouvez écrire un script wrapper qui vérifie l'état d'alimentation du système.
Hauke ​​Laging
1

Les règles udev fonctionnent bien sur les événements de plug, mais pour obtenir le comportement correct après la reprise de la suspension, j'ai besoin de quelque chose comme ceci dans /etc/pm/sleep.d:

#!/bin/sh

case "${1}" in
    resume|thaw)
    if grep -q 1 /sys/class/power_supply/ADP1/online; then
      /usr/sbin/hdparm -B 254 /dev/sda
    else
      /usr/sbin/hdparm -B 128 /dev/sda
    fi
;;
esac
Rob
la source