Как я выключаю диски с systemd?

У меня есть несколько машин Ubuntu и с SSD и с традиционным жестким диском, где жесткий диск используется только иногда.

По причинам сокращения шума, тепла, и потребляемой мощности и расширения времени жизни жесткого диска, я хотел бы выключить его на каждой начальной загрузке и разбудить его только при необходимости.

hdparm -y (или -Y) работы вполне прилично над командной строкой и делают точно, что я хочу.

Но при записи systemd сервиса для выполнения hdparm не работает. Быть более точным: Это работает, и диск действительно засыпает (как отладка шоу), но это сразу разбужено снова (и остается не спящим), потому что существует что-то в системе, которая действительно получает доступ к жестким дискам (и таким образом будит его) в самом конце systemd процесса начальной загрузки.

Таким образом, как я могу поместить a hdparm -y в процессе начальной загрузки достаточно поздно, что это больше не сопровождается никаким другим процессом.

Мое последнее предположение должно было бы изменить цель systemd по умолчанию от графического до нового (sleepydisks), который затем зависит от бывшей графической цели.

Но нет ли более легкий и более простой способ выключить диски?

С уважением

2
задан 24 May 2017 в 17:28

3 ответа

Откройте дисковую утилиту и установите диск автоматически вращаться вниз после 10 минут неактивности.

0
ответ дан 2 December 2019 в 08:59

Используйте-S опцию hdparm. Это устанавливает вращение вниз тайм-аут, который, как предполагается, сохраняется диском.

$ hdparm --help
-S   Set standby (spindown) timeout

$ hdparm -S 60 /dev/sdd
/dev/sdd:
 setting standby to 60 (5 minutes)

Действительно отмечают, что это - прописной 'S'.

0
ответ дан 2 December 2019 в 08:59

Я использую следующий сценарий для "вызывания" бездействующих дисков к spindown, где силой я значу прямую инструкцию для диска, поскольку много дисков WD являются проблемными с self-spindown. Возможно, можно расширить это до потребностей. Сценарий хорошо прокомментирован так, необходимо смочь изменить его довольно легко. Я называю его от cron каждые 20 минут корректируйтесь по мере необходимости:

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

Согласно конкретному вопросу, как сделать это с systemd?... создайте файл таймера, который называет этот сценарий (Касательно: https://wiki.archlinux.org/index.php/Systemd/Timers)

0
ответ дан 2 December 2019 в 08:59

Другие вопросы по тегам:

Похожие вопросы: