使用串行控制台
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 手册中关于 通过串行线路使用 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 第一阶段串行控制台配置。
每次启动 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
),并将 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 权限才能建立连接。在用于连接远程控制台的机器上执行这些步骤。
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 的串行监视器。
- PuTTY — 一个集成了 SSH/Telnet 客户端的终端。
- moserial — 一个基于 GTK 的串行终端,主要用于需要与嵌入式系统、测试设备和串行控制台通信的技术用户和硬件黑客。
- gtkterm — GTKTerm 是一个简单、图形化的串行端口终端模拟器,适用于 Linux 以及可能其他符合 POSIX 标准的操作系统。它可以用于与各种具有串行接口的设备进行通信,例如嵌入式计算机、微控制器、调制解调器、GPS 接收器、CNC 机床等。
Windows 客户端
在 Windows 机器上,使用 PuTTY 或 Terminalbpp 等程序连接到串行端口。
使用串行控制台安装 Arch Linux
ttyS0
/COM1),波特率为 115200 bps,具有 8 个数据位、无奇偶校验位和 1 个停止位时间。- 使用上述方法连接到目标机器。
- 使用 Arch Linux 安装介质启动目标机器。
- 当引导加载程序出现时,选择 Boot Arch Linux (<arch>) 并按
Tab
键进行编辑 - 追加
console=ttyS0,115200
并按Enter
键。 - 现在 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
驱动程序已编译到内核映像中。