É seguro girar manualmente o disco rígido com hdparm?

2

Eu tenho um laptop com um ssd para a unidade principal do sistema operacional e um grande disco giratório para armazenamento. Eu tenho atualmente um alias que eu uso para manualmente girando a unidade quando eu não estou usando (depois de umount claro):

sudo hdparm -y /dev/disk/by-id/ata-WDC_WD7500BPKX-80HPJT0_WD-WX31AB3N6985

É seguro usá-lo? Será que hdparm se recusará a fazer isso se a unidade ainda tiver que sincronizar ou se eu esquecer de desmontá-la? Se não, existe uma maneira de usar hdparm (ou outro utilitário) para verificar se é seguro fazer isso?

UPDATE -

Por mais que eu aprecie ambas as suas respostas, elas não me ajudam em nada, porque eu tentei inúmeras combinações de valores diferentes para as configurações de tempo de APM e Spin-down, sem resultados além de a) menor que 10 segundos antes da desclassificação b) não há desaceleração, mas estacionamento aleatório, ou c) não há desaceleração nem estacionamento. Eu também tentei pesquisar na web para o meu modelo de unidade específica e seus respectivos valores de APM, sem sucesso.

Então, a direção que eu gostaria de seguir é esta: Eu preciso descobrir uma maneira de ver se o disco está em uso para que eu possa escrever um serviço systemd. O mais próximo que eu posso chegar até agora é lsof | grep /mnt/data , ou algum tipo de nonesense. Mas, como você pode ver, isso é muito menos que ideal. Eu gostaria de um método para alcançar isso que não dependa de um ponto de montagem predeterminado, ou da CPU de várias invocações de lsof + D na resposta que forneci a mim mesmo.

Veja minha resposta abaixo para ter uma ideia do que estou tentando fazer

    
por Shane 15.12.2014 / 11:02

4 respostas

3

Em vez de tentar descobrir isso manualmente, confie nas coisas existentes. Eu uso hd-idle no meu servidor de arquivos, ele funciona muito bem. Eu também não desmonto meus discos porque não há motivo para isso. Se eu quiser acessar um arquivo, os discos vão girar. Então, depois que o tempo limite passar, eles voltarão a girar novamente.

Se você é super paranóico com relação à integridade dos dados, pode usar o autofs , que pode montar e desmontar automaticamente seus sistemas de arquivos em um como base necessária. Eu mesmo não usei, mas a página do ArchWiki oferece algumas informações que parecem bastante úteis.

    
por 15.05.2015 / 23:29
3

Você tem um alias! Talvez seja melhor ter um script que sincronize / desmonte e chame o hdparm. Adicione o script ao arquivo sudoers.

cat >/usr/local/sbin/spindown
disk=/dev/disk/by-uuid/c542a956-fbfe-42f7-ac8f-44c029a35a69
sync && unmount /bigdisk/volume &&
hdparam -y $disk

O & & certifica-se de que o comando anterior sai com sucesso antes de tentar o próximo.

Em seguida, adicione aos sudoers. Isso pode funcionar:

cat >/etc/sudoers.d/spindown <<EOF
ALL ALL=(ALL) NOPASSWD:/usr/local/sbin/spindown
EOF

DanielB fez uma sugestão brilhante: Use o autofs para montar / desmontar automaticamente um disco local (nunca pensei em usá-lo dessa maneira, já que costumo trabalhar em servidores e como o autofs era tradicionalmente para o NFS). Então, uma vez configurado (não pergunte a mim como;)), adicione algo assim a um cronjob:

cat >/etc/cron.d/spindown << EOF
* * * * *  hdparm -C | grep -q -E "idle|active" DISK-DEV && grep -q MOUNTPOINT /etc/mtab && hdparm -y DISK-DEV
EOF

Certifique-se de substituir DISK-DEV e MOUNTPOINT (se o Disk-dev tiver 0 ou 1 partição, você pode usá-lo para MOUNTPOINT). Por favor note: Eu não posso realmente testar isso já que o sistema físico que eu tenho acesso ao ATM é um dispositivo RAID e o controlador não suporta esses comandos.

    
por 09.05.2015 / 00:36
1

