如何调整 TTY 控制台宽度?

F.M*_*F.M 3 freebsd tty console stty

我在 FreeBSD 上。

我想设置控制台宽度(只是控制台,而不是 ssh 或 telnet)。

我使用了这个命令:

stty cols 132
Run Code Online (Sandbox Code Playgroud)

这仅适用于控制台还是适用于所有连接(控制台、ssh 和 telnet)?

Jde*_*eBP 7

stty实际上并没有重新调整终端的大小。它只是改变了线路规程中记录的一些值。根据控制台设备是真实终端、内核虚拟终端还是用户空间虚拟终端,通过不同的机制来改变终端显示的实际高度和宽度。

真实终端

控制台可以是一个诚实的真实终端,连接到串行设备。在这种情况下,告诉终端重新调整其显示的大小涉及发出某种控制序列,沿着线路向下到达终端。该控制序列的内容因端子类型而异。此外,没有可以轻松提供的 termcap 功能。

通常,但并不总是取决于串行线路另一端实际拥有的终端,终端将遵守 DEC VT340 及更高版本遵守的 DEC 专用控制序列:DECSLPP/DECSNLSDECSCPPnosh 工具集console-resize(又名resizecons)命令发出这些:

$ resizecons 80x25

请注意,大多数实际终端将实际执行的列和行的组合限制为相当有限的预定义终端大小集。例如,传统上,DEC VT 仅支持 80 或 132 列。

真正的终端是这样一种情况,即在更改终端的显示尺寸后,必须通过运行stty. 线路规程对控制序列一无所知,终端设备本身也无法影响线路规程,并且确实不知道它正在与具有线路规程这种概念的操作系统对话。

用户空间虚拟终端

nosh 工具集的用户空间虚拟终端遵循相同的 DEC 私有控制序列,并且可以通过console-resize命令进行类似的调整。像真正的终端一样,它们总是以相同的模式启动,直到控制序列改变它。与真实终端不同,但与它们旨在取代的内核虚拟终端一样,它们以 80×25 模式开始,而不是许多真实终端的 80×24 模式。

与真实终端类似,但与内核虚拟终端类似,您无需stty在告诉终端更改其大小后调用更新线路规程,因为大小更改操作更新线路规程本身。

与真实终端和内核虚拟终端不同,它们支持控制序列中允许的更大范围的大小,从 2×2 到 65535×65535。

这将我们带到内核虚拟终端。

内核虚拟终端

这些是由内核本身内置的终端模拟器提供的。它们是您可能天真地认为是“控制台”的东西,直到您阅读手册并意识到控制台(定义为内核诊断和跟踪输出以及输出/dev/console发送到的位置)可以是串行设备上的真正终端( comconsole)、内核虚拟终端 ( vidconsole) 或什么都没有 ( nullconsole)。

它们不受控制序列的操纵;相反,打开这样的终端设备并执行特定于设备的ioctl()请求。幸运的是,有一个工具可以封装一些更常见的ioctl()请求,使它们无需编写自己的程序即可访问。

内核虚拟终端上的登录会话自行更改,或使用从此类终端设备重定向的标准输入:

  1. 获取可用模式列表:

    $ vidcontrol -i 模式
  2. 确定具有合适行和列的模式。在我的一台机器上,恰好是这台机器,它的 8×16 字体有 160 列和 64 行:

    283 (0x11b) 0x0000001f G 1280x1024x32 D 8x16 0xa0000 64k 64k 0xf1000000 5120k
  3. 更改为该模式:

    $ vidcontrol MODE_283
  4. 通过在引导时运行前面的命令,使这种调整大小持久化:

    # sysrc allscreens_flags=MODE_283

您的大小选择受限于您使用的是旧的 syscons 还是新的 vt 内核终端模拟器,以及它对支持模拟显示器的显示适配器的了解。

进一步阅读