Linux 串口控制台¶
要使用串口作为控制台,你需要将支持编译到内核中——默认情况下它是没有编译进内核的。对于 PC 风格的串口,它是位于以下菜单选项旁边的配置选项
你必须将串口支持编译进内核,而不能将其编译为模块。
可以为控制台输出指定多个设备。你可以定义一个新的内核命令行选项来选择用于控制台输出的设备。
该选项的格式为
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)上。
当多次定义相同的设备类型时,其行为会更加复杂。在这种情况下,有以下两条规则
输出将仅显示在每种定义类型的第一个设备上。
/dev/console将与第一个注册的设备关联。其中注册顺序取决于内核初始化各个子系统的方式。当由于其他原因未使用最后的 console= 参数时,也会使用此规则。例如,由于拼写错误或硬件不可用。
结果可能会让人感到意外。例如,以下两个命令行具有相同的结果
console=ttyS1,9600 console=tty0 console=tty1
console=tty0 console=ttyS1,9600 console=tty1
内核消息仅打印在 tty0 和 ttyS1 上。并且 /dev/console 与 tty0 关联。这是因为内核会尝试在串口控制台之前注册图形控制台。之所以这样做是因为在未指定控制台设备时的默认行为,见下文。
请注意,最后的 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) 用作控制台的示例。请根据需要替换示例值。
创建
/dev/console(真实控制台)和/dev/tty0(主虚拟控制台)cd /dev rm -f console tty0 mknod -m 622 console c 5 1 mknod -m 622 tty0 c 4 0
LILO 也可以从串口接收输入。这是一个非常实用的选项。要告知 LILO 使用串口:在 lilo.conf(全局部分)中
serial = 1,9600n8 (ttyS1, 9600 bd, no parity, 8 bits)
调整新内核的内核标志,同样在 lilo.conf(内核部分)中
append = "console=ttyS1,9600"
确保在串口上运行 getty,以便系统启动完成后你可以登录它。这通过向
/etc/inittab添加如下行来完成(确切语法取决于你的 getty)S1:23:respawn:/sbin/getty -L ttyS1 9600 vt100
Init 和
/etc/ioctl.saveSysvinit 会将其 stty 设置保存在
/etc下一个名为/etc/ioctl.save的文件中。在首次使用串口控制台之前**删除此文件**,否则 init 可能会将波特率设置为 38400(虚拟控制台的波特率)。/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相同。在这种情况下,一切仍将正常工作。致谢
感谢 Geert Uytterhoeven <geert@linux-m68k.org> 将补丁从 2.1.4x 移植到 2.1.6x,并负责将这些补丁集成到 m68k、ppc 和 alpha 中。
Miquel van Smoorenburg <miquels@cistron.nl>, 2000年6月11日