Linux 串口控制台

要使用串口作为控制台,您需要将支持编译到内核中 - 默认情况下它没有编译进去。对于 PC 式串口,它是菜单选项旁边的配置选项

字符设备 ‣ 串口驱动程序 ‣ 8250/16550 和兼容的串口支持 ‣ 8250/16550 和兼容的串口上的控制台

您必须将串口支持编译到内核中,而不是作为模块。

可以指定多个设备用于控制台输出。您可以定义一个新的内核命令行选项来选择哪个设备用于控制台输出。

此选项的格式是

console=device,options

device:         tty0 for the foreground virtual console
                ttyX for any other virtual console
                ttySx for a serial port
                lp0 for the first parallel port
                ttyUSB0 for the first USB serial device

options:        depend on the driver. For the serial port this
                defines the baudrate/parity/bits/flow control of
                the port, in the format BBBBPNF, where BBBB is the
                speed, P is parity (n/o/e), N is number of bits,
                and F is flow control ('r' for RTS). Default is
                9600n8. The maximum baudrate is 115200.

您可以在内核命令行中指定多个 console= 选项。

当每种设备类型仅提及一次时,行为是明确定义的。在这种情况下,输出将显示在所有请求的控制台上。当您打开 /dev/console 时,将使用最后一个设备。例如

console=ttyS1,9600 console=tty0

定义打开 /dev/console 将使您获得当前的前台虚拟控制台,并且内核消息将出现在 VGA 控制台和第二个串口(ttyS1 或 COM2)上,波特率为 9600。

当定义多次相同的设备类型时,行为会更复杂。在这种情况下,有以下两个规则

  1. 输出将仅显示在每种已定义类型的第一个设备上。

  2. /dev/console 将与第一个注册的设备关联。注册顺序取决于内核如何初始化各种子系统。

    当由于其他原因而未使用最后一个 console= 参数时,也使用此规则。例如,由于拼写错误或硬件不可用。

结果可能会令人惊讶。例如,以下两个命令行具有相同的结果

console=ttyS1,9600 console=tty0 console=tty1
console=tty0 console=ttyS1,9600 console=tty1

内核消息仅打印在 tty0ttyS1 上。/dev/consoletty0 关联。这是因为内核尝试在串口之前注册图形控制台。这是因为它在未指定控制台设备时的默认行为,请参见下文。

请注意,最后一个 console=tty1 参数仍然有所不同。内核命令行也由 systemd 使用。它会将最后一个定义的 tty1 用作登录控制台。

如果未指定控制台设备,则将使用找到的第一个能够充当系统控制台的设备。此时,系统首先查找 VGA 卡,然后查找串口。因此,如果您的系统中没有 VGA 卡,则第一个串口将自动成为控制台。

您将需要创建一个新设备来使用 /dev/console。官方的 /dev/console 现在是字符设备 5,1。

(您也可以使用网络设备作为控制台。有关详细信息,请参见 Documentation/networking/netconsole.rst。)

这是一个将使用 /dev/ttyS1 (COM2) 作为控制台的示例。根据需要替换示例值。

  1. 创建 /dev/console (真实控制台) 和 /dev/tty0 (主虚拟控制台)

    cd /dev
    rm -f console tty0
    mknod -m 622 console c 5 1
    mknod -m 622 tty0 c 4 0
    
  2. LILO 也可以从串口接收输入。这是一个非常有用的选项。要告诉 LILO 使用串口:在 lilo.conf(全局部分)中

    serial  = 1,9600n8 (ttyS1, 9600 bd, no parity, 8 bits)
    
  3. 为新内核调整内核标志,再次在 lilo.conf (内核部分) 中

    append = "console=ttyS1,9600"
    
  4. 确保 getty 在串口上运行,以便系统启动完成后您可以登录。这是通过在 /etc/inittab 中添加如下一行来完成的(确切的语法取决于您的 getty)

    S1:23:respawn:/sbin/getty -L ttyS1 9600 vt100
    
  5. Init 和 /etc/ioctl.save

    Sysvinit 将其 stty 设置保存在 /etc 中的一个文件中,名为 /etc/ioctl.save。首次使用串口控制台之前,请删除此文件,否则 init 可能会将波特率设置为 38400(虚拟控制台的波特率)。

  6. /dev/console 和想要使用虚拟控制台的 X 程序通常会打开 /dev/console。如果您创建了新的 /dev/console 设备,并且您的控制台不是虚拟控制台,则某些程序将失败。这些是想要访问 VT 接口并使用 /dev/console 而不是 /dev/tty0 的程序。其中一些程序是

    Xfree86, svgalib, gpm, SVGATextMode
    

    但是,在这些程序的现代版本中应该已经修复。

    请注意,如果您在没有 console= 选项的情况下启动(或使用 console=/dev/tty0),则 /dev/console/dev/tty0 相同。在这种情况下,一切仍然可以正常工作。

  7. 感谢

    感谢 Geert Uytterhoeven <geert@linux-m68k.org> 将补丁从 2.1.4x 移植到 2.1.6x,并负责将这些补丁集成到 m68k、ppc 和 alpha 中。

Miquel van Smoorenburg <miquels@cistron.nl>, 2000 年 6 月 11 日