跳转至内容

使用串行控制台

来自 ArchWiki
(重定向自 Serial console)

Arch Linux 机器可以配置为通过串口控制台端口进行连接,即使机器没有连接键盘、鼠标、显示器或网络,也可以对其进行管理。

Arch Linux 也可以通过串口控制台进行安装。

此场景的基本环境是两台通过串口电缆(9 针连接器电缆)连接的机器。管理机器可以是任何装有终端仿真程序(例如 PuTTY 或 Minicom)的 Unix/Linux 或 Windows 机器。

下面的配置说明将启用引导加载程序菜单选择、引导消息以及到串口控制台的终端转发。

配置目标机器的控制台访问权限

引导加载程序

GRUB

当使用带有生成的 grub.cfgGRUB 时,编辑 /etc/default/grub 并启用串口输入和输出支持

/etc/default/grub
...
GRUB_TERMINAL_INPUT="console serial"
...
GRUB_TERMINAL_OUTPUT="gfxterm serial"
...

接下来添加 GRUB_SERIAL_COMMAND 变量并设置串口连接选项。对于 COM1 (/dev/ttyS0),波特率为 115200 bit/s

/etc/default/grub
...
GRUB_SERIAL_COMMAND="serial --unit=0 --speed=115200"

阅读 GRUB 手册中关于通过串口使用 GRUBserial 命令的章节,获取可用选项的详细说明。

GRUB 第一阶段串口控制台

当 GRUB 安装到加密的 /boot/ 分区时 - GRUB 第一阶段 (core.img) 将仅在平台控制台上显示 Enter passphrase for hdX,gptY: 密码提示符,即使已正确完成所有串口控制台配置步骤,串口控制台也不会显示任何内容。

这是因为 grub-installGRUB_ENABLE_CRYPTODISK=y 有特殊处理,会创建放置在 /boot/grub/PLATFORM/load.cfg 中的早期配置,但 grub-install 会忽略 /etc/default/grub 中针对 GRUB 第一阶段的串口控制台配置。

/boot/grub/PLATFORM/load.cfg 文件会在每次运行 grub-install 时被覆盖。

若要在串口控制台上显示 GRUB 加密磁盘密码提示符,需要进行一些额外的配置步骤

1. 运行以下命令以生成 /boot/grub/PLATFORM/load.cfg 并查看系统中正确的 grub-mkimage 参数

EFI 平台

# grub-install --verbose 2>&1 | grep grub-mkimage

BIOS 平台

# grub-install --verbose /dev/YOUR_BOOT_DISK 2>&1 | grep grub-mkimage

您可以重启系统以检查其是否正常引导,但您应该保存上述命令的输出 - 这在第 4 步中是必需的。

2. 将 /boot/grub/PLATFORM/load.cfg 复制到 /boot/grub/PLATFORM/early-grub.cfg

3. 在 /boot/grub/PLATFORM/early-grub.cfg 的开头添加以下行(根据上述描述,根据所需的配置更改这些行)

serial --unit=0 --speed=115200
terminal_input serial console
terminal_output serial console

4. 编辑第 1 步中的 grub-mkimage 参数(grub-install 的输出)

--config '/boot/grub/PLATFORM/load.cfg' 替换为 --config '/boot/grub/PLATFORM/early-grub.cfg'。删除带有空参数的参数(如 --dtb ''--sbat ''),并将 serialterminal 模块添加到 grub-mkimage 参数列表的末尾。

5. 使用这些参数运行 grub-mkimage

6. 在 BIOS 平台(如 i386-pc)上(对于 EFI 平台,跳过此步骤),运行以下命令将新的 core.img 安装到您的系统

# grub-bios-setup -d /boot/grub/i386-pc/ /dev/YOUR_BOOT_DISK

要撤销这些更改,只需使用 grub-install 命令重新安装 GRUB。

GRUB Legacy

编辑 GRUB Legacy 配置文件 /boot/grub/menu.lst,并在配置的常规区域添加以下行

