Envie o comando sleep para o disco usb montado como / home (Fedora 20) a partir do script de desligamento

1

Eu tenho um drive usb sata2 conectado ao usb que é montado como / home. Quando desligo o computador / laptop, o disco faz um som agudo como se os discos ainda estivessem girando e as cabeças não estivessem estacionadas quando a energia se apaga.

Este som não é produzido quando desmonto as partições e envio manualmente um sinal de sono para o disco:

hdparm -Y /dev/sdb

Mas para fazer isso eu preciso desmontar / home como uma partição do disco é montada como / home pelo fstab:

UUID=[long number] /home                   ext4    defaults        1 2

Portanto, a desmontagem não é possível, pois o disco está sempre ocupado. Atualmente, posso ir para o nível de execução 1 e depois desmontá-lo e depois enviar o sinal de suspensão:

systemctl isolate runlevel1.target
umount /home
umount /dev/sdb*
hdparm -Y /dev/sdb
(unplug the drive without the drive giving any sounds)
systemctl poweroff

Porque isso é um pouco demais para fazer toda vez que eu quero desligar o computador / laptop Eu tentei adicionar um script para rc0:

Tenha o seguinte arquivo em /etc/init.d

-rwxr-xr-x   1 root root   547 Mar  3 07:57 sleep.usb

contendo:

#! /bin/bash
#
# network       Bring up/down networking
#
# chkconfig: - 10 1
# description: Unmount /home/harm/ssd, /home and send sleep signal
#

# See how we were called.
case "$1" in
  start)

        ;;
  stop)
    somevar="$(mount|grep /home)";
    if [ "$somevar" != "" ]; then
      umount /home
    fi
    umount /dev/sdb*
    hdparm -Y /dev/sdb
    ;;
  *)
        echo $"Usage: $0 {start|stop|status|restart|reload|force-reload}"
        exit 2
esac

exit 0

Instalado com:

chkconfig --add sleep.usb

e está aparecendo no diretório correto:

lrwxrwxrwx   1 root root   19 Mar  3 08:00 K01sleep.usb -> ../init.d/sleep.usb

No entanto; quando eu desligar meu computador / laptop, o disco rígido ainda faz o som e, segurando-o na minha mão, posso sentir os discos girando até o momento em que a energia se apaga.

    
por HMR 03.03.2015 / 01:27

1 resposta

2

SOLUÇÃO INICIAL

Então, você tem systemd como seu init. Nesse caso, primeiro sugiro evitar usar a camada de compatibilidade pelo menos em seu próprio código e, em vez disso, usar as ferramentas nativas do systemd. Aqui, sua melhor aposta seria usar a capacidade do systemd de executar arquivos arbitrários em /usr/lib/systemd/system-shutdown como parte de sua lógica de desligamento.

Para citar systemd-shutdown (8) :

Immediately before executing the actual system halt/poweroff/reboot/kexec systemd-shutdown will run all executables in /usr/lib/systemd/system-shutdown/ and pass one arguments to them: either "halt", "poweroff", "reboot" or "kexec", depending on the chosen action.

Então, você pode colocar um script fazendo apenas hdparm -Y nesse diretório, e ele será executado logo antes do sistema ser parado. Note que é desligamento muito tardio : tudo é desmontado ou remontado somente para leitura, processos são eliminados, rede está inoperante, etc, etc. Devido a isso, você não precisará de nenhuma das tarefas auxiliares. lógica atualmente presente no seu script.

UPDATE

Como você afirmou, apenas dizer ao disco para dormir não ajuda. Isso é porque é acordado novamente depois que seu script termina. Isso possivelmente acontece porque systemd-shutdown realiza preparações finais para o desligamento, ou o que quer que seja.

Portanto, precisamos remover o dispositivo do sistema depois de enviá-lo para o modo de suspensão. Suponho que sua unidade seja um dispositivo de armazenamento em massa USB; tudo abaixo funcionará apenas para essas unidades.

DRIVE=sdb # replace with whatever is needed
echo 1 > $(realpath /sys/block/$DRIVE/device)/../../../../remove

Para entender o que está acontecendo, é necessário ter algum conhecimento de hierarquia sysfs (específica do Linux).

  • /sys/block/sdX é um diretório que representa um dispositivo de bloco (virtual)
  • device é um link simbólico que aponta para o diretório que representa o dispositivo SCSI físico (no Linux, os dispositivos de armazenamento em massa USB são mostrados como discos SCSI)
  • primeiro .. vai para o diretório pai representando um destino SCSI
  • segundo .. vai para o diretório pai representando um host SCSI
  • terceira .. vai para o diretório pai que representa uma "interface" USB
  • quarta .. vai para o diretório pai que representa um "dispositivo" USB - é disso que precisamos.

Finalmente, escrevemos 1 no arquivo remove desse diretório. Isso informa ao driver USB para desativar e remover o dispositivo do sistema.

Espero que isso funcione.

    
por 03.03.2015 / 09:10