Como desligo discos com o systemd?

3

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

    
por Hadmut 24.05.2017 / 15:12

3 respostas

0

Abra o utilitário de discos e defina a unidade para girar automaticamente após 10 minutos de inatividade.

    
por psusi 25.05.2017 / 03:51
0

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.

    
por Devakhim 21.06.2017 / 08:08
0

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 )

    
por Mark 25.05.2017 / 10:58
___ tag1231604 ___ Sexta versão LTS (Long Term Support) do Ubuntu, codinome "Xenial Xerus". Lançado em 21 de abril de 2016. Will End Of Life (EOL), abril de 2021. Use esta tag somente se sua pergunta for específica à versão. Não use isso para arquivar bugs! ___ qstntxt ___

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:


br116 @ br116: ~ $ ls -ltrh / var / crash /

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 ")

    
___ conky-all diz que está instalando o cairo, mas lua não consegue encontrar o cairo em nenhum lugar