HVCS IBM “Hypervisor Virtual Console Server” 安装指南¶
适用于 Linux Kernel 2.6.4+
版权 (C) 2004 IBM Corporation
作者: Ryan S. Arnold <rsa@us.ibm.com>
创建日期: 2004 年 3 月 2 日 最后修改: 2004 年 8 月 24 日
1. 驱动程序介绍:¶
这是 IBM Hypervisor Virtual Console Server, “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 的索引属性显示如下
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-server 在将数据输出到 vty 后立即从 vty 断开连接时,vty 适配器可能没有足够的时间在收到数据中断和连接断开之间从固件获取数据,然后固件禁用该获取。
当 hvcs 用于服务控制台时,此行为不是一个大问题,因为适配器在几乎所有数据写入后都会保持连接很长时间。 当 hvcs 用作 tty 管道在两个分区之间隧道传输数据时 [请参见下面的问答] 这是一个巨大的问题,因为当 cat'ing 或 dd'ing 数据到设备时,标准的 Linux 行为是打开 tty,发送数据,然后关闭 tty。 如果此驱动程序在 tty 关闭时手动终止 vty-server 连接,则这会在目标 vty 有机会获取数据之前关闭 vty-server 和 vty 连接。
此外,仅在模块删除或适配器删除时断开 vty-server 和 vty 的连接是不切实际的,因为其他分区中的其他 vty-server 可能随时需要使用目标 vty。
由于此行为限制,从连接的 vty 断开 vty-server 是一个手动过程,需要写入下面概述的 sysfs 属性,另一方面,此驱动程序会自动建立到 vty 的初始 vty-server 连接。 永远不需要手动 vty-server 连接。
为了终止 vty-server 和 vty 之间的连接,使用了每个 vty-server 的 sysfs 条目中的“vterm_state”sysfs 属性。 读取此属性会显示 vty-server 适配器的当前连接状态。 零表示 vty-server 未连接到 vty。 一表示连接处于活动状态。
将“0”(零)写入 vterm_state 属性将仅在 vterm_state 之前读取为“1”时断开 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 dir 都提供两个只读属性,这些属性提供易于解析的伙伴 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 设置,以提供从 term 类型“screen”到其他类型的充分字符转换。 这意味着基于 curses 的程序可能无法在 screen 会话中正确显示。
问: 为什么颜色都搞砸了? 问: 为什么控制字符的行为很奇怪或不起作用? 问: 为什么控制台输出都很奇怪且难以理解?
答: 请参阅前面的“连接”部分,以了解应用程序如何影响字符控制序列的显示。 此外,仅仅因为您使用 xterm 登录到控制台并不意味着其他人没有在您之前使用 HMC 控制台 (vt320) 登录到控制台并离开登录的会话。 最好的方法是在您获得控制台时将 TERM 导出到您的终端仿真器的终端类型。 此外,请确保在断开与控制台的连接之前“exit”退出控制台。 这将确保下一个用户在登录时获得他们自己的 TERM 类型设置。
问: 当我尝试将 kermit 连接到 hvcs 设备时,我得到:“Sorry, can't open connection: /dev/hvcs*”发生了什么事?
答: 某些其他 Power5 控制台机制已连接到 vty,并且不放弃它。 您可以尝试通过右键单击分区然后选择“关闭终端”来强制从 HMC 断开控制台。 否则,您必须找出拥有控制台权限的人员。 您可能已经使用另一个 kermit 会话打开了控制台,只是忘记了它。 请查看 Power5 系统的控制台选项,以确定可以保持系统控制台的多种方式。
或者
答: 另一个用户可能当前没有连接到 /dev/hvcs 设备的连接方法,但 vterm_state 可能会显示他们仍然建立了 vty-server 连接。 他们需要使用“断开连接”部分中概述的方法来释放此连接,以便其他人可以连接到目标 vty。
或者
答: 您用于执行 kermit 的用户配置文件可能没有使用 /dev/hvcs* 设备的权限。
或者
答: 您可能尚未插入 hvcs.ko 模块,但 /dev/hvcs* 条目仍然存在(在没有 udev 的系统上)。
或者
答: 没有映射到现有 /dev/hvcs* 条目的相应 vty-server 设备。
问: 当我尝试将 kermit 连接到 hvcs 设备时,我得到:“Sorry, write access to UUCP lockfile directory denied.”
答: 您指定的 /dev/hvcs* 条目不存在于您所说的位置? 也许您尚未插入模块(在具有 udev 的系统上)。
问: 如果我已经安装了一个 Linux 分区,我可以使用该分区上的 hvcs 来为第二个 Linux 分区的安装提供控制台吗?
答: 是的,前提是您使用 kermit 或 cu 或某些不提供终端仿真的其他程序连接到 /dev/hvcs* 设备。
问: 我可以使用此驱动程序一次连接到多个分区的控制台吗?
答: 是的。 当然,这意味着必须为此分区配置多个 vty-server,并且每个 vty-server 必须指向一个断开连接的 vty。
问: hvcs 驱动程序是否支持设备的动态(热插拔)添加?
答: 是的,如果您的系统启用了 dlpar 和热插拔,并且已将其构建到内核中,则 hvcs 驱动程序配置为动态处理新设备的添加和未使用设备的删除。
问: 由于某种原因,/dev/hvcs* 在重新启动后没有映射到相同的 vty-server 适配器。 发生了什么事?
答: 始终按照暴露适配器的顺序完成将 vty-server 适配器分配给 /dev/hvcs* 条目。 由于此驱动程序的热插拔功能,热插拔添加的 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 OS 发行公司,或者通过将问题发布到 PowerPC 开发邮件列表中,网址为
此请求旨在提供关于此驱动程序的问题和解决方案的记录和可搜索的公开交流,以造福所有用户。