使用串行控制台

来自 ArchWiki
(重定向自 串行控制台

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

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

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

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

在目标机器上配置控制台访问

引导加载程序

GRUB

当使用 GRUB 和生成的 grub.cfg 时,编辑 /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-install 对于 GRUB_ENABLE_CRYPTODISK=y 具有特殊行为,并将创建放置在 /boot/grub/PLATFORM/load.cfg 中的早期配置,但 grub-install 忽略来自 /etc/default/grub 的 GRUB 第一阶段串行控制台配置。

每次启动 grub-install 时,/boot/grub/PLATFORM/load.cfg 文件都会被覆盖。

要在串行控制台上获取 GRUB cryptodisk 密码提示,需要一些额外的配置步骤

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 权限才能建立连接。

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

dterm

dterm-gitAUR 是一个微小的串行通信程序。如果您在没有参数的情况下调用它,它将默认连接到 /dev/ttyS0,波特率为 9600。以下示例连接到 /dev/ttyS0,波特率为 115200,具有 8 个数据位、无奇偶校验位和 1 个停止位时间

$ dterm 115200 8 n 1

有关更多示例,请参阅其 README

Minicom

minicom 可以从官方存储库获得。在设置模式下启动 Minicom

$ minicom -s

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

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

按 Enter 键退出菜单(按 Esc 键不会保存更改)。删除调制解调器初始化和复位字符串,因为我们没有连接到调制解调器。为此,在调制解调器和拨号菜单下,删除初始化和复位字符串。可选地,通过从主菜单中选择save setup as dfl来保存配置。重新启动 minicom,并将串行电缆连接到目标机器。用于导航 Minicom 的特殊键可以在帮助菜单中找到,该菜单通过按 Ctrl+A Z 打开(即,退出会话是 Ctrl+A X)。

picocom

picocom 是一个微小的哑终端仿真程序,它非常像 minicom,但不是 mini,而是 pico。以下示例连接到 ttyS0,波特率为 9600 bps

$ 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

图形前端

  • 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 每月发布版本(即安装介质)的引导加载程序已配置[3] 以监听 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 中显示可用速度列表)

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

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

故障排除

Ctrl+c 和 Minicom

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

调整终端大小

与 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 驱动程序已编译到内核映像中。