LINUX.ORG.RU

Усыпление hdd непосредственно перед выключением\перезагрузкой

 , ,


0

1

Есть Raspberry Pi4, к которой прицеплен hdd в usb порт. На этом диске стоит ОС.

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

Хочется этого избежать и не городить отдельное питание диску. Для этого планирую усыплять диск через

hdparm -Y /dev/sda

Но ввиду того, что при завершении работы всякое еще пишется на диск, то надо его усыплять непосредственно перед выполнением systemd-reboot.service

Я написал отдельный service для systemd, с типом oneshot и выполнением команды, указанной выше. В After указал тоже самое, что задано в одноименном параметре в systemd-reboot. В systemd-reboot дописал в After имя созданной службы.

При перезагрузке все равно аварийно паркует головки.

Как правильно достичь желаемого? @intelfx ты вроде гуру в системдях, не подскажешь?

UPD: добавил в свой service Before=systemd-reboot.service и ExecStartPost=/usr/bin/sleep 15 Теперь долго тупит перед перезагрузкой (полагаю диск засыпает, но просыпается обратно перед выполнением systemd-reboot). Потом все равно при перезагрузке щелкает головками.

★★★★★

Нашел как подобное решают для odroid

https://wiki.odroid.com/odroid-xu4/troubleshooting/shutdown_script

Убрал свои костыли, попробовал описанный по ссылке метод. По звуку и задержке диск паркуется, но все равно перед самой перезагрузкой просыпается и клацает при перезагрузке.

gutaper ★★★★★
() автор топика
Последнее исправление: gutaper (всего исправлений: 1)
Ответ на: комментарий от burato

Оно есть. У меня малина от poe-свитча питается. И также через отдельный poe-сплиттер питается диск в доке.

Но это очень громоздко и аж 2 порта занято. А хочется компактно и чтобы один был. Лимит питания вроде 20 ватт на порт, малина с диском ест около 10 без нагрузки.

gutaper ★★★★★
() автор топика
Последнее исправление: gutaper (всего исправлений: 1)
Ответ на: комментарий от burato

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

gutaper ★★★★★
() автор топика
Последнее исправление: gutaper (всего исправлений: 1)

Как правильно достичь желаемого?

Сначала нужно согласовать желаемое с действительным.

гуру в системдях

Тебе нужен не «гуру в системдях», а понимание того, как работает линукс в принципе. А вообще — КЛБ, да.

intelfx ★★★★★
()
Последнее исправление: intelfx (всего исправлений: 1)
Ответ на: комментарий от intelfx

А по делу есть что, кроме напыщенных общих фраз? Для понимания того, что при выключении\перезагрузке есть момент, когда уже остановлены службы, в том числе логирование и далее осталось лишь перезагрузиться - не надо какого-то мифического понимания «как работает линукс».

И вопрос собственно простой: как в этот момент отправить системный диск в sleep, чтобы при сбросе питания не было аварийной парковки.

Systemd может так? Просто да\нет, без этого вот важного причмокивания губами.

Если не знаешь - то можно так и написать. Если, конечно, гордыня и чсв позволяют.

gutaper ★★★★★
() автор топика
Последнее исправление: gutaper (всего исправлений: 2)
Ответ на: комментарий от gutaper

А по делу есть что, кроме напыщенных общих фраз? Для понимания того, что при выключении\перезагрузке есть момент, когда уже остановлены службы, в том числе логирование и далее осталось лишь перезагрузиться - не надо какого-то мифического понимания «как работает линукс».

К сожалению, такого момента не существует :) Последним диски трогает ядро, внутри системного вызова reboot.

Если, конечно, гордыня и чсв позволяют

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

intelfx ★★★★★
()
Последнее исправление: intelfx (всего исправлений: 1)
Ответ на: комментарий от intelfx

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

Слолжно быть не правым в том, чего не знаешь. А если бы я знал, я бы пост не создал, а просто сделал бы.

К сожалению, такого момента не существует :) Последним диски трогает ядро, внутри системного вызова reboot.

Ясно, спасибо за информацию. Для меня это не очевидно.

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

Можно же было сразу так и написать, без этой надменности ;)

gutaper ★★★★★
() автор топика
Ответ на: комментарий от gutaper

Вобще, гуглится про /lib/systemd/system-shutdown/ , но может это уже устарело. Вроде там можно развместить ваш скрипт, сделать там sleep 1, потом дождаться отсутствия других скриптов в списке процессов. Вроде как в этот момент ФС уже в RO, поэтому можно усыпить диск и делать reboot через /proc/sysrq-trigger...

В теории, можно было бы вобще перед выключением делать корневую ФС в ОЗУ и удалять диск из системы через /sys/block/sdX/device/delete, но с systemd это не сработает, после pivot_root() останутся открытые им файлы на old_root и его не отмонтировать.

mky ★★★★★
()
Ответ на: комментарий от mky

Вобще, гуглится про /lib/systemd/system-shutdown/

Да, это я тоже попробовал. По ссылке в первом комменте как-раз туда и кладут. Там и подглядел.

Слишком сильных приседаний я делать не готов для решения :) Я думал обойтись средствами systemd. Но нет, так нет. Это не самоцель была, а лишь попытка сократить сущности.

gutaper ★★★★★
() автор топика