O problema não está no software, está no hardware. As teclas do teclado não são independentes: existem cerca de 100 teclas, mas apenas cerca de 26 fios vão para o controlador interno do teclado:
(Imagemde
Isso significa que nem todas as teclas podem ser detectadas quando pressionadas simultaneamente. Como o RAlt está muito mais próximo do SysRq do que LAlt , eu sempre o uso para liberar uma mão para inserir caracteres. Mas parece que na maioria (todos?) Teclados de computador RAlt + SysRq + B não envia o scancode de B ! *
Por que, então, finalmente recebo a reinicialização? É simples: quando estou muito irritado por não poder reinicializar a máquina com este comando semi-funcional, pressiono o combo muitas vezes sem muita atenção, às vezes misturando prensas e liberações de teclas - e parece que SysRq não é um modificador normal para o linux, como por exemplo Alt é: o modo magic-SysRq está ativo mesmo depois que eu liberei SysRq mas ainda segure Alt . Então a sequência que parece funcionar é:
- Pressione RAlt
- Pressione SysRq
- Liberar SysRq
- Pressione B
- Veja a reinicialização
Para LAlt as coisas parecem muito mais simples: o teclado é capaz de detectar B quando LAlt + SysRq é retido, então não há problema, mas eu nunca percebi isso antes porque eu sempre usei o RAlt .
Engraçadamente, parece que esse problema é conhecido há muito tempo, e a solução alternativa é a mesma que eu descobri empiricamente. Da árvore de fontes do kernel, Documentation / sysrq.txt (grifo meu):
On x86 - You press the key combo 'ALT-SysRq-<command key>'. Note - Some keyboards may not have a key labeled 'SysRq'. The 'SysRq' key is also known as the 'Print Screen' key. Also some keyboards cannot handle so many keys being pressed at the same time, so you might have better luck with "press Alt", "press SysRq", "release SysRq", "press <command key>", release everything.
Então, parece que esse truque é uma recomendação oficial, e não um efeito colateral não confiável da implementação.
* Na verdade, eu verifiquei isso com um simples programa DOS que relata cada código de varredura do i8042 dá em cada IRQ1