serial --unit=0 --speed=9600
terminal --timeout=5 serial console
注意terminal --timeout=5 serial console 行添加到您的 menu.lst 后,引导序列现在会显示一系列 Press any key to continue 消息。如果不按任何键,引导菜单将出现在 terminal 配置行中首先出现的那个(串口或控制台)。

rEFInd

rEFInd 仅在文本模式下支持串口控制台。编辑 refind.conf 并取消注释 textonly

Syslinux

要在 Syslinux 中启用串口控制台,请编辑 syslinux.cfg 并将 SERIAL 作为配置文件中的第一条指令添加。

对于 COM1 (/dev/ttyS0),波特率为 115200 bit/s

SERIAL 0 115200

串口参数硬编码为 8 位,无奇偶校验和 1 个停止位。[1]。请阅读 Syslinux Wiki:Config#SERIAL 以了解该指令的选项。

内核

通过设置 console= 内核参数,可以将内核的输出发送到串口控制台。最后指定的 console= 将被设置为 /dev/console

console=tty0 console=ttyS0,115200

请参阅 https://docs.linuxkernel.org.cn/admin-guide/serial-console.html

getty

在引导时,systemd-getty-generator(8) 将为内核命令行中指定的每个控制台启动一个 getty 实例。

如果您没有在内核命令行中配置 console=,请启动 serial-getty@device.service。对于 /dev/ttyS0 (COM1),即 serial-getty@ttyS0.service启用该服务以在引导时启动它。

除非在内核命令行中另有指定,否则 getty 将使用 38400 bit/s 的波特率、8 个数据位、无奇偶校验和一个停止位。

建立连接

使用终端仿真程序进行连接

注意 在建立连接之前,建议将自己添加到 uucp 用户组中。否则,您需要 root 权限才能建立连接。

在用于连接远程控制台的机器上执行这些步骤。

cu

uucp 工具 cu 可用于“拨入”另一台系统并充当串口控制台

$ cu --line /dev/ttyS0

dterm

dterm-gitAUR 是一个微型串口通信程序。如果您在不带参数的情况下调用它,它默认会以 9600 波特连接到 /dev/ttyS0。以下示例以 115200 波特连接到 /dev/ttyS0,数据位为 8,无奇偶校验位,停止位为 1

$ dterm 115200 8 n 1

更多示例请参阅其 README

Minicom

minicom 可从官方仓库获取。以设置模式启动 Minicom

$ minicom -s

使用文本导航菜单,将串口设置更改为以下内容

Serial Device: /dev/ttyS0
Bps/Par/Bits: 9600 8N1

按回车键退出菜单(按 Esc 不会保存更改)。删除调制解调器初始化和重置字符串,因为我们没有连接到调制解调器。为此,在 Modem and Dialing 菜单下,删除 Init 和 Reset 字符串。或者通过从主菜单中选择 save setup as dfl 来保存配置。在串口电缆连接到目标机器的情况下重启 minicom。导航 Minicom 的特殊键可以在帮助菜单中找到,该菜单可以通过按 Ctrl+A Z 打开(例如,退出会话是 Ctrl+A X)。

picocom

picocom 是一个微型的哑终端仿真程序,非常类似于 minicom,但它是 pico 版的。以下示例以 9600 bps 连接到 ttyS0

$ picocom -b 9600 /dev/ttyS0
注意 如果退格键无法正常工作,请尝试此选项:--omap delbs

详细用法请参阅其手册。

Screen

GNU Screen 能够连接到串口。它默认以 9600 波特连接

$ screen /dev/ttyS0

可以在命令行上指定不同的波特率(例如 115200)。

$ screen /dev/ttyS0 115200

要结束会话,请按 Ctrl+a 然后按 K。或者,按 Ctrl+a,输入 :quit 并按 Enter 确认。

Serialclient

Serialclient[2] 是一个用 ruby 编写的用于串口连接的 CLI 客户端。安装 ruby 软件包,然后通过以下方式安装它

# gem install serialclient

然后,您可以这样使用

$ serialclient -p /dev/ttyS0

tinyserial

