О правильной остановке внешних дисков и победившей контейнеризации
Надо оставить тут заметку, чтобы не потерять. Возникла у меня проблема - накрылась в очередной раз от периодических отключений питания и отсутствия бесперебойника файловая система на домашнем сервере. Можно было конечно восстанавливать её работоспособность, но объективно было пора переходить на новую. Так как сервер в своё время стоял под телевизором и какое-то время выполнял роль ТВ приставки с Kodi и прочей мультимедией, то на сервере было много всего лишнего, поэтому наиболее идеологически верным было поставить всё с нуля и перенести лишь необходимое. До этого я пользовался proxmox, но уже давно мне не нужны были честные виртуальные машины (а когда они будут нужны, проще на рабочей машине поднять виртуалку в VirtualBox), а все необходимые мне сервисы я давно перенёс в докер.
Чему я порадовался сразу - так тому, что каталог /var/lib/docker находился на отдельном ssd диске и для того, чтобы завелось 90% того, что мне было нужно, достаточно было поставить docker, docker-compose, прописать в /etc/fstab строку вида
/mnt/ssd/docker /var/lib/docker none bind 0 0
После чего дёрнуть systemctl start docker и всё встало на свои места. Но для полного счастья не хватало одной детали. У меня к серверу подключен внешний жёсткий диск Seagate на 4тб через USB3.0 и его шпиндель постоянно вращается. То, что это создаёт дополнительный шум, уже не так важно, поскольку диск находится в том месте, откуда я его работу не слышу. Но опыт подсказывает, что любые движущиеся части намного больше подвержены износу, чем находящиеся в состоянии покоя. В среднем 10-11 часов в сутки я нахожусь на работе, почти всё остальное время - в пути на работу и обратно, либо сплю, поэтому вращающийся 24/7 шпиндель жёсткого диска - это неприемлимо. Конечно, можно было бы отключать диск физически, пока он мне не нужен, но в том-то и дело, что нужен он становится внезапно. Скажем, на работе я вспоминаю, что дома на шаре хранится какой-то подходящий кусок кода или другая нужная информация. Или полезно бывает слить фотографии с телефона на удалённую шару. Одним словом, диск должен быть доступен постоянно, но при этом не должен издавать звуков, сильно нагреваться и расходовать свой ресурс зря. Всё-таки 4тб - это недешёвое удовольствие, по крайней мере для меня.
Казалось бы, есть два известных всем способа остановки шпинделя - с помощью hdparm и smartctl, но ни один из них у меня не заработал. Вот пример с hdparm:
corpse@pve [23:40:44]:~$ sudo hdparm -y /dev/sdc
/dev/sdc:
issuing standby command
SG_IO: bad/missing sense data, sb[]: 70 00 05 00 00 00 00 0a 00 00 00 00 24 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
corpse@pve [23:40:46]:~$ sudo hdparm -B1 /dev/sdc
/dev/sdc:
setting Advanced Power Management level to 0x01 (1)
SG_IO: bad/missing sense data, sb[]: 70 00 05 00 00 00 00 0a 00 00 00 00 24 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
SG_IO: bad/missing sense data, sb[]: 70 00 05 00 00 00 00 0a 00 00 00 00 24 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
APM_level = not supported
APM_level = not supported - знакомая история? Со многими usb2sata переходниками есть такая проблема даже с достаточно современными. Проблема в том, что и hdparm и smartctl если не устарели, то достаточно сильно отстали от жизни. Я начал искать альтернативы. Нашёл статью, где для решения проблемы предлагалось собрать утилитку по названием hd-idle. Сразу насторожило, что проект расположен на sourceforge. Прошёл по ссылке - и точно - Last Update: 2014-04-06. Решил поискать на гитхабе что-то посвежее и наткнулся уже на совсем современный проект с идентичным названием. И он прекрасен всем. Написан на Go, последний коммит - меньше недели назад, есть и исходники (само-собой, это же гитхаб!) и бинарные сборки и даже deb пакеты. И, что самое главное, works like a charm, как говорится.
Качаем deb из последнего релиза, ставим через dpkg -i package name и всё, можно пользоваться!
hd-idle -i 1 -t /dev/sdс
После этого мой жёсткий диск затих. Никаких проблем, никаких ошибок. А при последующем обращении к смонтированой файловой системе - шпиндель как и положено, раскрутился снова. Если бы я знал заранее о существовании именно этой утилиты, я бы сэкономил себе минимум два часа жизни, не пытаясь мучительно пропатчить hdparm. Далее можно делать с этим что угодно - ставить в скрипты непосредственно после бекапа, добавить в крон, если нужно, или (об этом написано в README.md репозитория) в случае с debian based os отредактировать /etc/default/hd-idle и запускать через systemd, что я и сделал. На этом сегодня всё.