Nota

Você não precisa desmontar as partições para girar o disco rígido. Será mais fácil se você simplesmente definir um tempo limite de espera (que será acionado após algum tempo sem ser usado). Dessa forma, quando necessário, o disco ficará ativo (girando) e você poderá usá-lo imediatamente, sem a necessidade de remontar as partições.

Solução de linha de comando

Como @Nattgew sugeriu em um comentário, use hdparm (se essa for a ferramenta que você gosta de usar) com a opção -S para definir um tempo limite de espera:

-S   Set standby (spindown) timeout

Dessa forma, o disco será desativado automaticamente quando não houver atividade.

Para tornar essa alteração permanente (por exemplo, após a reinicialização), talvez seja necessário fazer alterações em /etc/hdparm.conf . Ou talvez, como é provável que sua distribuição hoje em dia use systemd , talvez seja necessário criar uma unidade:

link

Provavelmente a maneira mais fácil seria usar uma ferramenta gráfica ... (sim, às vezes, quando você já tem uma interface gráfica ativada em seu sistema, é o caminho mais rápido)

Solução GUI (GNOME)

Como você está dizendo que está usando seu laptop, presumo que você tenha uma interface gráfica. Com as distribuições do GNOME, existe um programa chamado "Discos":

Depoisdeselecionarodiscorígidoquedesejacolocarnomododeespera,vocêpodeclicarem"Configurações do Drive" no menu (ou CTRL + E pode ser um atalho também):

Altereasconfiguraçõesdetempolimitedeespera:

    
por 11.05.2015 / 09:54
1

Aqui está o meu truque de um script até agora. Eu vou manter isso aberto até que alguém encontre uma solução melhor ...

#!/bin/bash

# for each disk specified as disk
#   if disk is active/idle
#     disk in use as inuse = false
#     for each mount point as mntpoint accociated with it
#       if (lsof | grep mntpoint)
#         inuse = true
#         break
#       endif
#     endfor
#     if inuse
#       spin down disk
#     endif
#   endif
# endfor

DISKS_LEN=1
DISKS[1]=ata-WDC_WD7500BPKX-80HPJT0_WD-WX31AB3N6985

spindown_disk() {
    (sync $1 && sudo hdparm -y /dev/$1 >/dev/null) &
}

diskArr_len=0
for i in 'seq $DISKS_LEN'; do
    linkpath=$(readlink /dev/disk/by-id/${DISKS[$i]})
    ((diskArr_len+=1))
    diskArr[$i]=${linkpath##*/}
done

for i in 'seq $diskArr_len'; do
    disk=${diskArr[$i]}
    if (sudo hdparm -C /dev/$disk | grep -B1 'active/idle'); then
        inuse=false
        mntpoints="$(mktemp)"
        mount \
            | grep "^/dev/$disk[0-9]" \
            | sed -r "s|^/dev/$disk[0-9] on (.*) type.*$||" \
            >"$mntpoints"
        while read mntpoint; do
            while read openfile; do
                [ $inuse = false ] && echo open files:
                echo $'\t'/${openfile#*/}
                inuse=true
            done < <(lsof | grep "$mntpoint")
        done <"$mntpoints"
        rm -f "$mntpoints"
        if [ "$inuse" = true ]; then
            echo $disk is in use
        else
            echo spinning down $disk \(after sync\)
            spindown_disk $disk
        fi
    else
        echo $disk is already inactive
    fi
done

exit 0

Ainda vou ter que descobrir como envolvê-lo em um serviço do systemd que é executado a cada X minutos. Obviamente, seria melhor se houvesse uma alternativa ao uso de lsof e grep. Além disso, não tenho certeza se isso funcionaria com caracteres engraçados de ponto de montagem devido ao uso do grep. Além disso, precisaria ser revisado se você tivesse mais de 9 partições.

Por favor, se você tiver alguma sugestão, não hesite.

    
por 12.05.2015 / 08:20