更改 Linux 文本控制台滚动速度 - 无需重新启动

更改 Linux 文本控制台滚动速度 - 无需重新启动

有没有办法在不重新启动的情况下更改文本控制台滚动速度?目前使用 Fedora,但非特定于发行版的答案值得赞赏。

https://www.kernel.org/doc/Documentation/fb/vesafb.txt

我想在上面记录的 vesafb 内核参数中使用“ywrap”,而无需重新启动内核来尝试它。

答案1

stty是无关紧要的。

如果通过线路规则设置的硬件线路速度非零,则对于虚拟终端来说没有任何意义。它仅对由实际串行设备形成的“终端”有意义,因为它控制串行设备线速度。内核的内置终端仿真器不涉及串行设备。

ywrap不是万能的。

像由 启用的显示硬件机制ywrap只能帮助终端仿真器进行(几乎)全高度全行宽度滚动。

由于显而易见的原因,终端仿真器无法利用此类硬件机制根本不如果它支持左右边距,则滚动操作不会滚动整个行宽。不过,Linux 内核的内置终端仿真器首先不支持 DECSLRM(“DEC 设置左右边距”)控制序列(或类似的东西),因此部分行滚动不是这里的问题。

但部分高度滚动是。 Linux内核的内置终端模拟器支持 DECSTBM(“DEC 设置顶部和底部边距”)控制序列,该序列允许应用程序设置屏幕上的第一行和最后一行以参与滚动。并且此控制序列已正确列为terminfo 条目change_scroll_region中的功能linux。使用这样的滚动区域在全屏 TUI 应用程序中确实相当常见。 vim例如,在滚动全宽窗口时使用它们。

Linux 内核的驱动程序仅在滚动操作保留并移动整个屏幕图像的四分之三以上时才fbcon使用该机制。ywrap这是因为使用部分高度滚动ywrap还涉及一些复制,因此即使硬件已经滚动了屏幕的“未滚动”部分,屏幕的“未滚动”部分似乎仍保留在同一位置。全部的屏幕。滚动区域越小,用处就越小ywrap,因为为了呈现显示器的某些部分没有滚动的错觉,必须进行的复制量就越大。

不支持控制序列。

与虚拟终端相反,在真实终端上,有时存在允许选择滚动速度的控制序列。例如:DEC VT 系列有一个名为 DECSCLM 的标志(“DEC 滚动模式”,DEC 专用模式标志 #4)。如果重置(通过 ECMA-48 RM 控制序列),终端将尽可能快地滚动。如果设置(通过 ECMA-48 SM 控制序列),终端滚动得更慢,在滚动时插入延迟。

如果 Linux 内核的内置终端仿真器是完整的 DEC VT 仿真,那么这将是控制滚动速度的方法。但事实并非如此。尽管一些用户空间终端模拟器喜欢xterm实现此模式标志,但我知道没有内核终端模拟器可以这样做。 Linux 内核的内置终端仿真器当然不会。

答案2

如果告诉 VT 子系统停止使用 Linux 内核帧缓冲区驱动程序模块,则无需重新启动即可删除该模块(请参阅文档/console/console.txt详情):

# tl;dr
reload_fb() {
  echo 0 > /sys/devices/virtual/vtconsole/vtcon1/bind
  rmmod uvesafb
  modprobe uvesafb scroll=ywrap
}
reload_fb

警告:如果 vtcon0 是一个虚拟驱动程序(例如在 EFI 上)或者存在错误(BIOS 固件往往存在错误),则在您重新启动或加载工作的 fb 驱动程序之前,您可能无法正常工作控制台显示。只有显示屏停止工作;您仍然可以键入命令,但您将无法看到它们的输出。 X11似乎不受影响。所以,我建议您通过 SSH 或通过同一计算机上的 X 终端远程登录。

笔记:如果您使用该uvesafb驱动程序(按照 eyoung100 的建议),您还需要安装该v86d软件包。

您可以列出所有已加载的控制台驱动程序:

[root@linflas ~]# cd /sys/devices/virtual/vtconsole
[root@linflas vtconsole]# grep -H "" vtcon*/[bn]*
vtcon0/bind:0
vtcon0/name:(S) dummy device
vtcon1/bind:1
vtcon1/name:(M) frame buffer device

相关内容