Abra o utilitário de discos e defina a unidade para girar automaticamente após 10 minutos de inatividade.
Eu tenho várias máquinas Ubuntu com um SSD e um disco rígido tradicional, onde o disco rígido é usado apenas ocasionalmente.
Por motivos de redução do ruído, do calor e do consumo de energia, além de prolongar a vida útil do disco rígido, eu gostaria de desativá-lo a cada inicialização e ativá-lo somente quando necessário.
hdparm -y
(ou -Y
) funciona muito bem na linha de comando e faz exatamente o que eu quero.
Mas escrever um serviço systemd para executar hdparm
não funciona. Para ser mais preciso: Funciona, e o disco realmente adormece (como mostra a depuração), mas é imediatamente despertado novamente (e permanece acordado), porque há algo no sistema que acessa os discos rígidos (e assim acorda ) no final do processo de inicialização do systemd.
Então, como posso colocar um hdparm -y
no processo de inicialização mais tarde o suficiente para que ele não seja seguido por nenhum outro processo?
O meu último palpite seria alterar o alvo padrão do systemd de gráfico para um novo (sleepydisks), que então depende do antigo destino gráfico.
Mas não há uma maneira mais fácil e simples de desativar os discos?
Atenciosamente
Abra o utilitário de discos e defina a unidade para girar automaticamente após 10 minutos de inatividade.
Use a opção -S do hdparm. Isso define o tempo limite de rotação, que deve ser mantido pela unidade.
$ hdparm --help
-S Set standby (spindown) timeout
$ hdparm -S 60 /dev/sdd
/dev/sdd:
setting standby to 60 (5 minutes)
Observe que este é um 'S' maiúsculo.
Eu uso o seguinte script para "forçar" discos ociosos para spindown, onde pela força quero dizer uma instrução direta para a unidade como muitos drives WD são problemáticos com auto-spindown. Talvez você possa estender isso às suas necessidades. O script é bem comentado, então você deve poder modificá-lo facilmente. Eu chamo de cron
a cada 20 minutos, ajuste conforme necessário:
spindown.sh
#!/usr/bin/env bash
logger "[SPINDOWN] Checking disk activity and spinning down idles..."
# Exit during maintenance
if pgrep snapraid > /dev/null; then
logger "[SPINDOWN] Detected snapRAID maintenance. Exiting.";
exit 0
fi
# Specify any drives you want to ignore; separate multiple drives by spaces; e.g. "sda sdb"
IGNORE_DRIVES=""
PATH='/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin'
# Check for idle disks and spin them down unless smartd is running tests
# Create a file on the ramdisk and cycle it to test for disk activity
( if [ ! -f /dev/shm/diskstats_1 ]; then
logger "[SPINDOWN] Creating initial state file on ramdisk";
touch /dev/shm/diskstats_1;
fi ;
logger "[SPINDOWN] Updating state files on ramdisk";
mv /dev/shm/diskstats_1 /dev/shm/diskstats_2;
cat /proc/diskstats > /dev/shm/diskstats_1 ) > /dev/null 2>&1
# Find all removable USB drives, so we can ignore them later,
# see http://superuser.com/a/465953
REMOVABLE_DRIVES=""
for _device in /sys/block/*/device; do
if echo $(readlink -f "$_device")|egrep -q "usb"; then
_disk=$(echo "$_device" | cut -f4 -d/)
REMOVABLE_DRIVES="$REMOVABLE_DRIVES $_disk"
fi
done
# Append detected removable drives to manually ignored drives
IGNORE_DRIVES="$IGNORE_DRIVES $REMOVABLE_DRIVES"
# Loop through all the array disks and spin down the idle disks. Will find all drives sda > sdz AND sdaa > sdaz...
logger "[SPINDOWN] Looping through drives to detect idle state"
for disk in 'find /dev/ -regex '/dev/sd[a-z]+' | cut -d/ -f3'
do
# Skip removable USB drives and those the user wants to ignore
if [[ $IGNORE_DRIVES =~ $disk ]]; then
continue
fi
# Skip SSDs
if [[ $(cat /sys/block/$disk/queue/rotational) -eq 0 ]]; then
continue
fi
# Check if drive exists
if [ -e /dev/$disk ]; then
logger "[SPINDOWN] Checking drive $disk"
# Check if drive is currently spinning
if [ "$(smartctl -i -n standby /dev/$disk | grep "ACTIVE or IDLE")" ]; then
logger "[SPINDOWN] Disk $disk is ACTIVE or IDLE. Checking for selftest"
# Check if smartctl is currently not running a self test
if [ $(smartctl -a /dev/$disk | grep -c "Self-test routine in progress") = 0 ]; then
logger "[SPINDOWN] Disk $disk is not running a self test. Checking activity."
# Check if drive has been non idle since last run
if [ "$(diff /dev/shm/diskstats_1 /dev/shm/diskstats_2 | grep $disk )" = "" ]; then
logger "[SPINDOWN] Spinning down /dev/$disk 'df -h | grep /dev/$disk | rev | cut -d ' ' -f 1 | rev'"
hdparm -y /dev/$disk
fi
else
logger "[SPINDOWN] /dev/$disk is running Self-test routine. Skipping."
fi
fi
fi
done
De acordo com a pergunta específica, como fazer isso com o systemd? ... crie um arquivo temporizador que chame esse script (Ref: link )
Tags boot hard-drive suspend systemd
Como posso tentar resolver esse problema de congelamento? A partir daqui Ubuntu 16.04 Congela frequentemente E seguindo as instruções aqui, consegui obter o relatório de falha mencionado. Como faço para depurar quando o sistema congela ou quando ele falha de volta ao login? . Mas eu não sei o que estou procurando Gigabyte GA-990FX com a série G.SKILL Ripjaws Z de 32 pinos (4 x 8 GB) DDR3 SDRAM DDR3 2400 (PC3 19200). em uma CPU AMD FX9590 que pode alcançar apenas DDR3-1866, 64 bits. usr_bin_gdb_1000.crash tem 23MB de comprimento.
Saída do terminal:
total de 51 milhões
-rw-r ----- 1 br116 whoopsie 1000K 15 de maio 20:08 _usr_lib_gvfs_gvfsd-afp.1000.crash
-rw-rw-r-- 1 br116 whoopsie 0 15 de maio às 20:08 _usr_lib_gvfs_gvfsd-afp.1000.upload
-rw ------- 1 whoopsie whoopsie 0 15 de maio às 20:43 _usr_lib_gvfs_gvfsd-afp.1000.uploaded
-rw-r ----- 1 br116 whoopsie 23M 16 de maio 21:26 _usr_bin_gdb.1000.crash
-rw-rw-r-- 1 br116 whoopsie 0 16 de maio 21:26 _usr_bin_gdb.1000.upload
-rw ------- 1 whoopsie whoopsie 0 16 de maio 21:26 _usr_bin_gdb.1000.uploaded
-rw-r ----- 1 br116 whoopsie 27M 16 de maio 21:26 _usr_lib_banshee_Banshee.exe.1000.crash
-rw-rw-r-- 1 br116 whoopsie 0 16 de maio 21:26 _usr_lib_banshee_Banshee.exe.1000.upload
-rw ------- 1 whoopsie whoopsie 0 16 de maio 21:26 _usr_lib_banshee_Banshee.exe.1000.uploaded
log do suporte:
ERRO: apport (pid 27370) Ter Mai 16 21:23:05 2017: escreveu o relatório /var/crash/_usr_lib_banshee_Banshee.exe.1000.crash
ERRO: apport (pid 27413) Ter 16 de maio 21:25:39 2017: chamado para pid 27411, sinal 6, limite do núcleo 18446744073709551615
ERRO: apport (pid 27413) terça-feira, 16 de maio de 21:25:39 2017: ignorando o implausível limite do núcleo grande, tratando como ilimitado
ERRO: apport (pid 27413) Ter 16 de maio de 21:25:39 2017: executável: / usr / bin / gdb (linha de comando "gdb - arquivo ex \" / usr / bin / mono-sgen "- ex core-file \ / tmp / apport_core_r4jf1unc --batch --ex conjunto \ backtrace \ limit \ 2000 --ex p \ -99 --ex x / 16i \ $ pc --exp \ -99 --ex thread \ aplique \ all \ bt \ full --ex p \ -99 --eximpress \ __abort_msg- & gt; msg --ex p \ -99 --ex bt \ full --ex p \ -99 --ex info \ registra --exp \ -99 --eximpressão \ __glib_assert_msg --ex p \ -99 --eximpressão \ (char *) \ __nih_abort_msg ")