我正在尝试从源代码编译的 iso 映像在 VMware 内运行 linux 内核。
目前我正在尝试启动 initramfs 但由于某些原因它崩溃了。我的问题是由于 TTY 的大小,我不知道为什么。
我在 .config 文件中将 CONFIG_DUMMY_CONSOLE_ROWS 从 25 更改为 60,但它没有进行任何更改。
我还可以做些什么?
答案1
在对 VMware 上的早期启动问题进行故障排除时,将内核配置为使用串行端口作为控制台可能会很有用。为此,您将需要内核启动选项:在您的情况下,指定它们的唯一方法可能是通过CONFIG_CMDLINE
内核配置选项,或者FDARGS="..."
在内核构建期间使用环境变量,类似于FDINITRD=
在使用make isoimage
.
在您的情况下,可能需要添加选项console=ttyS0,115200 console=tty0
,然后配置 VMware 将虚拟 COM1 串行端口的任何输出保存到文件中。这样,您应该将 Linux 内核启动消息的完整列表放入文件中。
(该console=tty0
部分确保您还将控制台输出发送到 VMware 控制台窗口;没有它,控制台输出将发送到串行端口仅有的,完全不使用 VGA 虚拟显示器。)
要成功使用这样的串行端口,您还需要内核配置选项CONFIG_SERIAL_8250=y
和CONFIG_SERIAL_8250_CONSOLE=y
.
我认为CONFIG_DUMMY_CONSOLE_ROWS
并且CONFIG_DUMMY_CONSOLE_COLUMNS
只影响虚拟“虚拟”控制台设备,只有在真正的控制台设备驱动程序接管之前才有效。真正的控制台驱动程序将根据控制台上使用的显示模式设置行/列。
这评论在开头drivers/video/console/dummycon.c
似乎证实了这一点:
// SPDX-License-Identifier: GPL-2.0-only
/*
* linux/drivers/video/dummycon.c -- A dummy console driver
*
* To be used if there's no other console driver (e.g. for plain VGA text)
* available, usually until fbcon takes console over.
*/
另外,drivers/video/console/vgacon.c
(即实际的VGA控制台文本模式驱动程序)CONFIG_DUMMY_CONSOLE_ROWS
根本不使用。
如果您使用经典的 VGA 文本控制台(vgacon.c
上面提到的,配置为CONFIG_VGA_CONSOLE=y
),则内核引导选项vga=ask
(一旦您看到结果输出并选择合适的 (S)VGA 文本模式编号,vga=<mode number>
),如 Artem S 所建议的塔什基诺夫在问题中的评论是适当的。
现代 Linux 发行版通常CONFIG_FRAMEBUFFER_CONSOLE=y
会从 initramfs 加载适当的帧缓冲区设备驱动程序,因为它比普通的老式 VGA 具有更高分辨率的模式。但由于您正在解决早期启动问题,因此您需要将其放入内核中才能将输出输出到显示器(VMware 显示窗口)。如果您使用传统 BIOS 风格启动虚拟机(这make isoimage
可能是这样做的),则有问题的驱动程序将是CONFIG_FB_VESA=y
;如果您使用 UEFI 式引导,CONFIG_FB_EFI=y
那将是一个好主意。
CONFIG_FB_VESA
由于遗留原因,还使用引导vga=
选项来设置初始控制台显示分辨率,但这些模式可能不会与vga=ask
;一起列出。看文档/fb/vesafb.rst 在这里或者在内核源代码树中获取更多信息和可供选择的模式列表。
如果使用 UEFI(或基本上任何其他帧缓冲控制台驱动程序CONFIG_FB_VESA
),则需要使用启动参数指定所需的显示模式video=
;看Documentation/fb/modedb.rst
在内核源代码树中了解完整详情。
简而言之,视频模式选择参数CONFIG_FB_EFI
(实际上类似于任何非 VESA 帧缓冲控制台)可能如下所示:
video=efifb:1280x1024@60
这将自动为视频模式选择合适的文本分辨率。