Ошибки dracut при загрузке - что делать

Ответить
euspectre
Сообщения: 1101
Зарегистрирован: 21 дек 2012, 15:24
Operating system: Linux в разных вариантах

Ошибки dracut при загрузке - что делать

Сообщение euspectre » 12 июн 2017, 18:47

Наткнулся вчера на странный баг: после установки на ноутбук с ROSA R8.1 проприетарных драйверов NVidia система стала виснуть при загрузке на самых ранних стадиях. Если подождать какое-то время - начинала выдавать сообщения о "timeout scripts", затем вываливалась в dracut debug shell ("dracut #").

"Вскрытие" показало, что механизм загрузки не увидел диск, что выглядело, мягко говоря, странно.

Что оказалось в итоге: в некоторых случаях при перегенерации initrd (делается при установке и обновлении ядра или проприетарных драйверов, например) система не добавляет в initrd драйверы, необходимые для работы с диском. Соответственно, при следующей загрузке диск не виден - всё висит.

Почему механизм создания initrd так себя ведёт - пока не знаю.

Хорошие новости: обойти этот баг оказалось не очень сложно. Этому механизму можно сказать, чтобы не умничал, оптимизируя initrd для данной машины, а просто клал туда всё, что нужно. Для этого достаточно загрузить систему хоть как-нибудь, например, с другим ядром из уже установленных, затем создать файл /etc/dracut.conf.d/90-generic-initrd.conf с таким содержимым:

Код: Выделить всё

hostonly="no"
После этого нужно перегенерировать initrd для того ядра, с которым хотите загружать систему. Если это то же ядро, которое сейчас загружено, достаточно вызвать "dracut -f". Если нужно для другого ядра, то сначала найдите в /boot нужный initrd-файл - файл initrd-<полная_версия_ядра>.img. Затем выполните

Код: Выделить всё

dracut -f /boot/initrd-<полная_версия_ядра>.img <полная_версия_ядра>
Например, на моей системе так:

Код: Выделить всё

dracut -f /boot/initrd-4.9.31-nrj-desktop-1rosa-x86_64.img 4.9.31-nrj-desktop-1rosa-x86_64
Затем выполните "sync" на всякий случай и можно перезагружать систему. В моём случае перезагрузка теперь прошла нормально.

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

Из минусов - такие inird, не оптимизированные под данную машину, требуют больше места (55-60Мб вместо 12-15Мб) и создаются несколько дольше. Обычно это не проблема.

trs
Сообщения: 1939
Зарегистрирован: 07 сен 2015, 16:08
Operating system: -

Re: Ошибки dracut при загрузке - что делать

Сообщение trs » 13 июн 2017, 07:58

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

Может имеет смысл дописать в add_drivers перечень жизненно важных драйверов в /usr/lib/dracut/dracut.conf.d/01-rosa.conf, как это сделано для ряда модулей. Или включить их в ядро.

Кстати, без драйверов hid_generic и usbhid ничего нельзя сделать в консоли dracut в случае ошибки (на планшете). И вот ещё кандидаты, что бы можно было логи на внешний носитель сохранить: usb-storage, sdhci_acpi и mmc_block.

euspectre
Сообщения: 1101
Зарегистрирован: 21 дек 2012, 15:24
Operating system: Linux в разных вариантах

Re: Ошибки dracut при загрузке - что делать

Сообщение euspectre » 13 июн 2017, 11:15

trs писал(а):С подобным поведением легко столкнуться, если собрать ядро, где часть драйверов слинкованы статически, запустить на нём систему, после чего установить другое из репозитория. dracut посчитает, что драйвера не загружены, значит не нужны и для нового ядра. В каких ещё случаях может такое произойти, тоже не знаю.
Я провёл эксперимент на одном и том же ядре. Создал initrd для него - посмотрел состав. Установил nvidia375, создал initrd для того же ядра - посмотрел состав и увидел, что в initrd не стало драйвера ata_generic + ещё нескольких. На другой машине, с другим ядром так "исчез" драйвер ahci и т.д.
trs писал(а):Может имеет смысл дописать в add_drivers перечень жизненно важных драйверов в /usr/lib/dracut/dracut.conf.d/01-rosa.conf, как это сделано для ряда модулей.
Можно, но поддерживать это будет тяжело. Особенно, если в новых версиях ядра эти драйверы переименуют, раздробят/объединят и т.п. Проходили это только недавно с ext3, чуть раньше - с xhci_hcd и ещё чем-то. Без обновления dracut нельзя было обновить ядро в итоге, а если обновить - всё отваливалось у пользователей со старым ядром, сборка образов валилась и т.п.

В общем, после той катавасии я пришёл к тому, что такие вещи надо чинить в dracut непосредственно. И в upstream патчи слать. Тяжелее сейчас, но дешевле в перспективе.

Кстати, если заметили, в 01-rosa.conf сейчас нет явного добавления драйверов в initrd. Именно поэтому и нет.

add_drivers - это всё-таки для обхода конкретных багов на отдельных машинах, как временное решение до тех пор, пока не будет починен сам dracut. Как-то так.
trs писал(а):Кстати, без драйверов hid_generic и usbhid ничего нельзя сделать в консоли dracut в случае ошибки (на планшете). И вот ещё кандидаты, что бы можно было логи на внешний носитель сохранить: usb-storage, sdhci_acpi и mmc_block.
Проще перейти на generic (не host-only) initrd. Они жирнее, но надёжнее.

Только, возможно, ещё подправить тот же dracut, чтобы не клал в initrd видеодрайверы, а firmware брал только то, что в MODULE_FIRMWARE указано для включаемых в initrd драйверов, а не всё. Ну, и выкинуть то, что касается OpenGL, оттуда, только мешает. Это всё позволит размеры initrd сократить.

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

trs
Сообщения: 1939
Зарегистрирован: 07 сен 2015, 16:08
Operating system: -

Re: Ошибки dracut при загрузке - что делать

Сообщение trs » 13 июн 2017, 12:07

euspectre писал(а):в перспективе, в качестве бредовой идеи, - вообще поставлять initrd в виде бинарников, а не перегенерировать по поводу и без на машинах пользователей.
Ядро начиная с версии 4.11 при make install вызывает и dracut. Похоже, как раз для этого.
И, кстати, Android-x86 с таким initrd и живёт. Причём в образе вообще отсутствуют какие-либо драйвера.

dmitrypp
Сообщения: 173
Зарегистрирован: 10 окт 2016, 03:38
Operating system: Rosa Fresh Plasma5 R10 x86_64

Re: Ошибки dracut при загрузке - что делать

Сообщение dmitrypp » 13 июн 2017, 16:41

deleted

Ответить