segunda-feira, 23 de julho de 2012

Desligar (spindown) os discos automaticamente

Desligar (spindown) os discos automaticamente

Esta dica funciona melhor em sistemas com mais de um disco rígido (por exemplo, um homeserver, como é o meu caso) ou num portátil.
A ideia é arranjar maneira de desligar o motor dos discos rígidos quando estes não estão a ser usados. Poupa-se energia, pois o disco consome menos com o motor desligado obviamente e pode prolongar-se o tempo de vida do disco. Para prolongar o tempo de vida do disco é preciso definir um tempo espera generoso antes de fazer o spindown, pois demasiados ciclos de desligar e reiniciar o motor vão ter o efeito contrário, isto é, diminuir o tempo de vida do disco.
Assim, vou usar 30 minutos como tempo recomendado.
Há um projeto aqui http://code.google.com/p/spindown/ de um daemon que faz exatamente o que se pretende, mas eu quero uma solução mais "caseira", que assente mais em bash e que não seja preciso andar a compilar código.
Vou usar Debian para este projeto, pois ando desanimado com o Ubuntu. Está cada vez mais parecido ao Windows.
É preciso executar todos os comandos como root.

1. Instalar o sg3-utils

apt-get install sg3-utils
O pacote sg3-utils tem o comando sg_start que podemos usar para parar o motor do disco.
Aparentemente também se pode fazer com o sdparm e com o hdparm, mas ainda não experimentei.

2. Criar um script

Criei um script em /root/bin/spindown.sh com o seguinte conteúdo:

# !/bin/sh
if [ "$(id -u)" != "0" ]; then
        echo "This script must be run as root" 1>&2
        exit 1
fi
if [ -z $1 ]; then
        echo Usage: $0 sdX
        exit 1
fi
# isto estava a causar alguns problemas, por enquanto fica desligado
#if ! [ -e /dev/$1 ]; then
#        echo /dev/$1 not found
#        exit 1
#fi
NEWFILE=/tmp/NewState.$1
OLDFILE=/tmp/OldState.$1
date +"%F %T"
# Get new state from diskstats
NEWstate=$(cat /proc/diskstats | grep $1)
echo $NEWstate > $NEWFILE

if [ -z $(diff OLDstate.txt NEWstate.txt) ]; then
        echo Stopping $1...
        # sdparm --flexible --command=stop /dev/$1 &>/dev/null
        sg_start --stop /dev/$1
else
        echo $1 active
fi



# Write current state to file
echo $NEWstate > $OLDFILE

Não esquecer de ligar o bit executável no ficheiro:
chmod +x spindown.sh

3. Adicionar ao crontab

Adicionar ao crontab a linha:
*/30 * * * * /root/bin/spindown.sh sdc
Deve ser adicionada uma linha por cada disco que se pretende controlar, mudando o 'sdc' de acordo com o disco, claro.

Como o script faz algumas verificações antes de ser executado, deve ser seguro de executar na linha de comandos para testes (sem garantias...),
Não é uma solução muito elegante, mas é relativamente simples.

Referências


Sem comentários:

Enviar um comentário