LINUX.ORG.RU

Правильная установка Dracut в Debian 13

 ,


1

1

Lenovo Legion S7 15ACH6, система Debian 13, systemd-boot, драйвер NVIDIA 575.51.02 установленный из *.run. После установки dracut запустил команду по принудительному созданию образа:

sudo dracut --force

В итоге получил ошибку вида:

Error: could not copy '/boot/efi/6e89efe7a24a46a4971b88b75205cdfe/6.12.22-amd64/initrd' to '/boot/efi/6e89efe7a24a46a4971b88b75205cdfe/6.12.22-amd64/initrd'.
/usr/lib/kernel/install.d/90-loaderentry.install failed with exit status 1.
run-parts: /etc/initramfs/post-update.d//systemd-boot exited with return code 1

Из объяснений ChatGPT понял что скрипт установки ядер kernel-install повторно запускает генерацию initramfs. Натыкается на уже созданный файл и выдаёт ошибку. Рекомендация чата для решения буквально с первой строки не работает, при рекомендации установки пакета:

$ sudo apt install kernel-install
Error: Unable to locate package kernel-install

В репозиториях такого пакета просто нет.

Подскажите пожалуйста, как исправить, правильно настроить Dracut?

Конфиг Dracut:

install_items+=" /etc/modprobe.d/nvidia-installer-disable-nouveau.conf /etc/modprobe.d/nvidia.conf "
add_drivers+=" nvidia nvidia_modeset nvidia_uvm nvidia_drm "
install_items+=" /lib/firmware/nvidia/* "

hostonly=yes
use_fstab=yes
compress="zstd"


Последнее исправление: Alter_RK (всего исправлений: 2)

У меня тоже systemd-boot, и я так и не понял, как теперь юзать dracut отдельно — такое ощущение, что он заточен для grub. Однако его конфиг настроил и он отрабатывает корректно, когда ставлю новое ядро.

Разбираться не стал, просто если надо обновить конфигурацию при старом ядре, то тупо переустановлю ядро через dnf 😁

papin-aziat ★★★★★
()

Из объяснений ChatGPT понял что скрипт установки ядер kernel-install повторно запускает генерацию initramfs

А причём здесь установка ядра? Ты понимаешь, что делает dracut?

Смотри логи systemd-boot. Там скорее всего тупо прав или места не хватает.

shell-script ★★★★★
()
Ответ на: комментарий от papin-aziat

как теперь юзать dracut отдельно — такое ощущение, что он заточен для grub

Неправильное ощущение. Он не зависит от пакетного менеджера, загрузчика или инит-системы. Dracut по умолчанию делает ровно одно простое действие. Генерирует initram-образ и кладёт его по указанному пути(зависит от настроек). Всё. Больше он не делает ничего. Не ставит ядра, не использует пакетный менеджер. Не конфигурит загрузчик.

Я использую его в Gentoo, Debian и OracleLinux. Причём не просто для генерации initrd, а со своими самописными модулями, разной степени сложности.

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

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

Для раздела EFI выделил 1G, на данный момент заполнен на 50%. Насчёт ядра, перепечатал то что написал ChatGPT. Потому и задал вопрос для разъяснения.

Когда обновляется ядро, ошибки не возникает. А если запустить принудительно тогда да.

Хочу узнать как его настроить правильно

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

Ну вот и не надо спрашивать у чатбота. Смотри конфиги. Смотри логи.

У dracut конфиги могут лежать не только в /etc/dracut.conf, а и в /etc/dracut.conf.d/

А вообще, в дебиане для работы с initramfs есть свои инструменты. Пакет initramfs-tools. Я использую dracut именно потому, что у меня под него свои модули написаны. А в обычной ситуации, должно хватать стандартных дистрибутивных инструментов. Разумеется, после ознакомления с манами.

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

Спасибо.

