Linux 服务器和集群的串口控制台

作者:Matthew E. Hoskins

管理大量的 Linux 和 UNIX 系统需要大量的组织、自动化和谨慎的技术使用。系统管理员的大部分时间都花在构建基础设施上,以使管理这些系统更容易。这样做可以提高灵活性、可恢复性并减少停机时间。所有这些都有望减轻压力并延长假期。本文讨论了一种简单的技术,它可以帮助实现上述所有目标:串口控制台。

Linux Serial Consoles for Servers and Clusters

图 1. 从控制台服务器管理多台服务器

串口控制台一直是企业级 UNIX 硬件的标准功能。现代高密度服务器和集群配置有时可以在 19 英寸机架中挤入 50 多台服务器,因此为每台服务器配备显示器和键盘是不可想象的。虽然 KVM(键盘/视频/鼠标)切换器可以将多台服务器连接到少量显示器和键盘,但它们价格昂贵,并且远程访问功能更是如此。串口控制台允许您将机架或服务器架的所有控制台始终从任何地方可用。

控制台的定义

控制台是一个简单的 I/O 设备,在内核启动过程的早期初始化,以在系统启动时传递信息性消息。一旦操作系统开始运行启动脚本,控制台就可以用于恢复发生故障的系统或从系统管理员交互式获取输入,就像 Red Hat 的 Kudzu 所做的那样。串口控制台的一个引人注目的功能是永远不必开车去上班,因为系统在重新启动时挂起,要求为 fsck 输入。系统完全启动后,控制台通常会变成登录终端,有时是图形终端。控制台也可以用作报告内核内部问题的最后手段。在这些崩溃情况下,并非总是可以写入日志文件或网络日志服务器,因此消息会报告到控制台。由于这个原因以及更多原因,服务器上的控制台应该是一个简单的设备,而串口是标准系统配置中包含的最简单的设备。对于那些最后一刻的崩溃消息,可以添加一个支持缓冲和日志记录的控制台设备,这样您就不会错过任何精彩瞬间。

硬件支持

我们在这里讨论的是在不使用连接的键盘、鼠标或视频显示器的情况下启动系统。有些主板可能会在没有直接连接键盘的情况下抱怨,但通常可以在 BIOS 配置中更改此要求。事实上,随着 USB 键盘最近的普及,大多数 BIOS 版本都不关心是否缺少键盘。如果您使用的是设计为服务器的系统,您可能会更幸运。一些供应商已开始在其 BIOS 版本中添加额外的功能,以更好地支持从开机开始的串口控制台。这些功能有时包括开机系统测试 (POST) 输出和通过串口访问 BIOS 配置。根据您的需求,您可以通过查看供应商的规格来相应地选择您的硬件。即使没有 BIOS 支持,您仍然可以在几乎任何 PC 系统上非常有效地使用串口控制台。

但这并不是一个完美的解决方案,而且您的普通 PC 硬件不提供典型企业级 UNIX 硬件中提供的所有功能。PC BIOS 版本没有引导监视器的概念(请参阅“什么是引导监视器?”侧边栏),您也无法像在企业级 UNIX 硬件中那样执行 OS 的硬件停止。对于许多应用程序来说,这没问题,但是当需要更多功能时,可以使用附加硬件选项,我将在稍后讨论它们。

什么是启动监视器?

经典的 UNIX 硬件(Sun、HP、SGI 等)通常具有称为引导监视器的功能。将其视为内置于服务器或工作站主板上的闪存中的微型操作系统。有时称为引导控制台或 prom 控制台,它们的功能类似于 PC BIOS 和引导加载程序合二为一。它们负责理解各种启动设备,并将内核映像加载到 RAM 中并运行。大多数引导监视器可以从网络启动以进行无盘操作或从故障启动设备恢复。引导监视器的一个关键特性是它们位于控制台和内核之间,因此通常可以暂停或停止正在运行的操作系统,并通过魔术键击进入引导监视器。然后,更好的是,操作系统会从中断的地方恢复。这允许您诊断硬件问题或强制重新启动系统,即使内核已死机。在 PC 系统中,BIOS 中只存在一组基本的硬件支持,其余的必须由硬件本身闪存中提供的小段代码提供。

