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 控制台和波特率为 9600 的第二个串口(ttyS1 或 COM2)上。

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

  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 卡,第一个串口将自动成为控制台,除非内核配置了 CONFIG_NULL_TTY_DEFAULT_CONSOLE 选项,那样它将默认使用 ttynull 设备。

你需要创建一个新设备来使用 /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 instead of /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日