Теперь, когда командую dracut -f, то он не туда всё раскладывает, а где перенастроить не понял. Можно как-то ему сказать, что теперь systemd-boot и т.д., или надо руками всё?

papin-aziat ★★★★★
()
Ответ на: комментарий от papin-aziat
dracut -f /path/to/new/initrd.img

Положит по указанному пути. А вот нужно ли после того, как ты обновил образ, что-то делать в systemd-boot, я уже не знаю. Это не задача драката.

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

А вот нужно ли после того, как ты обновил образ, что-то делать в systemd-boot, я уже не знаю

Нужно. sd-boot поддерживает только FAT32. В Debian /boot должен (был?) быть на ФС с поддержкой hard links. Таким образом, ядро и initrd нужно скопировать на ESP. Последний раз я пользовался dracut и sd-boot (с UKI) в Debian 12, и всё работало нормально с некоторыми дополнениями. В 13 интеграцию улучшали, могли что-то сломать.

anonymous
()
Ответ на: комментарий от shell-script

Тут видишь чё, у меня соответственно отдельный /boot, и там по адресу, скажем,

/boot/efi/0988f77b04884a77a28106b4d929fd14/4.18.0-553.50.1.el8_10.x86_64

лежат initrd и linux. И так для каждого ядра. Это образуется автоматически при установки нового ядра.

Стало быть, чтобы обновить initrd я должен скомандовать dracut -f /boot/efi/0988f77b04884a77a28106b4d929fd14/4.18.0-553.50.1.el8_10.x86_64/initrd ?

А вот нужно ли после того, как ты обновил образ, что-то делать в systemd-boot, я уже не знаю.

Видимо ничего делать не надо. EFI boot manager я обновляю каждый раз после обновления systemd, командой

sudo bootctl update
papin-aziat ★★★★★
()
Ответ на: комментарий от anonymous

Таким образом, ядро и initrd нужно скопировать на ESP.

Я это сделал один раз, при переходе с grub на systemd-boot и всё, дальше всё само работает. (только у меня клон Шапки)

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

дальше всё само работает

Оно и в Debian работает довольно давно, а к релизу 13 там планировали сделать sd-boot равноправным с GRUB. Но что-то сломалось, похоже. Возможно, только у автора темы. Насколько я помню, несколько месяцев назад такая конфигурация работала.

anonymous
()
Ответ на: комментарий от shell-script

dracut -f /path/to/new/initrd.img

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

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

Это очень странно. От версии он зависеть не может. Насколько я знаю, это дефолтное поведение dracut во всех версиях. Посмотри в dracut --help

[root@192 ~]# mkdir tmp
[root@192 ~]# ls -la tmp/
итого 8
drwxr-xr-x 2 root root 4096 апр 30 19:23 .
dr-xr-x--- 5 root root 4096 апр 30 19:23 ..
[root@192 ~]# dracut -f >/dev/null tmp/initrd.img
[root@192 ~]# ls -la tmp/
итого 44404
drwxr-xr-x 2 root root     4096 апр 30 19:24 .
dr-xr-x--- 5 root root     4096 апр 30 19:23 ..
-rw------- 1 root root 45459417 апр 30 19:24 initrd.img

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

Вроде разобрался. Оказывается -f надо использовать только если уже есть образ, а если нет, то он ничего не делает, но без -f — делает. Правда у меня почему-то полученный образ отличается, на 1.7 мегабайт от того, который был создан при установке ядра.

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

Это ненормальное поведение. См. выше. Ключ -f нужен для того, чтобы переписать уже имеющийся образ, да. Но если образа нет, он не мешает.

shell-script ★★★★★
()
Последнее исправление: shell-script (всего исправлений: 1)
Ответ на: комментарий от papin-aziat

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

Если не ошибаюсь, в RHEL initrd после установки ядра обновляется только вручную (для конкретной версии), то есть могло за это время в системе что-то поменяться. Плюс скрипты, которые генерируют initrd при установке ядра, могут добавлять какие-то параметры при вызове dracut. Но вообще чего гадать — сравни вывод lsinitrd для обоих файлов.

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

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

