Linux ブート - 出力をクリアして新しいフレームバッファ モードへのカーネルの切り替えを停止します

Linux ブート - 出力をクリアして新しいフレームバッファ モードへのカーネルの切り替えを停止します

私は組み込みシステム ( ベース) に取り組んでおり、そのカーネルをカスタマイズしています。 、、Ubuntu 12.04 LTSに問題があります。解決できないことはないと思いますが、実際の問題は、カーネル (または ) がブート プロセスの途中でビデオ モードを変更するため、何が起こっているのか適切に診断できないことです。これにより、ログの行全体が完全に消去され、カーネルの誤った構成をデバッグできなくなります。upstartmountallplymouthplymouth

私の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 つの画面解像度を維持) で単一のメッセージ フローを実現することです。これを実現するために、何を調整する必要があるか、誰か知っていますか?

答え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のようなブート出力が生成されます。ログイン プロンプトが表示される直前に画面をクリアするのは誰か、または何が原因なのかまだわかりませんが、今のところは満足しています。原因を特定できたら、この回答を更新します。

編集: 犯人(2人)を発見しました。

何時間もグーグルで検索した結果、解決策が見つかりましたこのスレッドそしてこの質問この手順は、Ubuntu 12.04.1 LTS説明されているように機能しますここただし、他のディストリビューションでもそれほど大きな違いはないはずです。

まず、console=tty1GRUB_CMDLINE_LINUX(また、noplymouth抑制しplymouth、その役に立たないスプラッシュスクリーン。

#> sudo vi /etc/default/grub

GRUB_CMDLINE_LINUX="console=tty1 noplymouth"

これにより、カーネル ログがtty1の代わりに印刷されtty7ttyログイン プロンプトの前の切り替えが回避されます。

次に、、、、、、またはのいずれか/etc/init1つ以上を編集します。私はすべて編集して、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

これですべてです。これで、クリアせずにシステムを 1 回で起動できるはずですtty

答え2

起動プロセスの早い段階で仮想コンソールを切断します。

エコー 0 > /sys/class/vtconsole/vtcon$console_index/bind

$コンソールインデックス -> 0,1,2

echo 0 > /sys/class/vtconsole/vtcon0/bind を /dev/tty0 に出力します

echo 0 > /sys/class/vtconsole/vtcon1/bind を /dev/tty1 に出力します

関連情報