大多数 PC 硬件 BIOS 版本只能配置为使用直接连接的键盘和视频显示器。幸运的是,大多数都带有可用的默认设置,因此这通常不是问题。如果是,您可能需要使用直接连接的视频和键盘初始配置系统,然后再切换到串口控制台。根据我的经验,我很少需要这样做;只需在初始硬件设置期间执行一次即可。

软件配置概述

正如大多数发行版打包的那样,Linux 内核和引导加载程序选择直接连接的视频控制器和键盘作为控制台,但这很容易更改。当基于 PC 的系统启动时,引导加载程序是第一个从磁盘加载的程序。Linux 系统上常用的三个主要引导加载程序是 GRUB、LILO 和 SYSLINUX(用于启动软盘);它们都支持串口控制台。接下来,需要告知 Linux 内核使用串口作为其控制台,这可以在编译时处理,也可以通过从引导加载程序配置传递内核命令行选项来处理。最后,如果您希望能够在控制台上登录,则需要在系统启动后配置一个 getty 进程来运行。

内核配置

我们接下来讨论内核配置,因为它是理解稍后引导加载程序配置的先决条件。配置内核控制台的最灵活方法是使用在内核命令行上传递的选项。您可以从引导加载程序将参数附加到命令行。以下是内核命令行语法的示例

console=ttyS0,9600n8

这告诉内核使用 ttyS0(内核发现的第一个串口),以 9600 波特、无奇偶校验和 8 位运行。内核默认为一个停止位。这是串口控制台最常见的速度和配置,这就是为什么大多数串口和终端默认为 9600n8。可以附加多个console=参数到命令行;内核消息然后输出到所有这些参数,但只有最后一个用于输入。

引导加载程序配置:GRUB

GRUB 是一个灵活的引导加载程序,对串口控制台提供出色的支持。正确配置后,GRUB 允许将多个设备用作控制台。列表 1 显示了 Red Hat/Fedora Core 安装程序配置的示例 grub.conf 文件(通常为 /boot/grub/grub.conf 并符号链接到 /etc/grub.conf)。您的文件可能略有不同。

列表 1. 一个普通的 grub.conf 文件

# grub.conf generated by anaconda
#
# Note that you do not have to rerun grub
# after making changes to this file
# NOTICE:You have a /boot partition.
#        This means that all kernel
#        and initrd paths are relative
#        to /boot/, eg.
#        root (hd0,1)
#        kernel /vmlinuz-version ro root=/dev/hda6
#        initrd /initrd-version.img
#boot=/dev/hda
default=0
timeout=10
splashimage=(hd0,1)/grub/splash.xpm.gz
title Red Hat Linux (2.4.20-8)
        root (hd0,1)
        kernel /vmlinuz-2.4.20-8 ro root=LABEL=/
        initrd /initrd-2.4.20-8.img

首先要做的是删除所有 splashimage 指令。在一些早期版本中,这些指令会混淆 GRUB 并使其默认为视频控制台。然后添加 serial 和 terminal 行。serial 行将串口初始化为正确的波特率和设置。在 terminal 行中,我们将 GRUB 配置为将提示发送到串口以及键盘和显示器。您可以按下其中任何一个上的任意键,它将成为默认控制台。--timeout=10参数告诉 GRUB 在十秒后默认为 terminal 行中列出的第一个设备。我们还修改了内核命令行以包含该选项,该选项告诉 Linux 内核使用串口作为控制台。列表 2 显示了完整的修改后的 grub.conf 文件。

列表 2. 一个支持串口控制台的 grub.conf 文件

#boot=/dev/hda

# Options added for serial console
serial  --unit=0 --speed=9600 \
        --word=8 --parity=no --stop=1
terminal --timeout=10 serial console

default=0
timeout=10
title Red Hat Linux (2.4.20-8)
        root (hd0,1)
        kernel /vmlinuz-2.4.20-8 ro \
                root=LABEL=/ console=ttyS0,9600n8
        initrd /initrd-2.4.20-8.img
引导加载程序配置:LILO

LILO 引导加载程序虽然比 GRUB 成熟得多,但功能较少。我们必须配置 LILO 并将选项传递给内核以使用串口。为此,我们添加

serial=<port>,<bps><parity><bits>

其中 port 0 是 LILO 检测到的第一个串口。 此外,append=行被修改为包含内核选项。修改 /etc/lilo.conf 文件后,请务必运行 LILO 以更新引导加载程序。完整的 lilo.conf 文件如列表 3 所示。

