Linux 啟動 - 停止核心切換到新的幀緩衝模式並清除輸出

Linux 啟動 - 停止核心切換到新的幀緩衝模式並清除輸出

我正在開發一個嵌入式系統(基於Ubuntu 12.04 LTS),並且正在自訂其核心。我在upstartmountall和 方面遇到了一些問題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類似啟動輸出。我仍然不明白在登入提示出現之前誰或什麼清除了螢幕,但我現在很滿意。如果我能夠找出罪魁禍首,我會更新這個答案。

編輯:找到(兩個)罪魁禍首。

經過幾個小時的谷歌搜尋後,我找到了解決方案這個線程這個問題。此過程也適用於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.conftty2.conftty3.conftty4.conftty5.conftty6.confconsole.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

在啟動過程中儘早分離虛擬控制台。

echo 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

相關內容