tinyserialAUR 是一个 minicom 的替代品,用于访问 Linux 上的串口,灵感来自 FreeBSD 的 'tip'。

$ com /dev/ttyS0 9600

tio

tioAUR 是一个简单的串口设备工具,具有直接的命令行和配置文件界面,可轻松连接到串口 TTY 设备以进行基本的 I/O 操作。它减少了对传统终端/调制解调器功能的关注,更多地关注嵌入式开发人员和极客的需求。tio 最初是作为 screen 的替代品而创建的,用于在使用 tmux 时连接到串口设备。

$ tio /dev/ttyUSB0

socat

socat 是一个基于命令行的实用程序,可建立两个双向字节流并在它们之间传输数据。

$ socat - /dev/ttyACM0,raw,echo=0,b115200

microcom

microcom 将字节从标准输入复制到 TTY,并从 TTY 复制到标准输出,它是 busybox 的一部分

$ busybox microcom -s 115200 /dev/ttyACM0

图形前端

  • cutecom — 一个支持 GUI 的串口监视器。
https://gitlab.com/cutecom/cutecom || cutecomAUR
  • PuTTY — 一个集成了终端的 SSH/Telnet 客户端。
https://www.chiark.greenend.org.uk/~sgtatham/putty/ || putty
  • moserial — 一个基于 GTK 的串口终端,主要面向需要与嵌入式系统、测试设备和串口控制台通信的技术用户和硬件极客。
https://wiki.gnome.org/Apps/Moserial || moserial
  • gtkterm — GTKTerm 是一个简单的 Linux 图形化串口终端仿真器,可能也适用于其他符合 POSIX 标准的操作系统。它可用于与各种带有串口接口的设备进行通信,例如嵌入式计算机、微控制器、调制解调器、GPS 接收器、CNC 机器等。
https://github.com/Jeija/gtkterm || gtktermAUR

Windows 客户端

在 Windows 机器上,使用 PuTTYTerminalbpp 等程序连接到串口。

使用串口控制台安装 Arch Linux

提示 Arch Linux 每月发布版本(安装介质)的引导加载程序 被配置为监听
  • 0 端口 — ttyS0 或 COM1,
  • 115200 bps,
  • 具有 8 个数据位,
  • 无奇偶校验位,
  • 停止位为 1。
  1. 使用上述方法连接到目标机器。
  2. 使用 Arch Linux 安装介质引导目标机器。
  3. 当引导加载程序出现时,选择 Boot Arch Linux (<arch>) 并按 Tab 进行编辑
  4. 追加 console=ttyS0,115200 并按 Enter
  5. 现在 systemd 应该检测到 ttyS0 并在其上生成一个串行 getty。以 root 身份登录并照常开始安装。
  • 设置完成后,控制台设置不会保存在目标机器上;为了避免必须连接键盘和显示器,请在重启前配置目标机器上的控制台访问权限。
  • 虽然本文档中的大多数示例使用了 9600 的端口速度,但建议使用更高的值。可用速度列表可以通过按 Ctrl+a 然后按 p 在 Minicom 中显示。

使用串口控制台调试无响应的机器

尽管 [3] 只有原始且简短的说明,但它呈现了完整的场景。重要的是要注意,在这里,被测试的机器以可重现的方式变得无响应。而且它发生在正常操作期间。因此,在需要调试之前,可以正常访问它。但是,通常情况下,串口控制台对于调试引导问题也很有用。也许可以通过在机器启动时手动配置引导加载程序来实现。还要注意本节外部链接的 P.S 段落中提到的 netconsole

技巧与提示

按需为 ttyUSB 启用 serial-getty

通过连接 USB 串口适配器来调试系统需要启动 serial-getty@ttyUSBN.service,如果无法以正常方式与系统交互,这可能无法实现。一个解决方案是编写一个 udev 规则,在插入 USB 串口适配器时启动该服务。

为了允许以另一种方式使用 USB 串口适配器,udev 规则可以限制为仅在特定的 USB 端口上触发。为此,请插入适配器并找出其使用的 USB 端口标识符。例如,对于 /dev/ttyUSB0,运行

