LINUX.ORG.RU

Гонка между systemd-vconsole-setup и загрузкой модуля видеоадаптера (i915)

 , , ,


3

2

Как известно, при регистрации нового драйвера фреймбуфера сбрасываются все прежние настройки фреймбуфер-консоли, в частности, загруженный шрифт и прочее. Следовательно, возникает необходимость запускать systemd-vconsole-setup.service строго после загрузки модуля i915, который заменяет VESA-фреймбуфер на собственный.

Вопрос - как это сделать? «Из коробки» мы имеем гонку между udev и указанным сервисом.

Что пробовал:

  • Wants=systemd-udev-settle.service
    After=systemd-udev-settle.service
    
    Недостатки: медленный запуск и костыльно, т. к. settle не рекомендуется к использованию.
  • After=systemd-modules-load.service
    
    И «/etc/modules-load.d/i915.conf» с содержимым «i915».
    Недостатки: у меня modules-load достаточно много всего подгружает, и в такой ситуации это опять же тормозит запуск системы.

Тег «fedora» здесь потому, что у Fedora вроде бы pure systemd boot, и наверняка эта проблема кому-нибудь уже встретилась.

★★★★★

Ответ на: комментарий от RedEyedMan3

Это не баг, это известное ограничение слоя VT как такового: https://bugs.archlinux.org/task/35721

This is a limitation of CONFIG_VT and framebuffers. Either load your graphics driver earlier, or use something like kmscon which has its own font config.

Хотелось бы узнать, как эту проблему решить на практике (вернее, есть ли более оптимальное решение).

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

Помнится разработчики systemd проводили сравнение скорости запуска с Initramfs и без оного, так вот при использовании initramfs время запуска системы у них было меньше. Так что использование initramfs в случае наличий systemd можно считать рекомендацией разработчиков systemd, так что создавайте Initramfs и помещайте туда ваш модуль и радуйтесь.

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

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

Эм... Видео-драйверы в Fedora изначально заныканы в initramfs. Туда же спрятаны и куски systemd. Например, в initramfs:/usr/lib/systemd/system/ есть тот самый systemd-vconsole-setup.service:

#  This file is part of systemd.
#
#  systemd is free software; you can redistribute it and/or modify it
#  under the terms of the GNU Lesser General Public License as published by
#  the Free Software Foundation; either version 2.1 of the License, or
#  (at your option) any later version.

[Unit]
Description=Setup Virtual Console
Documentation=man:systemd-vconsole-setup.service(8) man:vconsole.conf(5)
DefaultDependencies=no
Conflicts=shutdown.target
After=systemd-readahead-collect.service systemd-readahead-replay.service
Before=sysinit.target shutdown.target
ConditionPathExists=/dev/tty0

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/lib/systemd/systemd-vconsole-setup
Всё OK, никакой «гонки» нет.

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

Тогда вкомпилить его в ядро и забыть про vesa-фреймбуфер навсегда.

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

Странно. Я пытался собирать initramfs, содержащий systemd (включая этот юнит), файлы шрифтов и модуль i915, но там возникала точно та же самая гонка.

А у вас (в Fedora) модули, включённые в initramfs, подгружаются силами udev (штатно) или каким-то костылём, запускающимся раньше systemd?

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

А там сравнивали initramfs и монолитное ядро (allyesconfig)?

У меня в ядро вкомпилен самый минимум (грубо говоря, ahci и ext4). Я до недавнего времени юзал initramfs, но решил потестить без него, и оказалось быстрее.

x3al Вкомпилить i915 тоже можно, но хотелось бы избежать, поскольку вообще это ядро будет запускаться на двух машинах: i915+nvidia (optimus) и nouveau. Так вот, тогда придётся вкомпиливать и nouveau, а это означает, что на машине с Optimus я никак не подгружу nvidia.

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

У меня драйвер интела монолино вкомпилен в ядро. Я когда то давно наткнулся на баг с собранным модулем интеловским драйвером, когда этот модуль по какой то причине не хотел загружаться и в результате у меня был черный экран. Баг наверное уже пофиксили, но что то менять как то не хочется. Initramfs не использую, гонки нет, брат жив.

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

Собери два разных ядра, тоже мне проблема.

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

Там сравнивали запуск системы с Initramfs и без, конфиг был один и тот же и всё нужное для запуска системы без initramfs есть в ядре.

Ну а так не вижу проблем в наличии i915 в ядре.

С другой стороны можете отказаться от systemd.

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

А у вас (в Fedora) модули, включённые в initramfs, подгружаются силами udev (штатно) или каким-то костылём, запускающимся раньше systemd?

Без понятия :)

carasin ★★★★★
()

Вантузятники должны наслаждаться ональным партнёрством с микрософтом, а не ныть на форумах. Будь мужиком, наслаждайся!

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

Вот это интересная мысль. А оно точно сработает?

Ведь к тому моменту, как модуль подгрузится, сработает правило udev и активируется соответствующий юнит, systemd-vconsole-setup.service уже давно отработает, наплевав на After=, поскольку эта директива работает только при наличии обоих юнитов в одной и той же транзакции.

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

Ну, у меня работало. Правда сейчас я kms c кишками держу в ядре, но это из-за efi..

поскольку эта директива работает только при наличии обоих юнитов в одной и той же транзакции

Дельное замечание. Добавь Requires, тогда точно всего хватит. Пока девайса не будет, systemd будет его фолловить

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

Хм. А к какому девайсу писать правило? К модулю (/sys/module/i915), фреймбуферу (/sys/class/graphics/fb0) или...?

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

Получилось. Правда, наблюдаю побочный эффект: не могу теперь выгрузить nouveau (fb1), чтобы заменить его на nvidia.

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

так вот при использовании initramfs время запуска системы у них было меньше

Это же разработчики systemd, ничего удивительного.

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

Там два способа, и оба не подходят. Первый включает в себя использование шелл-костыля в initramfs (подгрузка i915 до запуска systemd), второй - использование шелл-костыля, аналогичного по функционалу systemd-vconsole-setup.

Тут уже почти получилось труъ-способом, осталось понять, как заставить nouveau выгружаться после этого.

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

Всё, побочная проблема решена путём замены костыля с выгрузкой на modprobe.blacklist=nouveau. Solved.

Спасибо за systemd-way решение!

intelfx ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.