如何让 linux framebuffer 控制台变窄?

如何让 linux framebuffer 控制台变窄?

我刚刚安装了一个 Debian Wheezy 盒子(Debian 7.0rc1)。默认情况下,控制台使用帧缓冲区显示,由于某种硬件设置(我不会深入讨论),这在我的显示器上显示得太宽,例如,控制台最左边的列没有显示。

有没有办法让控制台变窄一两列?我的意思是,我不想让字体更窄或更宽,我希望在相同宽度下有更少的列,并且整个渲染的控制台屏幕占用更少的宽度但以相同的方式居中。

更新:根据@mr.spuratic 的回答,我安装并尝试使用fbset; 它并没有完全满足我的要求,但理论上可能有助于我解决问题。无论如何,当我尝试使用它设置模式时,我得到了:

fbset FBIOPUT_VSCREENINFO: invalid argument

笔记:

  • 我想要一个解决方案,既可以通过操作 grub 的配置,也可以在启动后从控制台即时操作。
  • 如果您需要更多信息来提供解决方案,请发表评论并询问。

答案1

我一直在想把这段文字放在哪里。自己的网站是一个可能的候选,或者在 superuser.com 上找到一些最接近我的主题(并且可能对我有帮助)的帖子。这就是我来到这里的原因 :-)

我遇到的具体问题是,如何强制文本控制台使用特定的视频模式。系统设置:Haswell 硬件上的 Debian 9 Stretch,其 IGP 由 Linux 中的 i915 驱动程序处理(现在支持 KVM 和 DRI/DRM 已有一段时间了)。一些愚蠢的模拟 KVM 开关,通过 DDC/EDID 告诉 PC 最大分辨率为 1600x1200,但实际上为能够达到 1280x1024 的 LCD 显示器供电 :-)

我开始尝试和vbetoolfbset但它们已经过时/不适合此目的,因为它们与 KMS+DRM 不兼容。“inteldrmfb”似乎只是 KMS+DRM 上的一个垫片(并且似乎没有体现在其自己的内核模块中)。几何参数是只读的。至少 fbset 可以被动显示活动分辨率,这具有一些信息价值。

然而,您和我似乎有一种方法可以从内核命令行(以“linux”开头的行上的引导加载程序参数,恰好位于现代多行 grub.conf 部分的末尾)设置分辨率和垂直刷新 AKA 帧速率。

如果在 Grub 倒计时时按下 ,则可以在启动时调整参数e。按照那里的帮助操作。对编辑满意后,按 Ctrl+X 或 F10 启动修改后的配置文件。(您的更改是短暂的 - 它们将出现在那次启动时正在运行的内核的 /proc/cmdline 中,但不会写入 grub.conf。)为了永久存储您的其他启动参数(内核命令行参数),在 Debian 中,您应该将它们输入到名为 的/etc/default/grub变量中GRUB_CMDLINE_LINUX_DEFAULT。然后,运行update-grub

现在来看看参数。首先,你需要i915.modeset=1 (假设你的图形子系统是 Intel IGP)。如果你遇到和我一样的问题,即内核设置的分辨率太高,你可能默认已经设置了 modeset=1(在内核中编译)。当你在努力理解命令行 curses 的语法时,有时你只想任何工作图形模式,您可能想尝试一下i915.modeset=0。这显然可以完全阻止图形模式更改,并且您只剩下一个几乎经典的 80x25 字符控制台,一直到控制台登录。您还会注意到没有 /dev/fb0,dmesg 中也没有 DRM 调试消息(请继续阅读以了解详细信息)。

还要注意选项quiet。无论是否设置模式,这都可以工作。它显然可以防止将内核消息打印到您的控制台(/dev/tty)= 您会在几秒钟内看到一个空白的黑屏,然后您会看到登录提示。这是 Debian 中的默认设置。(实际上,在具有 systemd 的现代 Debian 中,您可能会在屏幕上看到 systemd 启动消息,而不是内核日志……)关键是,如果您想要内核消息返回,您应该从内核命令行中删除单词“quiet”,并使用该命令行进行一次启动(在 Grub 中按“e”,编辑,ctrl+x 继续)或永久启动(编辑 /etc/default/grub && update-grub)。