$ udevadm info --query=property --property=ID_PATH --value --name=/dev/ttyUSB0

使用先前命令获得的值,创建一个包含以下内容的 udev 规则

/etc/udev/rules.d/99-usb_serial-getty.rules
ACTION=="add", SUBSYSTEM=="tty", ENV{ID_BUS}=="usb", ENV{ID_PATH}=="your_ID_PATH_value", TAG+="systemd", ENV{SYSTEMD_WANTS}+="serial-getty@$kernel.service"

重新插入 USB 串口适配器,相应的 serial-getty@ttyUSBN.service 将自动启动。通过使用 systemctl 检查单元状态来进行验证。当拔下 USB 设备时,服务将自动停止。

故障排除

Ctrl+c 和 Minicom

如果您在通过 minicom 发送 Ctrl+c 命令时遇到问题,您需要在设备设置 (minicom -s) 中关闭硬件流控制,这将启用中断。

RS-232 条码扫描器(乱码输出)

一些条码扫描器通过使用 USB 转串口适配器(例如 FTDI)的 RS-232 连接,并显示为 /dev/ttyUSB* 设备。这些扫描器将条码数据作为字节流输出,并且不使用 SANE 扫描堆栈。

如果扫描的条码产生不可读的字符(例如 Unicode 替换字符 ),这通常是由于串口帧参数不匹配引起的,而不是波特率不正确。

许多扫描器默认使用 7 个数据位和偶校验 (7E1),而 Linux 工具通常默认使用 8 个数据位和无校验 (8N1)。为了测试并纠正此问题,请显式配置串口

stty -F /dev/ttyUSB0 9600 cs7 parenb -parodd -cstopb -ixon -ixoff clocal
cat /dev/ttyUSB0


调整终端大小

与 ssh 不同,串口连接没有机制在终端调整大小时传输类似 SIGWINCH 的信号。当您调整终端仿真器窗口大小时,这会导致一些全屏程序(例如 less)出现奇怪的问题。

通过 stty 调整终端大小是一种变通方法

$ stty rows lines cols columns

然而,这需要您手动输入正确的几何参数。以下方法应该更简单。

1. 有一个鲜为人知的名为 resize 的实用程序,随 xterm 一起分发,它可以解决这个问题。在调整终端仿真器窗口大小后,在不带参数的情况下调用它

$ resize

2. 如果您不想安装 xterm,可以通过 shell 函数执行相同的工作。将以下函数放入您的 bash/zshrc 中,并在调整终端仿真器窗口大小后在不带参数的情况下调用它

rsz() {
	if [[ -t 0 && $# -eq 0 ]];then
		local IFS='[;' escape geometry x y
		echo -ne '\e7\e[r\e[999;999H\e[6n\e8'
		read -t 5 -sd R escape geometry || {
			echo unsupported terminal emulator. >&2
			return 1
		}
		x="${geometry##*;}" y="${geometry%%;*}"
		if [[ ${COLUMNS} -eq "${x}" && ${LINES} -eq "${y}" ]];then
			echo "${TERM} ${x}x${y}"
		elif [[ "$x" -gt 0 && "$y" -gt 0 ]];then
			echo "${COLUMNS}x${LINES} -> ${x}x${y}"
			stty cols ${x} rows ${y}
		else
			echo unsupported terminal emulator. >&2
			return 1
		fi
	else
		echo 'Usage: rsz'
	fi
}

额外的硬件串口

通用的 8250 串口驱动程序公开了 32 个硬件串口,正如 Arch 内核配置中所设置的那样。这意味着默认情况下,串口的编号范围从 /dev/ttyS0/dev/ttyS31。在大多数系统上,这些端口中的许多将无法正常工作。

可以通过设置 内核参数 8250.nr_uarts 来减少数量。例如

8250.nr_uarts=5

此值必须设置为内核引导参数而不是模块选项,因为 serial8250 驱动程序是编译进内核映像的。

© . This site is unofficial and not affiliated with Arch Linux.

Content is available under GNU Free Documentation License 1.3 or later unless otherwise noted.