Не понял, как это вручную? Прилетает ядро, и в /boot/efi появляется новый initrd и linux в соответствующем каталоге (я выше пример дал).

Мне остаётся только перегрузиться в меню sd-boot и указать ядро по умолчанию клавишей D, всё.

papin-aziat ★★★★★
()
Ответ на: комментарий от shell-script

Это ненормальное поведение.

Ты прав

# pwd
/boot/efi
# mkdir papin-aziat; cd papin-aziat
# dracut -f ./initd
# ls
initd

Это видимо из-за того, что я от юзера запускал в хомяке, там ещё и ошибки были всякие 🙂

Теперь и размеры совпадают.

papin-aziat ★★★★★
()
Ответ на: комментарий от anonymous

Плюс скрипты, которые генерируют initrd при установке ядра, могут добавлять какие-то параметры при вызове dracut.

Я думал, что настройки берутся по умолчанию строго из /usr/lib/dracut/dracut.conf.d и соответственно свои из /etc/dracut.conf.d, на этом всё. Иначе как я буду контролировать initramfs, если они будут мне своё подсовывать?

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

Прилетает ядро, и в /boot/efi появляется новый initrd и linux в соответствующем каталоге (я выше пример дал).

И больше этот не обновляется. Например, systemd обновился, а в initrd будет всё тот же.

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

А как связаны systemd и initramfs? Я не вижу связи. Обновляю по отдельности (тоже говорил выше), вернее руками только efi boot manager.

initrd и linux ложатся при обновлении ПМ-ом в соответствующие каталоги в /boot/efi/многацифер_и_букв, а boot manager в /boot/efi/EFI/BOOT и /boot/efi/systemd.

papin-aziat ★★★★★
()
Ответ на: комментарий от kostik87

Ставлю из run потому что, на моей гибридной видеосистеме лишь на 570 версии более или менее заработал GNOME без вылетов. В репозиториях 535 и я не понимаю политику майтенеров в данном вопросе. В эксперементальной ветке добавили 550 буквально на неделе. Вопрос, почему не 570 сразу? Отстали и есть возможность догнать. В сиде только 535, но нет, мы идем своим путём.

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

Думаю посмотреть как сделают в проекте, ссылку на который дал выше. Хочется странного, что бы всё ПРОСТО работало ;)

Alter_RK
() автор топика
Ответ на: комментарий от papin-aziat

А как связаны systemd и initramfs?

systemd в initrd, если используется dracut. В Debian есть инфраструктура триггеров: когда обновляется пакет, который интегрируется в initramfs/initrd, образ пересобирается.

anonymous
()
Ответ на: комментарий от Alter_RK

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

Загрузкой модуля занимается само ядро.

В начале запуска Linux в качестве корневой файловой системы подключается initramfs и далее ядро проверяет по ID оборудования какие модули под него из имеющихся подходят.

Если в initramfs есть модуль nvidia.ko - оно его загрузит.

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

Зачем ты пишешь про инструкцию?

Повторяю ещё раз, скорость инициализации видео карты Nvidia зависит лишь от наличия или отсутствия модуля Nvidia в initramfs,

Если в initramfs нет модуля nvidia, то он будет загружен только после того, как будет смонтирована реальная корневая файловая система.

Без разницы dracut его собирал или классический для debian пакет initramfs-tools.

Т.е. на мой взгляд ставить dracut никакого смысла нет. Достаточно было после установки драйвера nvidia пересобрать Initramfs посредством команды

dpkg-reconfigure initramfs-tools

К тому же установив драйвер nvidia из run файла теперь при каждом обновлении ядра тебе придётся пересобирать модуль ядра руками. Ну либо, если есть dkms - ставь его и настраивать.

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

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