在联想 t440p 上的 Ubuntu 15.10 和 15.04 上,当我在 Netbeans 中编写代码时,不小心点击了按钮AltGr,PrtSc同时系统崩溃并重启。对于新安装的 Ubuntu,这不起作用。
这是来自系统日志的回溯:
Feb 5 19:47:43 mycomputername kernel: [ 15.485327] sysrq: SysRq : HELP : loglevel(0-9) reboot(b) crash(c) terminate-all-tasks(e) memory-full-oom-kill(f) kill-all-tasks(i) thaw-filesystems(j) sak(k) show-backtrace-all-active-cpus(l) show-memory-usage(m) nice-all-RT-tasks(n) poweroff(o) show-registers(p) show-all-timers(q) unraw(r) sync(s) show-task-states(t) unmount(u) force-fb(V) show-blocked-tasks(w) dump-ftrace-buffer(z)
Feb 5 19:47:44 mycomputername kernel: [ 16.966879] sysrq: SysRq : HELP : loglevel(0-9) reboot(b) crash(c) terminate-all-tasks(e) memory-full-oom-kill(f) kill-all-tasks(i) thaw-filesystems(j) sak(k) show-backtrace-all-active-cpus(l) show-memory-usage(m) nice-all-RT-tasks(n) poweroff(o) show-registers(p) show-all-timers(q) unraw(r) sync(s) show-task-states(t) unmount(u) force-fb(V) show-blocked-tasks(w) dump-ftrace-buffer(z)
Feb 5 19:47:44 mycomputername kernel: [ 17.115697] sysrq: SysRq : HELP : loglevel(0-9) reboot(b) crash(c) terminate-all-tasks(e) memory-full-oom-kill(f) kill-all-tasks(i) thaw-filesystems(j) sak(k) show-backtrace-all-active-cpus(l) show-memory-usage(m) nice-all-RT-tasks(n) poweroff(o) show-registers(p) show-all-timers(q) unraw(r) sync(s) show-task-states(t) unmount(u) force-fb(V) show-blocked-tasks(w) dump-ftrace-buffer(z)
Feb 5 19:47:44 mycomputername kernel: [ 17.115844] sysrq: SysRq : HELP : loglevel(0-9) reboot(b) crash(c) terminate-all-tasks(e) memory-full-oom-kill(f) kill-all-tasks(i) thaw-filesystems(j) sak(k) show-backtrace-all-active-cpus(l) show-memory-usage(m) nice-all-RT-tasks(n) poweroff(o) show-registers(p) show-all-timers(q) unraw(r) sync(s) show-task-states(t) unmount(u) force-fb(V) show-blocked-tasks(w) dump-ftrace-buffer(z)
Feb 5 19:47:45 mycomputername kernel: [ 17.644247] sysrq: SysRq : HELP : loglevel(0-9) reboot(b) crash(c) terminate-all-tasks(e) memory-full-oom-kill(f) kill-all-tasks(i) thaw-filesystems(j) sak(k) show-backtrace-all-active-cpus(l) show-memory-usage(m) nice-all-RT-tasks(n) poweroff(o) show-registers(p) show-all-timers(q) unraw(r) sync(s) show-task-states(t) unmount(u) force-fb(V) show-blocked-tasks(w) dump-ftrace-buffer(z)
Feb 5 19:47:45 mycomputername kernel: [ 17.829425] sysrq: SysRq : HELP : loglevel(0-9) reboot(b) crash(c) terminate-all-tasks(e) memory-full-oom-kill(f) kill-all-tasks(i) thaw-filesystems(j) sak(k) show-backtrace-all-active-cpus(l) show-memory-usage(m) nice-all-RT-tasks(n) poweroff(o) show-registers(p) show-all-timers(q) unraw(r) sync(s) show-task-states(t) unmount(u) force-fb(V) show-blocked-tasks(w) dump-ftrace-buffer(z)
Feb 5 19:47:46 mycomputername kernel: [ 18.698713] sysrq: SysRq : HELP : loglevel(0-9) reboot(b) crash(c) terminate-all-tasks(e) memory-full-oom-kill(f) kill-all-tasks(i) thaw-filesystems(j) sak(k) show-backtrace-all-active-cpus(l) show-memory-usage(m) nice-all-RT-tasks(n) poweroff(o) show-registers(p) show-all-timers(q) unraw(r) sync(s) show-task-states(t) unmount(u) force-fb(V) show-blocked-tasks(w) dump-ftrace-buffer(z)
Feb 5 19:47:47 mycomputername kernel: [ 20.033534] sysrq: SysRq : HELP : loglevel(0-9) reboot(b) crash(c) terminate-all-tasks(e) memory-full-oom-kill(f) kill-all-tasks(i) thaw-filesystems(j) sak(k) show-backtrace-all-active-cpus(l) show-memory-usage(m) nice-all-RT-tasks(n) poweroff(o) show-registers(p) show-all-timers(q) unraw(r) sync(s) show-task-states(t) unmount(u) force-fb(V) show-blocked-tasks(w) dump-ftrace-buffer(z)
Feb 5 19:47:48 mycomputername kernel: [ 21.061323] sysrq: SysRq : HELP : loglevel(0-9) reboot(b) crash(c) terminate-all-tasks(e) memory-full-oom-kill(f) kill-all-tasks(i) thaw-filesystems(j) sak(k) show-backtrace-all-active-cpus(l) show-memory-usage(m) nice-all-RT-tasks(n) poweroff(o) show-registers(p) show-all-timers(q) unraw(r) sync(s) show-task-states(t) unmount(u) force-fb(V) show-blocked-tasks(w) dump-ftrace-buffer(z)
我该如何禁用 PrtSc 或防止意外点击联想键盘上的 PrintScreen?或者这个回溯有什么问题?
谢谢
答案1
问题:
在您的键盘上,Print Screen (PrtSc)和System Request (SysRq)位于同一个物理按钮上,就像我所知道的大多数布局一样。
组合键Alt+ SysRq+[SPECIFIC LETTER]通常称为神奇的 SysRq 命令它直接向内核发送命令。
它们主要用作系统完全崩溃时冷重置的更安全替代方案,因为例如有命令可以同步和卸载文件系统以防止损坏和数据损坏以及重置/重新启动(如果按下B第三个键)或关闭电源(第三个键O)。更多信息和完整的组合列表,甚至关于不同的键盘布局,可以在相应的维基百科文章中找到魔法 SysRq 键。
因此,您无意中做的就是直接向内核发送重新启动的命令,而这正是它所做的。
解决方案:
取决于你的内核是如何编译的但是,您可以指定系统运行时内核应监听哪些 SysRq 命令。我刚刚在 15.10 内核上测试了此功能,4.2.0-27-generic
并且它有效,但如果能了解此功能从何时或为哪些内核启用,那就太好了。如果您知道,请发表评论。
找出当前SysRq命令过滤器的值:
我们可以SysRq通过检查虚拟文件的内容来了解当前启用了哪些命令
/proc/sys/kernel/sysrq
:cat /proc/sys/kernel/sysrq
结果将是一个必须按如下方式解释的数字:
0 - disable SysRq 1 - enable SysRq completely >1 - bitmask of enabled SysRq functions: 2 - control of console logging level 4 - control of keyboard (SAK, unraw) 8 - debugging dumps of processes etc. 16 - sync command 32 - remount read-only 64 - signalling of processes (term, kill, oom-kill) 128 - reboot/poweroff 256 - nicing of all RT tasks
我在桌面时的默认值是
176
,即128+32+16
。因此,根据上表,我可以重新启动、关闭电源、同步并将文件系统重新挂载为只读。禁用所有SysRq命令:
执行以下命令并尝试快捷方式是否仍然SysRq有效(例如Alt++重置/重启):SysRqB
echo 0 | sudo tee /proc/sys/kernel/sysrq
这将禁用SysRq当前会话的所有命令,直到下次重新启动。
启用所有SysRq命令:
手动全部启用 SysRq命令,我们将值写入
1
同一个虚拟文件:echo 1 | sudo tee /proc/sys/kernel/sysrq
启用以前的默认SysRq命令过滤器:
您可以通过重新启动来恢复默认配置,或者如果您在调整之前检查并记住了该值,则可以再次设置该值而不是
0
/1
来启用/禁用所有命令。因此,在我的例子中,原始值为
176
,我会运行:echo 176 | sudo tee /proc/sys/kernel/sysrq