HVCS IBM “Hypervisor 虚拟控制台服务器” 安装指南

适用于 Linux 内核 2.6.4+

版权所有 (C) 2004 IBM Corporation

作者:Ryan S. Arnold <rsa@us.ibm.com>

创建日期:2004 年 3 月 2 日 上次修改日期:2004 年 8 月 24 日

1. 驱动程序简介:

这是 IBM Hypervisor 虚拟控制台服务器 “hvcs” 的设备驱动程序。 IBM hvcs 提供了一个 tty 驱动程序接口,允许 Linux 用户空间应用程序访问在同一分区 Power5 ppc64 系统上运行的逻辑分区操作系统(Linux 和 AIX)的系统控制台。每个分区的物理硬件控制台在这种硬件上并不实用,因此系统控制台由该驱动程序使用固件接口访问虚拟终端设备。

2. 系统要求:

此设备驱动程序是使用 2.6.4 Linux 内核 API 编写的,并且只能在此版本或更高版本的内核上构建和运行。

此驱动程序编写为仅在 IBM Power5 ppc64 硬件上运行,尽管已采取一些措施将体系结构相关的固件调用从驱动程序代码中抽象出来。

Sysfs 必须安装在系统上,以便用户可以确定哪个主次编号与每个 vty-server 相关联。有关 sysfs 安装的说明超出了本文档的范围。

3. 构建选项:

hvcs 驱动程序将其自身注册为 tty 驱动程序。 tty 层动态分配一个由注册驱动程序请求数量的主次编号块。 hvcs 驱动程序默认情况下会向 tty 层请求 64 个此类主/次编号,以用于 hvcs 设备节点条目。

如果默认的设备条目数量足够,则可以将此驱动程序构建到内核中。 如果不是,则可以通过使用 insmod 参数作为模块插入驱动程序来覆盖默认值。

3.1 内置:

以下 menuconfig 示例演示了选择将此驱动程序构建到内核中

Device Drivers  --->
        Character devices  --->
                <*> IBM Hypervisor Virtual Console Server Support

开始内核 make 过程。

3.2 模块:

以下 menuconfig 示例演示了选择将此驱动程序构建为内核模块

Device Drivers  --->
        Character devices  --->
                <M> IBM Hypervisor Virtual Console Server Support

make 过程将构建以下内核模块

  • hvcs.ko

  • hvcserver.ko

要使用默认分配插入模块,请按出现顺序执行以下命令

insmod hvcserver.ko
insmod hvcs.ko

hvcserver 模块包含特定于体系结构的固件调用,必须首先插入,否则 hvcs 模块将找不到它期望的一些符号。

要覆盖默认值,请使用如下所示的 insmod 参数(例如,请求 4 个 tty 设备)

insmod hvcs.ko hvcs_parm_num_devs=4

可以在 insmod 上指定的最大 dev 条目数。 我们认为目前允许的最大服务器适配器数量为 1024 是一个不错的值。 始终可以在构建之前通过修改源文件中的常量来更改此值。

注意:插入驱动程序模块所需的时间长度似乎与注册驱动程序请求的 tty 接口数量有关。

要删除驱动程序模块,请执行以下命令

rmmod hvcs.ko

将 hvcs 作为模块安装的推荐方法是使用 depmod 在 /lib/modules/uname -r 中构建当前 modules.dep 文件,然后执行

modprobe hvcs hvcs_parm_num_devs=4

modules.dep 文件表明 hvcserver.ko 需要在 hvcs.ko 之前插入,并且 modprobe 使用此文件智能地按正确的顺序插入模块。

以下 modprobe 命令用于按正确的顺序删除 hvcs 和 hvcserver

modprobe -r hvcs

4. 安装:

tty 层创建 sysfs 条目,其中包含为 hvcs 驱动程序分配的主次编号。 以下 “tree” 输出 sysfs 目录的片段显示了这些数字的显示位置

