使用串行控制台
Arch Linux 机器可以配置为通过串口控制台端口进行连接,即使机器没有连接键盘、鼠标、显示器或网络,也可以对其进行管理。
Arch Linux 也可以通过串口控制台进行安装。
此场景的基本环境是两台通过串口电缆(9 针连接器电缆)连接的机器。管理机器可以是任何装有终端仿真程序(例如 PuTTY 或 Minicom)的 Unix/Linux 或 Windows 机器。
下面的配置说明将启用引导加载程序菜单选择、引导消息以及到串口控制台的终端转发。
配置目标机器的控制台访问权限
引导加载程序
GRUB
当使用带有生成的 grub.cfg 的 GRUB 时,编辑 /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 手册中关于通过串口使用 GRUB 和 serial 命令的章节,获取可用选项的详细说明。
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 第一阶段的串口控制台配置。
/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 ''),并将 serial 和 terminal 模块添加到 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 的串口监视器。
- PuTTY — 一个集成了终端的 SSH/Telnet 客户端。
- moserial — 一个基于 GTK 的串口终端,主要面向需要与嵌入式系统、测试设备和串口控制台通信的技术用户和硬件极客。
- gtkterm — GTKTerm 是一个简单的 Linux 图形化串口终端仿真器,可能也适用于其他符合 POSIX 标准的操作系统。它可用于与各种带有串口接口的设备进行通信,例如嵌入式计算机、微控制器、调制解调器、GPS 接收器、CNC 机器等。
Windows 客户端
在 Windows 机器上,使用 PuTTY 或 Terminalbpp 等程序连接到串口。
使用串口控制台安装 Arch Linux
- 在
0端口 —ttyS0或 COM1, - 在
115200bps, - 具有 8 个数据位,
- 无奇偶校验位,
- 停止位为 1。
- 使用上述方法连接到目标机器。
- 使用 Arch Linux 安装介质引导目标机器。
- 当引导加载程序出现时,选择 Boot Arch Linux (<arch>) 并按
Tab进行编辑 - 追加
console=ttyS0,115200并按Enter。 - 现在 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 驱动程序是编译进内核映像的。