Загрузка Linux - остановка переключения ядра в новый режим фреймбуфера с очисткой вывода

Загрузка Linux - остановка переключения ядра в новый режим фреймбуфера с очисткой вывода

Я работаю над встроенной системой (на основе Ubuntu 12.04 LTS) и настраиваю ее ядро. У меня возникли некоторые проблемы с upstart, mountallи plymouth. Ничего неразрешимого, я полагаю, но настоящая проблема в том, что я не могу правильно диагностировать, что происходит, потому что ядро ​​(или, может быть, plymouth) меняет видеорежим в середине процесса загрузки. Это полностью стирает целые строки журнала и предотвращает любую отладку неправильных конфигураций ядра.

Моя Grub2конфигурация, кажется, в порядке:

GRUB_CMDLINE_LINUX=""
GRUB_CMDLINE_LINUX_DEFAULT="acpi=force noplymouth"

GRUB_GFXMODE=1024x768x32
GRUB_GFXPAYLOAD_LINUX=keep

Вот некоторые соответствующие результаты lspci:

00:00.0 Host bridge: Intel Corporation Mobile 945GSE Express Memory Controller Hub (rev 03)
00:02.0 VGA compatible controller: Intel Corporation Mobile 945GSE Express Integrated Graphics Controller (rev 03)
00:02.1 Display controller: Intel Corporation Mobile 945GM/GMS/GME, 943/940GML Express Integrated Graphics Controller (rev 03)

А вот соответствующая часть конфигурации моего ядра:

CONFIG_AGP=y
CONFIG_AGP_INTEL=y
CONFIG_VGA_ARB=y
CONFIG_VGA_ARB_MAX_GPUS=16
CONFIG_DRM=y
CONFIG_DRM_KMS_HELPER=y
CONFIG_DRM_I915=y
CONFIG_DRM_I915_KMS=y
CONFIG_VIDEO_OUTPUT_CONTROL=y
CONFIG_FB=y
CONFIG_FB_BOOT_VESA_SUPPORT=y
CONFIG_FB_CFB_FILLRECT=y
CONFIG_FB_CFB_COPYAREA=y
CONFIG_FB_CFB_IMAGEBLIT=y
CONFIG_FB_MODE_HELPERS=y
CONFIG_FB_VESA=y
CONFIG_BACKLIGHT_LCD_SUPPORT=y
CONFIG_BACKLIGHT_CLASS_DEVICE=y
CONFIG_VGA_CONSOLE=y
CONFIG_VGACON_SOFT_SCROLLBACK=y
CONFIG_VGACON_SOFT_SCROLLBACK_SIZE=640
CONFIG_DUMMY_CONSOLE=y
CONFIG_FRAMEBUFFER_CONSOLE=y
CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY=y
CONFIG_FONT_8x8=y
CONFIG_FONT_8x16=y
CONFIG_LOGO=y
CONFIG_LOGO_LINUX_MONO=y
CONFIG_LOGO_LINUX_VGA16=y
CONFIG_LOGO_LINUX_CLUT224=y

Любое другое кастомное/стандартное ядро ​​нормально загружается с этой Grub2конфигурацией. Мне бы хотелось иметь единый поток сообщений на одной консоли (сохраняя одно разрешение экрана) от логотипа загрузки до приглашения на вход в систему. Кто-нибудь знает, что мне нужно настроить, чтобы добиться этого?

решение1

Кажется, я наконец-то достиг разумной framebufferконфигурации. Вот соответствующие настройки внутри моего ядра .config:

CONFIG_AGP=y
CONFIG_AGP_INTEL=y
CONFIG_VGA_ARB=y
CONFIG_VGA_ARB_MAX_GPUS=16
CONFIG_VIDEO_OUTPUT_CONTROL=y
CONFIG_FB=y
CONFIG_FIRMWARE_EDID=y
CONFIG_FB_BOOT_VESA_SUPPORT=y
CONFIG_FB_CFB_FILLRECT=y
CONFIG_FB_CFB_COPYAREA=y
CONFIG_FB_CFB_IMAGEBLIT=y
CONFIG_FB_VESA=y
CONFIG_VGA_CONSOLE=y
CONFIG_VGACON_SOFT_SCROLLBACK=y
CONFIG_VGACON_SOFT_SCROLLBACK_SIZE=640
CONFIG_DUMMY_CONSOLE=y
CONFIG_FRAMEBUFFER_CONSOLE=y
CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY=y
CONFIG_FONT_8x8=y
CONFIG_FONT_8x16=y
CONFIG_LOGO=y
CONFIG_LOGO_LINUX_MONO=y
CONFIG_LOGO_LINUX_VGA16=y
CONFIG_LOGO_LINUX_CLUT224=y

а это разница diffмежду старой и новой framebufferконфигурацией:

#> diff oldcfg.txt newcfg.txt
--- oldcfg.txt  2012-10-01 17:30:01.000000000 +0200
+++ newcfg.txt  2012-10-01 17:29:43.000000000 +0200
@@ -2,20 +2,14 @@
 CONFIG_AGP_INTEL=y
 CONFIG_VGA_ARB=y
 CONFIG_VGA_ARB_MAX_GPUS=16
-CONFIG_DRM=y
-CONFIG_DRM_KMS_HELPER=y
-CONFIG_DRM_I915=y
-CONFIG_DRM_I915_KMS=y
 CONFIG_VIDEO_OUTPUT_CONTROL=y
 CONFIG_FB=y
+CONFIG_FIRMWARE_EDID=y
 CONFIG_FB_BOOT_VESA_SUPPORT=y
 CONFIG_FB_CFB_FILLRECT=y
 CONFIG_FB_CFB_COPYAREA=y
 CONFIG_FB_CFB_IMAGEBLIT=y
-CONFIG_FB_MODE_HELPERS=y
 CONFIG_FB_VESA=y
-CONFIG_BACKLIGHT_LCD_SUPPORT=y
-CONFIG_BACKLIGHT_CLASS_DEVICE=y
 CONFIG_VGA_CONSOLE=y
 CONFIG_VGACON_SOFT_SCROLLBACK=y
 CONFIG_VGACON_SOFT_SCROLLBACK_SIZE=640

Эта конфигурация производит Knoppix-подобный загрузочный вывод. Я все еще не понимаю, кто или что очищает экран прямо перед появлением приглашения на вход, но на данный момент я вполне удовлетворен. Я обновлю этот ответ, если смогу определить виновника.

EDIT: найдены (два) виновника(ов).

После нескольких часов гугления я нашел решение вэта темаиэтот вопрос. Эта процедура работает Ubuntu 12.04.1 LTSтак же, как описаноздесь, но для других дистрибутивов он не должен сильно отличаться.

Сначала добавьтеconsole=tty1к вашему GRUB_CMDLINE_LINUX(я также предлагаю добавитьnoplymouthдля подавления plymouthи его бесполезной заставки).

#> sudo vi /etc/default/grub

GRUB_CMDLINE_LINUX="console=tty1 noplymouth"

Это заставит вывести журнал ядра на печать tty1вместо tty7и избежать ttyпереключения перед приглашением на вход в систему.

Затем просто зайдите /etc/initи отредактируйте один или несколько из tty1.conf, tty2.conf, tty3.conf, tty4.conf, tty5.conf, tty6.confили console.conf. Я отредактировал их все, добавив--noclearопция команды getty. Например, редактирование tty1.conf:

#> sudo vi /etc/init/tty1.conf

вам придется заменить:

respawn
exec /sbin/getty -8 38400 tty1

с:

respawn
exec /sbin/getty -8 38400 --noclear tty1

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

решение2

Отключите виртуальную консоль на раннем этапе процесса загрузки.

эхо 0 > /sys/class/vtconsole/vtcon$console_index/bind

$console_index -> 0,1,2

echo 0 > /sys/class/vtconsole/vtcon0/bind для /dev/tty0

echo 0 > /sys/class/vtconsole/vtcon1/bind для /dev/tty1

Связанный контент