Вопрос или проблема
Я пытаюсь сделать так, чтобы загрузочный экран, который я создал в своем унифицированном образе ядра, оставался на экране дольше во время загрузки системы. В данный момент переход от логотипа UEFI к загрузочному экрану полностью бесшовный, но загрузочный экран отключается за значительное время до появления экрана входа. Я не ожидаю идеального бесшовного перехода от загрузочного экрана к экрану входа, хотя было бы неплохо, но должно быть какое-то средство, чтобы хотя бы удерживать его немного дольше во время инициализации процессов, не требующих отображения. Судя по проведенным исследованиям, какой-то процесс очищает начальный кадровый буфер, установленный ядром, с чем я предпринял несколько шагов для решения, но я не совсем уверен, что сделал все, что мог. Вот краткий обзор всех моих различных настроек.
Загрузочный экран встроен в унифицированный образ ядра с использованием /etc/mkinitcpio.d/linux.preset
default_uki="/boot/arch-linux.efi"
default_options="--splash=/etc/mkinitcpio.d/bootsplash.bmp"
KMS удален из хуков mkinitcpio.conf, чтобы предотвратить раннюю настройку режима графическим процессором
HOOKS=(systemd autodetect microcode modconf keyboard sd-vconsole block filesystems)
amdgpu.seamless=1 добавлен к параметрам ядра для сглаживания перехода на amdgpu, когда он неизбежно берет на себя управление, а также различные параметры подавления вывода
quiet
loglevel=3
systemd.show_status=auto
rd.udev.log_level=3
vt.global_cursor_default=0
amdgpu.seamless=1
Я также добавил строку TTYVTDisallocate=no
как в systemd-vconsole-setup.service, так и в [email protected]
Кто-нибудь может подумать о чем-то, что я должен изменить/добавить/попробовать?
Пожалуйста, воздержитесь от предложения использовать Plymouth, он известен своими ошибками, если вы не используете оборудование и программное обеспечение, которые хорошо с ним интегрируются. Я пытался в течение двух дней подряд, единственный способ, как я смог добиться бесшовного перехода от UEFI к загрузочному экрану, был в конфигурировании на использование драйвера simpledrm, который полностью испортил разрешение. Выбор драйвера amdgpu и настройки режима ядра с Plymouth приводит к черному экрану между логотипом UEFI и загрузочным экраном из-за времени, необходимого для инициализации amdgpu. Это хорошо задокументированная проблема, если потратить время, чтобы вникнуть в нее. Снова, пожалуйста, не предлагайте мне использовать Plymouth. Я не ищу альтернативы загрузочным экранам, я ищу ответ на вопрос в заголовке поста. Возможно, нет способа это сделать, и если это так, то пусть будет, но именно это я здесь и пытаюсь выяснить. Спасибо, что уделили время на чтение.
Ответ или решение
Для того чтобы предотвратить очистку фреймбуфера ядра в процессе загрузки и инициализации системы, необходимо учитывать несколько ключевых аспектов, включая настройки ядра, конфигурацию загрузчика и взаимодействие с графическим драйвером. Важно придерживаться последовательного подхода для решения данной проблемы.
Описание проблемы
Во время загрузки системы, после завершения фаз инициализации UEFI, происходит переход к экрану загрузочного сплэша, который, к сожалению, не остаётся на экране до появления экрана входа. Это может быть связано с тем, что некоторые процессы системы очищают первоначально установленный фреймбуфер, тем самым убирая ваш сплэш-экран.
Рекомендации по предотвращению очистки фреймбуфера
-
Проверьте параметры ядра:
Убедитесь, что ваши параметры ядра заданы корректно. Вы уже добавилиquiet
,loglevel=3
,systemd.show_status=auto
, что помогает уменьшить вывод во время загрузки. Также проверьте, есть ли другие параметры, которые могут помочь удержать фреймбуфер до завершения инициализации системы. -
Изменение конфигурации mkinitcpio:
Убедитесь, что ваши хуки вmkinitcpio.conf
оптимально настроены. Удалениеkms
было верным шагом, однако, может быть полезно добавитьfbcon
в хуки для улучшения работы с фреймбуфером:HOOKS=(base udev autodetect modconf block filesystems fbcon)
-
Управление системными сервисами:
Отмените выделение виртуальных терминалов в системных сервисах. Вы уже добавилиTTYVTDisallocate=no
вsystemd-vconsole-setup.service
, но также проверьте другие сервисы, которые могут вызывать очистку экранного отображения. Обратите внимание на такие сервисы, какsystemd-journald
, ведь они могут вмешиваться в вывод информации на дисплей. -
Конфигурация инициализации драйвера:
Убедитесь, что инициализация вашего драйвераamdgpu
происходит как можно позже в процессе загрузки. Вы можете добавить параметры черезinitramfs
, где можно управлять временем вызова инициализации драйвера. Это может помочь сохранить сплэш на экране дольше времени. -
Пользовательский скрипт для загрузки:
Рассмотрите возможность написания пользовательского начального скрипта (init script), который будет управлять тем, когда именно фреймбуфер очищается или обновляется. Это может быть реализовано черезsystemd
, где вы можете задать приоритет запуска вашего пользовательского скрипта до запуска ключевых сервисов, которые могут очищать экран.
Заключение
Несмотря на все предпринятые меры, возможно, что полностью избежать очистки фреймбуфера не получится, так как это может быть вызвано архитектурными особенностями взаимодействия с оборудованием и драйверами. Однако, перечисленные рекомендации могут помочь вам значительно улучшить совместимость сплэша с процессами загрузки.
Если указанные шаги не приведут к желаемому результату, возможно, стоит рассмотреть вопросы о взаимодействии с сообществом Arch для получения более детализированной информации о специфике вашего оборудования и настройки системы.