列表 3. 带有串口控制台支持的 lilo.conf

serial=0,9600n8
boot=/dev/hda
map=/boot/map
install=/boot/boot.b
prompt
timeout=50
message=/boot/message
linear
default=Linux

image=/boot/vmlinuz-2.4.20-8
        label=2.4.20-8
        read-only
        initrd=/boot/initrd-2.4.20-8.img
        append="root=LABEL=/ console=ttyS0,9600n8"

引导加载程序配置:SYSLINUX

SYSLINUX 是一个引导加载程序,旨在与 DOS/FAT 格式的可启动软盘一起使用。Red Hat/Fedora Core Linux 将 SYSLINUX 用于安装启动软盘和救援软盘。为了通过串口控制台安装或从启动软盘恢复,需要修改软盘。我们添加了console=text指令添加到 append 行,并且我们删除了 Red Hat 原始文件中存在的额外启动选择。第一行初始化并指示 SYSLINUX 使用串口 0(又名 /dev/ttyS0)并默认为 9600n8。使用此修改后的启动软盘,我们可以通过串口控制台安装操作系统。Red Hat 的文本安装选项以这种方式工作得非常好。使用上述修改,您可以转换任何 SYSLINUX 启动软盘以使用串口控制台。此过程也适用于 ISOLINUX,它是 SYSLINUX 的衍生产品,用于可启动 CD-ROM。

列表 4. 配置为串口控制台的 syslinux.cfg 文件

serial 0
default Linux
prompt 1
timeout 100
label Linux
  kernel vmlinuz
  append initrd=initrd.img lang= text   \
        devfs=nomount ramdisk_size=8192 \
        console=ttyS0,9600n8

启用登录和调整

如前所述,控制台可以在系统启动后成为登录终端。为此,必须修改 /etc/inittab 中的 getty 条目。标准 /etc/inittab 仅在虚拟控制台上启动 mingetty。由于 mingetty 不适用于串口终端,我们必须使用其他东西。有许多 getty 类型程序可用,但 agetty 几乎包含在每个 Linux 发行版中,因此我们使用它。此外,请确保系统启动到非图形模式,通常为运行级别 3。如果安装了任何 X 软件包,一些 Linux 发行版默认为 X 登录,通常在运行级别 5。默认运行级别在 initdefault 行上确定。要在串口线上启用 agetty,您可以修改 /etc/inittab 中的 initdefault 行

id:3:initdefault:

并添加 agetty 的行

co:2345:respawn:/sbin/agetty ttyS0 9600 vt100

这告诉 agetty 以 9600bps 的速度在 /dev/ttyS0 上开始等待登录,使用 vt100 终端仿真。您可能希望保留原始的 mingetty 条目,以允许直接连接的键盘和显示器用于登录。如果不是,只需注释掉它们即可。root 可以从哪里登录受到严格控制;为了使 root 可以从 ttyS0 登录,您必须将该设备添加到 /etc/securetty 文件中。

最后,如果您的系统创建了 /etc/ioctl.save 文件,请删除或重命名它。此文件用于在重新启动之间保存控制台设置。如果系统是使用直接连接的键盘和显示器启动的,则此文件会尝试恢复不正确的设置。当您使用串口控制台重新启动时,会创建一个新的文件。

为 Red Hat/Fedora Core 进行调整

Red Hat 的启动脚本使用转义序列,因此 OK、PASS 和 FAIL 消息以彩色显示。这会混淆串口控制台,因此最好禁用它。只需修改 /etc/sysconfig/init,然后更改BOOTUP=行改为BOOTUP=serial。这将阻止使用彩色消息。

布线

串口布线可能会引起一些混乱。基本上,有两种类型的串口,DCE(数据通信设备)和 DTE(数据终端设备)。这些端口的不同之处在于特定信号如何连接到连接器上的引脚。与串口的数据通信使用单独的发送和接收线,因此当连接两个设备时,必须确保一侧的发送线连接到另一侧的接收线。只要您将 DCE 设备连接到 DTE 设备,您就可以使用普通的直通电缆,其中每个引脚都连接到电缆另一侧的相同引脚。但是,如果您要连接相同类型的设备,则必须使用特殊的电缆或适配器,称为零调制解调器,以便正确交换信号。DTE 设备通常是终端、计算机和打印机。DCE 设备旨在直接连接到计算机,例如调制解调器和串口鼠标。

