下一页 上一页 目录

18. 终端的特殊用途

18.1 将串行终端作为控制台

这将把文本终端(或模拟器 PC)变成“串行控制台”。来自系统的许多消息通常只发送到控制台(PC 显示器)。在启动成功后,通过键入命令:dmesg,也可以在任何终端上看到一些在启动时发送到控制台的消息。如果启动失败,这将没有任何用处,因为终端在没有操作系统的情况下无法工作。可以修改 Linux 内核,使终端充当控制台并接收来自 Linux 的所有旨在发送到控制台的消息。不幸的是,来自 BIOS 的消息(在首次启动 PC 时显示在显示器上)不会在此终端上显示(但仍然在显示器上显示)。

有一个关于此主题的 Remote-Serial-Console-HOWTO。有些人会在没有显示器或键盘的情况下运行 PC 时使用串行控制台。通常,没有键盘和显卡,PC 将无法启动,但某些 BIOS 允许这样做。如果您幸运地拥有支持“控制台重定向”的 BIOS,那么您可能需要在启动 PC 时使用 CMOS 菜单设置 BIOS。

创建“串行控制台”的方法取决于您的内核版本。在任何情况下,串行支持都需要编译到内核中,而不是作为模块提供。

对于内核 2.2 或更高版本

创建串行控制台的说明包含在内核文档中:Documentation/serial-console.txt。内核 2.4+ 具有更好的文档,并提到需要在串行端口上运行 getty。通常,设备 /dev/console 链接到 tty0(PC 控制台)。对于串行控制台,您可以通过以下方式创建一个新的 /dev/console

mknod -m 622 console c 5 1
您还必须将有关串行控制台的语句放入 /etc/lilo.conf,然后运行 lilo。这是因为需要在内核加载之前尽早运行等效于“setserial”的命令,以便串行控制台可以显示启动过程。有关更多详细信息,请参阅上述内核文档和 lilo.conf 的手册页。

这是一个示例 /etc/lilo.conf 文件内容(适用于 ttyS0)

prompt
timeout=50
boot = /dev/sda
vga = normal # force sane state
install = /boot/boot.b
message = /boot/message
image = /vmlinuz
root = /dev/sda1
label = console
serial = 0,9600n8
append = "console=ttyS0"

同一台 PC 可以有多个串行控制台,但“append”语句中提到的最后一个控制台将成为您与之交互的主控制台 ?? 请参阅内核文档(但不是很清楚)。

内核 2.2 之前的串行控制台

1997 年 4 月的《Linux Journal》杂志上有一篇关于修补 Linux 内核的文章。您可以在 src/linux/drivers/char/console.c 的开头添加几个 #define

#define CONFIG_SERIAL_ECHO
#define SERIAL_ECHO_PORT 0x2f8  /* Serial port address  */

The following was not in the Linux Journal article.
In kernel 2.+ (and earlier ??) you need to also set the baud
rate (unless 9600 is OK).  Find these 2 lines:

serial_echo_outb(0x00, UART_DLM); /* 9600 baud */
serial_echo_outb(0x0c, UART_DLL);

Change 0x0c in the line above (depending on the baud rate you want):

115200 baud: 0x01       19200 baud: 0x06        2400 baud: 0x30
57600 baud: 0x02         9600 baud: 0x0c        1200 baud: 0x60
38400 baud: 0x03         4800 baud: 0x18

如果您当前使用控制台来选择要启动的操作系统(使用 LILO),但希望从终端执行此操作,则需要在 /etc/lilo.conf 文件中添加一行。请参阅 lilo.conf 的手册页,并搜索“serial=”。

18.2 在没有显示器的情况下运行 Linux

一种方法是仅使用终端(串行控制台)作为显示器。请参阅将串行终端作为控制台。您可能仍然需要显卡,因为许多 BIOS 需要显卡才能启动 PC。您的 BIOS 也可能需要键盘才能启动,或者它可能有一个选项,您可以设置 BIOS 不需要键盘。