sys/
|-- *other sysfs base dirs*
|
|-- class
|   |-- *other classes of devices*
|   |
|   `-- tty
|       |-- *other tty devices*
|       |
|       |-- hvcs0
|       |   `-- dev
|       |-- hvcs1
|       |   `-- dev
|       |-- hvcs2
|       |   `-- dev
|       |-- hvcs3
|       |   `-- dev
|       |
|       |-- *other tty devices*
|
|-- *other sysfs base dirs*

对于上述示例,以下输出是 cat’ing hvcs 目录中的 “dev” 条目的结果

Pow5:/sys/class/tty/hvcs0/ # cat dev
254:0

Pow5:/sys/class/tty/hvcs1/ # cat dev
254:1

Pow5:/sys/class/tty/hvcs2/ # cat dev
254:2

Pow5:/sys/class/tty/hvcs3/ # cat dev
254:3

读取 “dev” 属性的输出是 tty 层为此驱动程序的使用分配的字符设备主次编号。 大多数运行 hvcs 的系统已经创建了设备条目,或者 udev 会自动创建这些条目。

给定上面的示例输出,要手动创建 /dev/hvcs* 节点条目,可以使用 mknod,如下所示

mknod /dev/hvcs0 c 254 0
mknod /dev/hvcs1 c 254 1
mknod /dev/hvcs2 c 254 2
mknod /dev/hvcs3 c 254 3

使用 mknod 手动创建设备条目使这些设备节点持久。 创建后,它们将在驱动程序 insmod 之前存在。

在插入 hvcs 模块之前尝试将应用程序连接到 /dev/hvcs* 将导致类似于以下内容的错误消息

"/dev/hvcs*: No such device".

注意:仅仅因为存在设备节点并不意味着为该节点配置了 vty-server 设备。

5. 连接

由于此驱动程序控制提供 tty 接口的设备,因此用户可以使用任何标准的 tty 交互方法(例如,“cat”、“dd”、“echo”)与设备节点条目进行交互。 但是,此驱动程序的目的是提供与 Linux 分区控制台的实时控制台交互,这需要使用提供与 tty 设备双向交互式 I/O 的应用程序。

充当终端仿真器或对正在传递的数据执行终端类型控制序列转换的应用程序(例如,“minicom” 和 “screen”)不适合提供交互式控制台 I/O。 这些程序通常会模拟过时的终端类型(vt100 和 ANSI),并期望传入数据采用这些受支持的终端类型之一的形式,但是它们要么不转换,要么不_充分_地将传出数据转换为调用它们的终端的终端类型(尽管 screen 进行了尝试,并且显然可以使用很多 termcap 操作进行配置。)

因此,kermit 和 cu 是通过 hvcs 设备与 Linux 控制台进行交互的两个推荐应用程序。 这些程序只是充当数据进出 tty 设备的管道。 它们不需要传入数据采用特定终端类型的形式,也不将传出数据处理为特定终端类型。

为了确保控制台应用程序正常运行,必须确保一旦连接到 /dev/hvcs 控制台,控制台的 $TERM 环境变量将设置为用于启动交互式 I/O 应用程序的终端仿真器的确切终端类型。 如果使用 xterm 和 kermit 连接到 /dev/hvcs0,则当控制台提示符可用时,应在控制台上 “export TERM=xterm”。 这告诉从控制台调用的 ncurses 应用程序,它们应输出 xterm 可以理解的控制序列。

作为预防措施,hvcs 用户应始终在断开 kermit 等应用程序与设备节点的连接之前 “exit” 退出会话。 如果不这样做,下一个连接到控制台的用户将继续使用上一个用户登录的会话,其中包括使用上一个用户提供的 $TERM 变量。

vty-server 适配器的热插拔添加和删除会影响哪个 /dev/hvcs* 节点用于连接到每个 vty-server 适配器。 为了确定哪个 vty-server 适配器与哪个 /dev/hvcs* 节点相关联,已将一个特殊的 sysfs 属性添加到每个 vty-server sysfs 条目。 此条目称为 “index”,显示它会显示一个整数,该整数引用用于连接到该设备的 /dev/hvcs* 条目。 例如,cat vty-server 适配器 30000004 的 index 属性显示如下内容

Pow5:/sys/bus/vio/drivers/hvcs/30000004 # cat index
2

此索引 “2” 表示要连接到 vty-server 适配器 30000004,用户应与 /dev/hvcs2 交互。

应该注意的是,由于系统的系统热插拔 I/O 功能,与特定 vty-server 适配器交互的 /dev/hvcs* 条目不能保证在系统重新启动时保持不变。 请在问答部分查找有关此问题的更多信息。

6. 断开连接

作为防止将过时数据传递给意外目标的安全功能,Power5 系统固件会在 vty-server 和 vty 之间的连接断开时禁用数据的获取并丢弃该数据。 例如,当在向 vty 输出数据后立即断开 vty-server 与 vty 的连接时,vty 适配器可能没有足够的时间在它接收到数据中断和连接断开之间从固件获取数据,然后再由固件禁用获取。

当使用 hvcs 服务控制台时,这种行为不是一个大问题,因为适配器在几乎所有数据写入后都会保持连接很长时间。当 hvcs 被用作在两个分区之间隧道传输数据的 tty 管道时[见下面的问答],这是一个巨大的问题,因为标准的 Linux 行为是将数据 cat 或 dd 到设备时,会打开 tty,发送数据,然后关闭 tty。如果此驱动程序在 tty 关闭时手动终止 vty-server 连接,则会在目标 vty 有机会获取数据之前关闭 vty-server 和 vty 连接。

此外,仅在模块移除或适配器移除时断开 vty-server 和 vty 的连接是不切实际的,因为其他分区中的其他 vty-server 可能随时需要使用目标 vty。

由于此行为限制,从连接的 vty 断开 vty-server 的连接是一个手动过程,需要写入下面概述的 sysfs 属性,另一方面,此驱动程序会自动建立 vty-server 到 vty 的初始连接。永远不需要手动 vty-server 连接。

为了终止 vty-server 和 vty 之间的连接,使用每个 vty-server 的 sysfs 条目中的“vterm_state”sysfs 属性。读取此属性会显示 vty-server 适配器的当前连接状态。零表示 vty-server 未连接到 vty。一表示连接处于活动状态。

仅当 vterm_state 之前读取为“1”时,将“0”(零)写入 vterm_state 属性才会断开 vty-server 和目标 vty 之间的 VTERM 连接。如果 vterm_state 读取为“0”,或者将除“0”之外的任何值写入 vterm_state 属性,则写入指令将被忽略。以下示例将显示用于验证 vty-server 连接状态并断开 vty-server 连接的方法

Pow5:/sys/bus/vio/drivers/hvcs/30000004 # cat vterm_state
1

Pow5:/sys/bus/vio/drivers/hvcs/30000004 # echo 0 > vterm_state

Pow5:/sys/bus/vio/drivers/hvcs/30000004 # cat vterm_state
0

当热插拔移除设备以及移除模块时,所有 vty-server 连接都会自动终止。

7. 配置

每个 vty-server 在 /sys/devices/vio 目录中都有一个 sysfs 条目,该条目在其他几个 sysfs 树目录中被符号链接,尤其是在 hvcs 驱动程序条目下,如下例所示

Pow5:/sys/bus/vio/drivers/hvcs # ls
.  ..  30000003  30000004  rescan

按照设计,固件会通知 hvcs 驱动程序 vty-server 的生命周期和合作伙伴 vty 的移除,但不通知合作伙伴 vty 的添加。由于 HMC 超级管理员可以动态添加合作伙伴信息,我们为 hvcs 驱动程序 sysfs 目录提供了“rescan”更新属性,该属性将查询固件并更新此驱动程序管理的所有 vty-server 的合作伙伴信息。将“1”写入该属性会触发更新。下面是一个明确的示例

Pow5:/sys/bus/vio/drivers/hvcs # echo 1 > rescan

读取该属性将指示状态为“1”或“0”。一表示正在进行更新。零表示更新已完成或从未执行过。

此目录中的 Vty-server 条目是由固件创建的 32 位分区唯一单元地址。一个示例 vty-server sysfs 条目如下所示

Pow5:/sys/bus/vio/drivers/hvcs/30000004 # ls
.   current_vty   devspec       name          partner_vtys
..  index         partner_clcs  vterm_state

默认情况下,每个条目都提供了一个“name”属性。读取“name”属性将显示设备类型,如下例所示

Pow5:/sys/bus/vio/drivers/hvcs/30000003 # cat name
vty-server

默认情况下,每个条目还提供了一个“devspec”属性,该属性在读取时显示完整的设备规范,如下例所示

Pow5:/sys/bus/vio/drivers/hvcs/30000004 # cat devspec
/vdevice/vty-server@30000004

每个 vty-server sysfs 目录都提供了两个只读属性,这些属性提供了易于解析的合作伙伴 vty 数据列表:“partner_vtys”和“partner_clcs”

Pow5:/sys/bus/vio/drivers/hvcs/30000004 # cat partner_vtys
30000000
30000001
30000002
30000000
30000000

Pow5:/sys/bus/vio/drivers/hvcs/30000004 # cat partner_clcs
U5112.428.103048A-V3-C0
U5112.428.103048A-V3-C2
U5112.428.103048A-V3-C3
U5112.428.103048A-V4-C0
U5112.428.103048A-V5-C0

读取 partner_vtys 会返回一个合作伙伴 vty 列表。Vty 单元地址编号仅是按分区唯一的,因此条目会频繁重复。

读取 partner_clcs 会返回一个“聚合位置代码”列表,这些代码由系统序列号和“-V*”组成,其中“*”是目标分区号,以及“-C*”,其中“*”是适配器的插槽。第一个 vty 合作伙伴对应于第一个 clc 项,第二个 vty 合作伙伴对应于第二个 clc 项,依此类推。

一个 vty-server 一次只能连接到一个 vty。读取条目“current_vty”会打印当前选定的合作伙伴 vty 的 clc。

可以通过将有效的合作伙伴 clc 写入该条目来更改 current_vty,如下例所示

Pow5:/sys/bus/vio/drivers/hvcs/30000004 # echo U5112.428.10304
8A-V4-C0 > current_vty

当 vty-server 已经连接到 vty 时更改 current_vty 不会影响当前连接。更改在当前打开的连接被释放时生效。

有关“vterm_state”属性的信息已在前面题为“断开连接”的章节中介绍。

8. 问答:

问:hvcs 涉及哪些安全问题?

答:主要有三个安全问题

1. /dev/hvcs* 节点的创建者有能力限制设备条目对某些用户或组的访问。最好创建一个特殊的 hvcs 组权限,以提供对系统控制台的访问。

2. 为了在抓取控制台时提供网络安全,建议用户使用安全方法(例如 SSH)连接到控制台托管分区,或者坐在硬件控制台上。

3. 完成控制台操作后,请务必退出用户会话,否则下一个 vty-server 连接(可能来自另一个分区)将体验先前登录的会话。


问:如何多路复用我通过 hvcs 抓取的控制台,以便其他人可以看到它

答:您可以使用“screen”直接连接到 /dev/hvcs* 设备,并在您的计算机上使用控制台组权限设置会话。正如前面指出的,默认情况下,screen 不会为大多数终端仿真器提供 termcap 设置,以便从终端类型“screen”到其他类型进行充分的字符转换。这意味着基于 curses 的程序可能无法在 screen 会话中正确显示。


问:为什么颜色都乱了?问:为什么控制字符行为异常或不起作用?问:为什么控制台输出都异常且难以理解?

答:请参阅前面有关“连接”的部分,了解应用程序如何影响字符控制序列的显示。此外,仅仅因为您使用 xterm 登录控制台并不意味着其他人没有在使用 HMC 控制台 (vt320) 之前登录控制台并保持会话登录状态。最好的做法是在获取控制台时将 TERM 导出到终端仿真器的终端类型。此外,请确保在断开与控制台的连接之前“退出”控制台。这将确保下一个用户在登录时获得他们自己的 TERM 类型设置。


问:当我尝试将 kermit 连接到 hvcs 设备时,我得到:“抱歉,无法打开连接:/dev/hvcs*”发生了什么?

答:其他一些 Power5 控制台机制已连接到 vty,并且没有放弃它。您可以尝试通过右键单击分区并选择“关闭终端”来强制断开 HMC 中的控制台连接。否则,您必须找出具有控制台权限的人员。您可能已经使用另一个 kermit 会话打开了控制台,只是忘记了它。请查看 Power5 系统的控制台选项,以确定可以保持系统控制台的多种方式。

答:另一个用户可能当前没有连接到 /dev/hvcs 设备的连接方法,但 vterm_state 可能会显示他们仍然建立了 vty-server 连接。他们需要使用“断开连接”部分中概述的方法来释放此连接,以便其他人可以连接到目标 vty。

答:您用于执行 kermit 的用户配置文件可能没有使用 /dev/hvcs* 设备的权限。

答:您可能尚未插入 hvcs.ko 模块,但 /dev/hvcs* 条目仍然存在(在没有 udev 的系统上)。

答:没有对应的 vty-server 设备映射到现有的 /dev/hvcs* 条目。


问:当我尝试将 kermit 连接到 hvcs 设备时,我得到:“抱歉,拒绝写入 UUCP 锁文件目录的权限。”

答:您指定的 /dev/hvcs* 条目不存在于您所说的地方?也许您尚未插入模块(在具有 udev 的系统上)。


问:如果我已经安装了一个 Linux 分区,我是否可以在所述分区上使用 hvcs 来为第二个 Linux 分区的安装提供控制台?

答:是的,前提是您使用 kermit 或 cu 或其他不提供终端仿真的程序连接到 /dev/hvcs* 设备。


问:我可以使用此驱动程序一次连接到多个分区的控制台吗?

答:可以。当然,这意味着必须为此分区配置多个 vty-server,并且每个 vty-server 都必须指向已断开连接的 vty。


问:hvcs 驱动程序是否支持动态(热插拔)添加设备?

答:是的,如果您的系统已启用 dlpar 和热插拔,并且已内置到内核中,则 hvcs 驱动程序配置为动态处理新设备的添加和未使用设备的移除。


问:由于某种原因,重新启动后,/dev/hvcs* 未映射到相同的 vty-server 适配器。发生了什么?

答:/dev/hvcs* 条目的 vty-server 适配器分配始终按照适配器暴露的顺序进行。由于此驱动程序的热插拔功能,热插拔添加的 vty-server 的分配顺序可能与模块加载时暴露的顺序不同。在动态添加后重新启动或重新加载模块可能会导致 /dev/hvcs* 和 vty-server 耦合发生变化,如果在两个其他 vty-server 适配器之间的插槽中添加了 vty-server 适配器。请参阅上面有关如何确定哪个 vty-server 与哪个 /dev/hvcs* 节点匹配的部分。提示:查看 vty-server 的 sysfs“index”属性。


问:我可以使用 /dev/hvcs* 作为另一个分区的管道,并使用该分区上的 tty 设备作为管道的另一端吗?

答:是的,在 Power5 平台上,hvc_console 驱动程序为额外的 /dev/hvc* 设备提供 tty 接口(其中 /dev/hvc0 很可能是控制台)。为了使两个分区之间的 tty 管道正常工作,HMC 超级管理员必须使用 HMC gui 为目标分区创建一个额外的“串行服务器”,该服务器将在目标分区重新启动时显示为 /dev/hvc*。

然后,HMC 超级管理员为当前分区创建一个额外的“串行客户端”,并将此客户端指向目标分区新创建的“串行服务器”适配器(记住插槽)。这将显示为额外的 /dev/hvcs* 设备。

现在,可以将目标系统上的程序配置为读取或写入 /dev/hvc*,并且可以将当前分区上的另一个程序配置为读取或写入 /dev/hvcs*。现在,您有两个分区之间的 tty 管道。


9. 报告错误:

报告错误的首选渠道是通过提供您操作系统的 Linux 发行版公司,或者将问题发布到 PowerPC 开发邮件列表,地址为:

linuxppc-dev@lists.ozlabs.org

此请求旨在提供一个有记录且可搜索的公开交流平台,以便所有用户都能从中受益,了解有关此驱动程序的问题和解决方案。