嵌套的 RDP 和 VMWare 和 ILO 控制台会话:按键重复和延迟

嵌套的 RDP 和 VMWare 和 ILO 控制台会话:按键重复和延迟

我正在完全通过 ILO 进行远程服务器安装(但这也适用于 IPMI 和 VMWare 控制台会话)。由于软件应用程序和环境,我的访问仅限于我必须通过 RDP 访问的 Windows 服务器。从该系统到目标服务器是通过 HP ILO2 或 ILO3 完成的。

我正在尝试在无法使用全自动部署系统的环境中运行 CentOS 安装。我通过文本模式执行此操作,但按键会随机重复,很难选择正确的安装选项。例如:

ks=http://all.yourbase.org/kickstart/ks.cfg

最终看起来像:

ks====httttttp://allll..yourbaseee.....org/kicksstart/ks.cccfg

我使用 Microsoft 的 RDP 客户端(在 Mac 和 Windows 上)执行此操作。我以前在运行安装或在嵌套会话中执行远程工作时也注意到了这一点。

在此处输入图片描述

有一个很好的解决办法吗,或者它仅仅是协议的一个功能?

答案1

而 SSH 连接传输密钥笔画,HP ILO 连接传输密钥状态每次按下按键时,服务器都会收到单独的 KeyDown 和 KeyUp 事件。如果 KeyUp 事件接收较晚,则会导致重复击键。

KeyUp 事件接收延迟最可能的两个原因是:

  1. 网络拥塞/性能问题。
  2. 启动 ILO 连接的客户端系统性能不佳。如果客户端是虚拟机,底层主机系统是否过载,或者 VM 分配的内存/CPU 资源是否不足?

如果无法解决根本原因:

  1. 可以通过禁用 ILO2 的“按键向上/向下”设置来解决按键重复问题。这将导致 ILO2 传输按键而不是按键状态。不幸的是,此设置已从 ILO3 中删除。
  2. 如果目标操作系统是 Linux,您可以通过将控制台重定向到ttyS0虚拟串行端口 (VSP) 会话(而不是虚拟控制台)来解决此问题。这将消除按键按下/弹起问题,因为串行连接传输的是按键事件,而不是按键按下/弹起事件。
  3. 调整按键重复率和/或完全禁用目标系统上的自动重复功能可能会有所帮助。我承认这可能并不容易实现,具体取决于按键重复问题的严重程度。
  4. 假设您使用 Mac 作为本地工作站,尝试使用 Command-V 将完整命令粘贴到 Mac RDP 客户端中可能是值得的。我不知道这是否是一种可行的解决方法,但它可能会产生有趣的效果。我经常喜欢从 Mac 工作站在远程 Windows 机器上工作,特别是因为本地命令热键组合继续可预测地工作。

参考:

答案2

这看起来只是协议的问题。我通过使用Ericom Blaze作为我所连接的中央服务器的 RDP 传输;例如“跳转箱”。

其他事情:

我正在尝试避免多个嵌套会话。

我在 Mac 上运行带有 Windows 7 的 VMWare Fusion,以便在某些情况下使用 Windows 的本机 RDP。

目前我所能看到的全部就是这些。

答案3

您需要编辑 .vmx 文件以添加以下行:

keyboard.typematicMinDelay = "2000000"

它消除了“反弹”。

对于我的 vmware 版本,我必须在虚拟机关闭时进行此更改。我知道可以从编辑窗口进行更改,但我找不到那个地方。

答案4

首先要记住的是,禁用处理按键的所有设备上的按键重复功能,包括虚拟机或您正在连接的 RDP 会话,以及顶层主机。这并不能修复最终目标机器,但它可以大大改善这种情况。

对于目标机器:

有报道称使用 ssh 连接到 HP iLO 的 SSH 端口可避免密钥重复问题,但我无法使用此方法,因为我的主机 (online.net) 不允许端口 22 通过其 iLO 防火墙。但如果您可以访问 iLO 的 SSH 端口(可能是 22),这似乎是最简单的方法。

我尝试使用 systemd 单元来设置启动时的键盘重复率和延迟时间:

# Note that kbdrate only affects existing keyboards, and HP iLO attaches a new
# USB keyboard when you connect, so you may have to reboot (with the iLO console
# attached) to get the keyboard delay and repeat rate to take effect.

[Unit]
Description=Set longer delay time for key repeat

[Service]
Type=oneshot
RemainAfterExit=yes
StandardInput=tty
StandardOutput=tty
ExecStart=/sbin/kbdrate -d 1000 -r 2

[Install]
WantedBy=multi-user.target
WantedBy=rescue.target

(请确保/sbin/kbdrate位于您有 的位置kbdrate。写信至/etc/systemd/systemd/slower-keyboard-repeat.servicesystemctl daemon-reload && systemctl enable slower-keyboard-repeat.service

但正如评论中提到的,这只是部分成功,因为它需要重新启动才能在 iLO 连接的新键盘上设置重复率。但如果您同意重新启动机器,那就足够了。

最终,我修补了 Linux 内核,以改变所有键盘的默认重复率和延迟时间:

From 78c32f539b89bf385985bea47a7058a540d31da0 Mon Sep 17 00:00:00 2001
From: Ivan Kozik <[email protected]>
Date: Thu, 30 Mar 2017 13:31:17 +0000
Subject: [PATCH] Increase the default keyboard repeat delay from 250ms to
 1000ms and repeat rate from 1000/33 Hz to 1000/500 Hz to avoid unintentional
 repeated keystrokes when using remote consoles such as HP iLO over
 high-latency links.  These consoles (HP iLO included) often transmit key
 states (up/down) instead of keystrokes, making it impossible to even enter a
 password and log in.

Fixing this in the kernel avoids problems with kbdrate where the parameters
passed to kbdrate don't apply to the new keyboards attached by HP iLO.
---
 drivers/input/input.c          | 2 +-
 drivers/input/keyboard/atkbd.c | 4 ++--
 2 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/drivers/input/input.c b/drivers/input/input.c
index 880605959aa6..a195af2d062a 100644
--- a/drivers/input/input.c
+++ b/drivers/input/input.c
@@ -2126,7 +2126,7 @@ int input_register_device(struct input_dev *dev)
     * is handled by the driver itself and we don't do it in input.c.
     */
    if (!dev->rep[REP_DELAY] && !dev->rep[REP_PERIOD])
-       input_enable_softrepeat(dev, 250, 33);
+       input_enable_softrepeat(dev, 1000, 500);

    if (!dev->getkeycode)
        dev->getkeycode = input_default_getkeycode;
diff --git a/drivers/input/keyboard/atkbd.c b/drivers/input/keyboard/atkbd.c
index ec876b5b1382..9dd04c2215b3 100644
--- a/drivers/input/keyboard/atkbd.c
+++ b/drivers/input/keyboard/atkbd.c
@@ -1096,8 +1096,8 @@ static void atkbd_set_device_attrs(struct atkbd *atkbd)
            BIT_MASK(LED_MUTE) | BIT_MASK(LED_MISC);

    if (!atkbd->softrepeat) {
-       input_dev->rep[REP_DELAY] = 250;
-       input_dev->rep[REP_PERIOD] = 33;
+       input_dev->rep[REP_DELAY] = 1000;
+       input_dev->rep[REP_PERIOD] = 500;
    }

    input_dev->mscbit[0] = atkbd->softraw ? BIT_MASK(MSC_SCAN) :
-- 
2.11.0

这为我解决了这个问题。

相关内容