除了数据发送和接收线之外,还使用了许多握手信号来控制数据流,因此一侧的说话速度不会太快而另一侧无法理解。这些信号也必须由零调制解调器交换。更令人困惑的是,串口使用了两种流行的连接器,9 针 DB9 和 25 针 DB25。这些可以是公头和母头两种类型。在几乎所有情况下,用于串口控制台的设备(终端、计算机和控制台服务器)都是 DTE,这意味着您需要某种零调制解调器。这些以适配器和电缆的形式提供。大多数现成的单元都可以正常工作,但是如果您想自己焊接,请查看在线资源部分以获取引脚排列和电缆图的链接。

整合在一起

至此,我们描述了一个可以在没有直接连接键盘和显示器的情况下启动的 Linux 系统。它在系统启动时使用第一个串口来获取所有信息性消息,并在系统启动后接受来自该控制台的登录。但是您应该将控制台端口连接到什么?有很多可能性。如果您不需要远程控制台访问,您可以简单地让端口保持未连接状态,直到您需要维护系统为止。您可以使用通过零调制解调器连接的计算机或笔记本电脑以及 minicom 程序来访问系统的控制台。只需配置 minicom 以与未使用的串口通信,将速度设置为 9600 波特、8 位、无奇偶校验和 1 个停止位(又名 9600-8n1)。将系统连接在一起,然后观看系统启动并最终要求您登录。

为了远程访问服务器的控制台,您可以设置一个控制台集中器,它很像终端服务器。它可以是一个自制的 Linux 盒子,带有多个串口卡,为您提供与服务器数量一样多的端口。使用这种设置,您可以通过登录到单个专用 Linux 盒子来访问所有服务器的控制台。

专用硬件

如果您喜欢远程访问控制台的想法,但想要更多类似设备的产品,那么许多产品可以提供帮助。Cyclades (www.cyclades.com) 制造了一种名为 AlterPath 的控制台集中器;它的价格合理,并提供 1、4、8、16、32 和 48 端口型号。AlterPath 单元在内部从闪存运行 Linux。Web 界面用于配置,或者您可以直接通过 shell 登录修改配置文件。

配置 Cyclades 单元最灵活的方式是使用 Cyclades 修改后的 SSH 守护程序来呈现控制台。这样,您可以直接 SSH 连接到每个连接的服务器的控制台端口,该端口由您选择的文本名称标识。因此,要连接到标识为 server 的服务器,该服务器连接到主机名为 cyclades 的 Cyclades 单元,用户为 matt,命令如下所示ssh matt:server@cyclades。(冒号语法是 Cyclades 对 sshd 的修改,允许您传递端口名称。)此设置易于使用,您甚至可以设置 SSH 私钥身份验证。

其他供应商也制造控制台集中器或服务器,包括 Digi (www.digi.com)、Equinox (www.equinox.com) 和 Raritan (www.raritan.com)。所有这些供应商都提供网络连接的串口控制台产品。

如前所述,标准 PC 硬件上的串口控制台缺少企业级 UNIX 硬件上可用的一些功能。一种解决方案是 PC Weasel (www.realweasel.com),它以 PCI 或 ISA 卡的形式提供。此设备模拟视频卡并将所有输出转换为串口作为正常的终端转义序列。来自串口的输入被转换为 PC 键盘扫描码。因为它对系统来说看起来像视频卡,所以系统允许它完全访问 BIOS 和 POST。其他功能允许您执行远程硬复位。PC Weasel 也有自己的处理器,因此即使插入它的主机崩溃,它仍然可用。

专用软件

如果您想构建自己的控制台集中器,可以使用一些选项使其比带有大量串口的简单盒子更好。Conserver (www.conserver.com) 是一个开源软件包,用于管理连接到串口控制台的系统。它支持 SSL 加密并且高度可配置。

本文资源: /article/7507

Matthew E. Hoskins 是新泽西理工学院的 Linux/UNIX 系统管理员,他在那里维护着许多公司管理系统。他喜欢尝试将截然不同的系统和软件协同工作,通常使用薄薄的一层 Perl(也称为 MattGlue)。可以通过 matt@njit.edu 与他联系。

加载 Disqus 评论