现在终于到了重点:一旦你有了i915.modeset=1,你还需要添加video=<xres>x<yres>@framerate。例如,在我的情况下,video=1280x1024@60video=1024x768@60。还有其他可能的选项,请参阅相关Arch wiki 上的章节。例如,您还可以指定颜色深度,或将模式仅应用于一个视频输出端口(在 DRM 内部称为“连接器”)。请注意,您指定的模式可能需要与内核已知的模式之一匹配,即“EDID 模式行”之一。内核保存这些数据块的列表,这些数据块通过监视器的 DDC 或 /lib/firmware 获取,或可能编译在内核中。即,您不能指定任何奇数几何图形。

在一些操作指南中,您只会看到video=<xres>x<yres>,例如video=1024x768。这确实产生了预期的效果,因为分辨率确实出现在输出中 - 但您已将帧速率的决定权交给了驱动程序,驱动程序往往会选择最高的帧速率(在 EDID 块组中可用的“模式行”中)。例如,在我的情况下,驱动程序选择了1024x768@85,这在 CRT 时代是一个不错的选择,但对于当今的许多 LCD 来说,这远远超出了范围。请注意,廉价的现代 LCD(FreeSync 之前)通常采用 60 Hz 帧速率,因此如果您的 DDC 缺失或出现问题,则需要明确设置该值。

在寻找答案的过程中,我不断偶然发现关于这一点的参考资料由 Dave Airlie 设置的补丁- 带来了 video=cmdline arg 处理。事实证明,几年前它已经合并到 vanilla Linux 中了。

在我的例子中,显示器由 1600x1200 驱动,并报告“超出范围”,因为它无法应对。当我尝试各种命令行参数时,我只尝试了video=1024x768,结果显示器上显示“超出范围”。从外部看,根据模糊的错误消息,似乎命令行参数根本没有效果。后来我才发现我缺少的只是一个@60后缀 :-)

有趣的是,如何我发现了。还有另一个内核命令行参数,它使 DRI/DRM 子系统打印出更详细的调试日志:

内核版本低于4.1:

drm.debug=0xe

内核版本 4.1 或更新版本:

drm.debug=0x1e log_buf_len=1M

来源

我正在附加来自我的机器的示例调试日志. 关注点(搜索关键词):Kernel command linecmdlineadjusted mode[drm:

“连接器名称”可从此处获取: ls /sys/class/drm/ 请注意,video=... cmdline arg 语法不采用 /sys/class/drm 中可以看到的“card-”前缀。video= 和连接器名称的语法在相关章节中有详细描述Arch Linux 维基

现在让我稍微改变一下话题。

本主题中的原始问题是,如何修改视频模式几何形状。我之前在 X 和 Windows 中做过这个(使用较新的 Intel IEGD)。在 Linux 下的 kvm+drm 下,调整几何形状和时序的唯一方法显然是提交您自己的 EDID 文件,您必须先手工制作该文件。嗯,差不多。

EDID 结构如下简要描述在 vanilla 内核源代码附带的一段文档中。

Makefile 和示例 EDID 定义在其父目录中

选择一些 .S 作为示例,复制到您自己的文件(参见 Makefile 顶部的命名约定),编辑时间,构建您的 EDID 二进制文件......希望它能解决您的问题 :-)

时序/像素数需要进行一些数学运算才能正确计算。此外,您最好遵循几种相互冲突的替代历史标准(它们是显示时序标准的演变阶段):

  • CRT时代GTF
  • LCD 时代, DMT或者CVT
  • 然后CVT-RB(减少消隐)。
您可以手动计算数字,也可以使用一些工具和标准模式表。尝试在 Google 上搜索“EDID 计算器”或“modeline 计算器”等。甚至还有一个简洁的Linux 命令行工具工作。另请参阅模式行数据库

您的特定问题可能可以通过将 HSYNC 脉冲向右移动(您也可以尝试更改其极性)来解决,或者通过使同步脉冲和/或总消隐时间相对较宽,或者(如您所建议的)通过降低可见/显示的像素分辨率(以 8 的倍数)来解决。如果使消隐更宽,则可能需要增加像素时钟,以保持原始帧速率。

答案2

通常,显示器的自动调整可以解决这个问题,而且通常比软件解决方案麻烦少得多。

否则,请检查显示器信息菜单以查看其运行的分辨率/刷新率,然后搜索显示器型号并fbset这是用来设置控制低级时序的工具显示时间

相关内容