Mettre en veille un disque USB sous Linux

Présentation

Par défaut le moteur du disque dur connecté au Slug tourne constamment.
Afin d’économiser le disque, il est possible de le mettre en veille.
Dans ce cas, le disque s’arrête et redémarrera au prochain accès disque.

Méthode

La première chose à faire est de modifier la méthode de montage des partitions et d’ajouter l’option noatime.
Extrait d’un fichier /etc/fstab

/dev/sda1 / ext3 defaults,noatime 0 1
/dev/sda4 /1data ext3 defaults,noatime 0 2

Explication de ce paramètre noatime
Sur les systèmes de fichiers journalisés (ext3, reiserfs), il existe un attribut sur le fichier qui correspond au dernier accès en lecture.
L’option noatime désactive la mise à jour de cet attribut pour un simple accès en lecture à un fichier.

L’outil qui permet de mettre le disque en veille est sdparm : http://sg.torque.net/sg/sdparm.html

Compiler la dernière version disponible : ./configure, make, make install
Pour DebianSlug, installer le paquet
apt-get install sdparm

- Commande pour mettre le disque en veille :
sdparm –command=stop /dev/sda

Malheureusement, on peut s’apercevoir que cette mise en veille n’est que temporaire.
Le disque redémarre dès qu’un processus accède au disque.

Il va donc falloir partir à la chasse au processus.
Les premiers démons à désactiver au démarrage du slug sont :
update-rc.d -f sysklogd remove
update-rc.d -f klogd remove
update-rc.d -f courier-authdaemon remove
update-rc.d -f courier-mta remove
update-rc.d -f exim4 remove
update-rc.d -f cron remove

ATTENTION : Les mises à jour (via apt-get update) peuvent restaurer le démarrage automatique de ces démons.

Si le spinup intempestif persiste :
- Activer le mode debug du noyau sur les accès disque :
echo 1 > /proc/sys/vm/block_dump
- Le log du noyau est accessible par la commande
dmesg
Ou en mode dynamique :
cat /proc/kmsg

Il nous faut donc maintenant mettre en veille le disque
sdparm --command=stop /dev/sda
Et attendre que le disque se réveille…
Et là, la commande dmesg trahira le processus fautif :
atop(720): dirtied inode 468512 (atop.log) on sda1 : le processus atop a accédé au disque

Le démon cron exécute régulièrement certaines tâches de maintenance, notamment sur les logs.
On doit pouvoir supprimer certains scripts dans les répertoires /etc/cron.*.
Certaines tâches sont lancées une fois par heure (/etc/cron.hourly). On doit pouvoir ne les lancer qu’une fois par semaine en déplaçant les scripts dans /etc/cron/weekly.
Sur mon slug, j’ai supprimé les scripts suivants :
/etc/cron.monthly/standard
/etc/cron.daily/apt
/etc/cron.daily/aptitude
/etc/cron.daily/bsdmainutils
/etc/cron.daily/find
/etc/cron.daily/sysklogd

/etc/cron.daily/logrotate déplacé vers /etc/cron.weekly
/etc/cron.daily/man-db déplacé vers /etc/cron.weekly
/etc/cron.daily/netkit-inetd.dpkg-new déplacé vers /etc/cron.weekly
/etc/cron.daily/standard déplacé vers /etc/cron.weekly

Je ne m’y connais pas, j’ai peut être fait des erreurs. On peut peut être faire encore plus de ménage.

Il reste ensuite à mettre en oeuvre un script surveillant les accès disque et activant le spindown en cas d’inactivité du disque.
Exemple de script :

while true
do
MyDiskStatsNow=`cat /proc/diskstats | grep "sda "`
MyDiskStatsPrev="MyDiskStatsNow"
echo "diskstats : $MyDiskStatsNow"
while [ "$MyDiskStatsNow" != "$MyDiskStatsPrev" ]
do
echo "Activite disque detectee : $MyDiskStatsNow "
MyDiskStatsPrev=$MyDiskStatsNow
sleep 60
MyDiskStatsNow=`cat /proc/diskstats | grep "sda "`
done
echo "Pas d activite detectee! - Spindown actif "
/usr/local/bin/sdparm --command=stop /dev/sda
MyDiskStatsPrev=$MyDiskStatsNow
while [ "$MyDiskStatsNow" == "$MyDiskStatsPrev" ]
do
sleep 60
MyDiskStatsNow=`cat /proc/diskstats | grep "sda "`
done
echo "Prev : $MyDiskStatsPrev"
echo "Now : $MyDiskStatsNow"
echo "Activite disque detectee"
done

Disques pour lesquels cette procédure à été testée
Lacie Porsche USB 2.0 200Go (Western Digital inside)

Tuning

Pour optimiser le spindown, il faut limiter l’accès disque de certains process.
OpenVPN
Editer le fichier /etc/init.d/openvpn
Remplacer la ligne
STATUSREFRESH=10
par
STATUSREFRESH=0

Références

http://linuxfr.org/forums/10/16819.html

http://www.xs4all.nl/~bsamwel/laptop_mode/tools/faq.html

http://www.nslu2-linux.org/wiki/FAQ/SpinDownUSBHarddisks

http://www.faqs.org/docs/securing/chap6sec73.html

http://jfontain.free.fr/diskstats/diskstats.htm

Je suis toujours à la recherche de la source de cet article.
Si vous êtes l’auteur de cet article n’hésitez pas à vous manifester.

App

Backtrack bootable sur clef usb

Formater la clef
cfdisk /dev/sda

Télécharger la backtrack version usb (948Mo)
wget ftp://backtrack.mirrors.skynet.be/pub/backtrack/bt3b141207.rar

Copier le contenu sur la clef

Monter la clef (en root)

mkdir /mnt/usbkey && mount -t vfat /dev/sda1 /mnt/usbkey

Formater une clef usb

Récupérer les outils:

sudo aptitude install dosfstools

Formater une clef usb en FAT 32:

mkfs.vfat -F 32 /dev/sda1

Vous trouverez tous ce qui vous intéresse sur cet article

Recent Tweets

Catégories