串口终端作为控制台

作者:Francesco Conti

在 comp.os.linux.* 新闻组和其他 Linux 邮件列表中,一个经常被问到但从未完全解答的问题是关于廉价、无头 Linux 主机的问题。 似乎很多人需要安装没有显卡、显示器或键盘的 Linux 主机。

解决这个问题的廉价方法是使用串口终端(例如 Wyse 或 Ampex)作为主要的 Linux 控制台。 这降低了键盘、显卡和显示器的成本。 我已经在我的第二台电脑,一台旧的 486 VLB 上做了这件事,使用了一台 Wyse 60 终端。

将终端连接到您电脑的串口一点都不难。 您可以轻松地按照 Serial-HOWTO 以及 inittab(5) 和 agetty(8) 手册页中的说明进行操作。 这里是一个简短的总结。

首先,您必须使用零调制解调器线缆。

其次,如果您使用的是 agetty,请在您的 /etc/inittab 文件中插入以下行。 其他 getty 程序,例如 getty_ps,使用不同的语法。

ID:RUNLEVELS:respawn:/sbin/agetty -L SPEED TTY TERM

其中

  • ID = 两个字符的标识符,例如,s1 或 s2

  • RUNLEVELS = 终端必须处于活动状态的运行级别

  • SPEED = 串口速度

  • TTY = 相对于 /dev 目录的 tty 端口名称

  • TERM = 用于 TERM 环境变量的值

我的机器的 /etc/inittab 文件中有以下行

s2:12345:respawn:/sbin/agetty -L 9600 ttyS1 vt100

用于 /dev/ttyS1 端口(DOS 用户的 COM2)上的串口终端,端口速度为 9600 BPS,以及 vt100 终端仿真(似乎比原生 Wyse 60 模式运行得更好)。

最后,使用命令 init q 重启 init。

如果您正确地按照这三个简单的步骤操作,您应该在您的终端屏幕上看到登录提示符。 您可以登录并像在控制台上或从远程主机通过 telnet 登录一样在您的机器上工作。

内核消息

内核在启动时显示的消息总是被定向到您的主控制台 (tty1)。 如果您打开您的无头主机,您只能等待终端上的登录,这意味着会错过那些宝贵的消息。 您可以使用 dmesg 命令查看它们,但通常您需要在登录 shell 出现之前看到它们。

您的控制台上还有其他消息:那些由 /etc/rc.d 目录中的脚本以及在启动和关机时运行的脚本生成的消息。 如果您无法在显示器上读取 “系统已停止”,您怎么才能真正知道呢?

您必须在您的内核源代码树中修补 /usr/src/linux/drivers/char/console.c 程序。 这不是一个复杂的内核 hack。 您可以按照这三个简单的步骤操作。

首先,在程序启动时定义 CONFIG_SERIAL_ECHO 符号

#define CONFIG_SERIAL_ECHO

其次,修改终端串口的地址(仅当您使用的端口与默认定义的端口不同时),查找以下行

#define SERIAL_ECHO_PORT        0x3f8   /* COM1 */
在我的机器上,我将该行更改为
#define SERIAL_ECHO_PORT        0x2f8   /* COM2 */
第三,重建您的内核并重启:您应该在您的终端屏幕上看到您的系统硬件设备探测期间的内核消息。

请注意,这些步骤适用于 2.0.0 内核,但不适用于 1.2.13。 我还没有时间尝试其他内核。 console.c 补丁对于除 Alpha 之外的所有 Linux 端口都是必需的,Alpha 在 make config 中包含它,并带有以下选项

Echo console messages on /dev/ttyS1
来自 /etc/rc.d/rc.* 的消息

要在您的终端上显示这些消息,您可以将 > TTY 附加到这些文件中包含命令 echo 的每一行。 TTY 是终端串口(与 /etc/inittab 串口行中使用的相同)。

LILO 配置

如果您想在两个以上的内核镜像中选择,您必须修改 LILO 配置文件 /etc/lilo.conf。

在串口终端上查看 LILO 提示符的完整说明可以在 /usr/doc/lilo/README 文件中找到(查找 SERIAL 选项)。 以下是正确执行此操作的两个步骤。

首先,编辑 /etc/lilo.conf 文件并在 BOOT 选项行后插入 SERIAL 选项行

serial=SERIAL_LINE,SPEED PARITY BITS

其中

SERIAL_LINE = 0 (com1)
              1 (com2)
              2 (com3)
              3 (com4)
SPEED = serial port speed
PARITY = n (= none)
         o (= odd)
         e (= even)
BITS = bits in a character (8 or 7)
请注意,SPEEDPARITYBITS 参数之间没有空格。 这些参数必须与您的终端设置中定义的参数相同。 这是我的机器的 LILO 使用的行
serial=1,9600n8
此行表示 COM2,9600 BPS,无奇偶校验,每字符 8 位。

其次,执行 lilo 命令以更新您的系统配置。

使用 SERIAL 选项,LILO 设置了两秒延迟(与您在 lilo.conf 文件中放置 delay = 20 行时的延迟相同),然后再启动默认内核镜像。 在此暂停期间,您可以通过向终端发送一个中断来中断启动过程并获得 LILO 提示符,就像您在主控制台上按下 SHIFT 键一样。

结论

最后,您的串口终端可以用作真正的系统控制台。 我认为您唯一不能做的是 CTRL-ALT-DEL 重启——除非,也许,使用某些终端仿真。 如果您幸运的话,您可以从升级硬件的公司那里廉价甚至免费地找到这些终端之一。

您可以通过电子邮件 fconti@iper.net 联系 Franceso Conti。

加载 Disqus 评论