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 而不是 /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>, 11-Jun-2000