在许多不同的机器上,当我遇到死机时,我经常使用Alt++来重新启动SysRq,REISUB
而不会造成太大损失。但我经常注意到,虽然REISU
命令即使我只按住Alt+SysRq并输入它们而不释放Alt+也能工作SysRq,但最后一个 ,B
似乎非常“懒”:我必须重复很多次,事实上它不会触发直到我多次循环“按Alt+ SysRq,输入B,释放Alt+ SysRq”(并且并不总是相同的次数)。
第一次出现这个问题时,我以为是内核锁定得太紧,以至于它无法“看到”我的B
命令,但是当我意识到多次重复它确实允许我触发重新启动时,现在看来这是普遍现象。即使在工作系统上(无论是 Debian、Ubuntu、LFS 等),我也可以轻松地重现这一点。事实上,我什至可以加载内核init=/bin/bash
并从这个 bash 提示符中重现这一点。
查看串行控制台输出,我看到 上的所有反馈REISU
,但只有一个关于多个命令的反馈打印B
— 当内核最终确信要重新启动时。
为什么是这样?是否有某种内核功能可以防止意外重置,或者它只是一个错误(非常奇怪)?
请注意,我使用的是没有Fn多媒体键的普通键盘,所以这个问题不是重复的这个。
答案1
问题不在于软件,而在于硬件。键盘按键不是独立的:大约有 100 个按键,但只有大约 26 根电线进入键盘的内部控制器:
(图片来自梦想时光网)
这意味着同时按下时并非所有按键都能被检测到。因为比RAlt更接近,所以我总是用它来释放一只手来输入字符。但似乎在大多数(所有?)PC 键盘上++不发送扫描码!*SysRqLAltRAltSysRqBB
为什么我最终会重启?很简单:当我对无法使用这个半工作命令重新启动机器感到非常恼火时,我会在没有太多注意的情况下多次按下组合键,有时会混合按下和释放按键 - 看起来并不是SysRq这样linux 的一个正常修饰符,例如Alt: magic-SysRq 模式即使在我释放后仍然处于活动状态SysRq,但仍然保持Alt。那么似乎有效的顺序是:
- 按RAlt
- 按SysRq
- 发布SysRq
- 按B
- 查看重新启动
因为LAlt事情看起来更简单:键盘能够检测B何时按住LAlt+ SysRq,所以没有问题,但我以前从未注意到它,因为我总是使用RAlt。
有趣的是,这个问题似乎早已为人所知,并且解决方法与我凭经验发现的方法相同。从内核源码树来看,文档/sysrq.txt(强调我的):
在 x86 上 - 按组合键“ALT-SysRq-<命令键>”。注意 - 某些键盘可能没有标有“SysRq”的键。 “SysRq”键也称为“Print Screen”键。另外,有些键盘无法处理同时按下这么多键,因此您可能会更好地使用“按 Alt”、“按 SysRq”、“释放 SysRq”、“按 <命令键>”、释放所有键。
所以,看起来这个技巧是官方推荐的,而不是实施的不可靠的副作用。
*我实际上已经用一个简单的 DOS 程序检查了这一点,该程序报告每个扫描代码i8042在每个 IRQ1 上给出