如果您在没有显示器的情况下启动,请确保引导加载程序(例如 LILO 或 GRUB)不会尝试在屏幕上显示任何图像。文本终端无法显示它,并且启动可能会挂起。

如果您有无键盘终端,也可以通过使用 ttysnoop 程序将其用作显示器。到目前为止,它不像控制台那样工作,因为它没有获得所有初始启动时消息。请参阅将无键盘终端用作显示器

18.3 将无键盘终端用作显示器

工作原理

虽然您可能认为没有键盘的终端是无用的,但可以将它用作显示器,并在 PC 自己的键盘上打字。这可以通过使用间谍程序 ttysnoop 来完成。此程序允许在一个终端的人员监视(或窥探)另一个人在另一个终端(或 PC 控制台显示器)上键入的内容。

现在假设您正在显示器 tty1 上键入内容。想象一下,有人在 ttyS2 上的终端上监视您(使用 ttysnoop),并且屏幕看起来与您的屏幕完全一样。您在 tty1 上键入的所有内容也会显示在 ttyS2 上。现在将间谍终端(在 ttyS2 上)移动到与您的显示器(在 tty1 上)并排的位置。您在 PC 键盘上键入的所有内容现在都将显示在您面前的两个屏幕上:显示器和间谍终端。现在只需在键入时仅查看间谍终端。断开显示器和终端键盘的连接,因为您都不使用它们。因此,您现在正在使用无键盘终端作为显示器。多么简单但巧妙的解决方案!

一个可能的问题(结果证明根本不是问题)是,通常情况下,间谍终端的类型应与被监视终端的类型相同。由于显示器通常被声明为“linux”类型的终端(接近 vt100),您可能会认为真正的终端也应该是 vt100(或至少模拟 vt100)。不一定如此!例如,如果您有一个 wyse60 终端,您只需虚假地声明您在 tty1 上有一个 wyse 终端(告诉 tty1 的 getty 程序它是 wyse60)。

这就是您可以侥幸成功的原因。回到您同时拥有显示器和 wyse60 终端在您面前的场景,两者都显示相同的内容(或尝试显示)。Ttysnoop 将向 wyse60 发送与发送到显示器的相同字节。如果您错误地声称显示器是 wyse60,那么您将获得发送到显示器和 wyse60 终端(通过 ttysnoop)的 wyse60 转义序列。wyse60 上的显示效果很好,但显示器上的显示效果已损坏,因为它正在接收 wyse60 转义序列。由于您将不使用显示器(并且即将断开连接),因此此损坏永远不是问题(您根本看不到它)。

示例配置

这不是理想的设置,因为 ttysnoop 运行得太晚以至于登录提示符没有出现。此示例适用于 ttyS2 上的 wyse60 终端和 tty1 上缺少的显示器/PC 键盘。它使用 Debian 发行版提供的 agetty 程序作为 getty。您的 getty 可能需要不同的格式。

/etc/inittab: 中:

1:2345:respawn:/sbin/getty 38400 tty1 wyse60 -ln /usr/sbin/ttysnoops

请注意,ttysnoop/ttysnoops 是客户端-服务器组合,因此“s”不是拼写错误。如果您不使用 -n,您可能在终端上看不到登录提示符。在没有 -n 的情况下,agetty 在 ttysnoop 激活之前发出提示符。使用 -n,agetty 不再发出提示符(而是由登录程序执行)。如果您使用 -n,agetty 将不再自动检测奇偶校验,但如果您不使用奇偶校验,一切都正常。

/etc/snooptab: 中:

# tty       snoopdev      type    execpgm
tty1        /dev/ttyS3    init    /usr/local/bin/sterm
在上面,一个名为 sterm 的脚本用于运行 stty 程序。您可能不需要它,或者可能希望将其用于其他目的。这是 /usr/local/bin/sterm: 中的 sterm 脚本示例:

#!/bin/sh
stty rows 24
/bin/login $@


下一页 上一页 目录