2

У меня есть ноутбук с ssd для основного диска ОС и большой вращающийся диск для хранения. В настоящее время у меня есть псевдоним, который я использую для ручного раскручивания диска, когда я его не использую (конечно, после отключения):

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

Это безопасно для использования? Будет ли hdparm отказываться делать это, если накопитель еще не синхронизирован или я забыл его отключить? Если нет, есть ли способ использовать hdparm (или другую утилиту), чтобы проверить, безопасно ли это делать?


ОБНОВИТЬ --

Насколько я ценю оба ваших ответа, они мне совсем не помогают, потому что я пробовал бесчисленное множество различных комбинаций значений для параметров APM и времени замедления, без каких-либо результатов, кроме как а) менее чем за 10 секунд до замедление б) нет замедления, но случайная парковка, или в) нет замедления или парковки. Я также пытался найти в Интернете мою конкретную модель привода и соответствующие значения APM, но безрезультатно.

Итак, я хотел бы пойти в следующем направлении: мне нужно найти способ проверить, используется ли диск, чтобы я мог написать сервис systemd. Ближайший, к которому я могу прийти, это lsof | grep /mnt/data или что-то подобное. Но, как вы можете видеть, это далеко не идеально. Я хотел бы получить метод достижения этого, который не зависит от заранее определенной точки монтирования или жадных множественных вызовов процессора lsof +D mntpoint в ответе, который я сам дал.

Посмотрите мой ответ ниже, чтобы понять, что я пытаюсь сделать.

4 ответа4

3

У вас есть псевдоним! Может быть, лучше иметь скрипт, который выполняет синхронизацию / размонтирование, а затем вызывает hdparm. Добавьте скрипт в файл sudoers.

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

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

Тогда добавьте к sudoers. Это может сработать:

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

DanielB сделал блестящее предложение: используйте autofs для автоматического монтирования / размонтирования локального диска (я никогда не думал об использовании его таким образом, так как я обычно работаю на серверах и так как autofs традиционно был для NFS). Затем, когда это настроено (не спрашивайте меня, как;)), добавьте что-то вроде этого в 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

Обязательно замените DISK-DEV и MOUNTPOINT (если Disk-dev имеет 0 или 1 раздел, вы можете использовать его для MOUNTPOINT). Обратите внимание: на самом деле я не могу проверить это, поскольку единственная физическая система, к которой у меня есть доступ к АТМ, - это устройство RAID, и контроллер не поддерживает эти команды.

3

Вместо того, чтобы пытаться понять это вручную, положитесь на существующие вещи. Я использую HD-Idle на моем файловом сервере, он отлично работает. Я также не размонтирую свои диски, потому что на самом деле нет причин делать это. Если я хочу получить доступ к файлу, диски будут раскручиваться. Затем, после истечения времени ожидания, они снова начнут вращаться.

Если вы супер параноик по поводу целостности данных, вы можете использовать autofs, которые могут автоматически монтировать и размонтировать ваши файловые системы по мере необходимости. Я не использовал это сам, но страница ArchWiki предлагает некоторую информацию, которая выглядит довольно удобной.

1

Вот мой взлом сценария до сих пор. Я буду держать это открытым, пока кто-нибудь не найдет лучшее решение ...

#!/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.*$|\1|" \
            >"$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

Мне все еще придется выяснить, как обернуть это в службу systemd, которая запускается каждые X минут. Очевидно, было бы лучше, если бы была альтернатива использованию lsof и grep. Кроме того, я не уверен, что это будет работать с забавными символами точки монтирования из-за использования grep. Кроме того, его необходимо будет пересмотреть, если у вас более 9 разделов.

Пожалуйста, если у вас есть какие-либо предложения, не стесняйтесь.

1

Заметка

Вам не нужно размонтировать разделы, чтобы раскрутить жесткий диск. Будет проще, если вы просто установите время ожидания (это сработает через некоторое время, когда оно не используется). Таким образом, при необходимости диск проснется (раскрутится), и вы сможете использовать его сразу, без необходимости перемонтировать разделы.

Решение для командной строки

Как @Nattgew предложил для комментария, используйте hdparm (если это инструмент, который вы хотели бы использовать) с опцией -S чтобы установить тайм-аут ожидания:

-S   Set standby (spindown) timeout

Таким образом, диск будет автоматически вращаться, когда нет активности.

Чтобы сделать это изменение постоянным (т.е. после перезагрузки), вам может потребоваться внести изменения в /etc/hdparm.conf . Или, возможно, поскольку ваш дистрибутив в настоящее время, вероятно, использует systemd , вам может потребоваться создать модуль:

https://unix.stackexchange.com/a/89013/66295

Вероятно, самый простой способ - использовать графический инструмент ... (да, иногда, когда в вашей системе уже включен графический интерфейс, это самый быстрый способ)

GUI решение (GNOME)

Поскольку вы говорите, что используете свой ноутбук, я предполагаю, что у вас действительно есть графический интерфейс. В дистрибутивах GNOME есть программа "Диски":

Выбрав жесткий диск, который вы хотите перевести в режим ожидания, вы можете нажать "Настройки диска" в меню (или сочетание клавиш CTRL + E также может быть ярлыком):

Затем измените настройки времени ожидания:

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .