Por que o Alt + SysRq + B nem sempre dispara enquanto o REISU faz?

5

Em muitas máquinas diferentes, quando me deparo com um lockup, geralmente uso Alt + SysRq + REISUB para reinicializar sem grandes perdas. Mas muitas vezes eu notei que, embora os comandos REISU funcionem mesmo quando eu apenas mantenho Alt + SysRq e os insiro sem liberar Alt + SysRq , o último, B , parece ser muito "preguiçoso": tenho que repeti-lo muitas vezes, e na verdade ele não é acionado até que eu faça o ciclo "press Alt + SysRq , tipo B, libera Alt + SysRq "várias vezes (e nem sempre o mesmo número de vezes).

Em primeiras ocorrências deste problema eu pensei que é o kernel que bloqueou muito que não "vê" meu comando B , mas quando eu percebi que várias repetições dele me permitiam acionar a reinicialização, agora parece que é algo geral. Mesmo em um sistema de trabalho (seja Debian, Ubuntu, LFS etc.), eu posso facilmente reproduzir isso. Na verdade, posso até carregar o kernel com init=/bin/bash e reproduzir isso a partir desse prompt bash.

Olhando a saída do console serial, vejo todos os comentários sobre REISU , mas apenas um feedback imprime em vários comandos B - quando o kernel finalmente está convencido a fazer uma reinicialização.

Por que isso? É algum recurso do kernel que impede a reinicialização não intencional, ou talvez seja apenas um bug (um estranho)?

Note que estou usando um teclado simples sem Fn ou teclas multimídia, então essa questão não é uma duplicata de este .

    
por Ruslan 11.07.2014 / 10:19

1 resposta

6

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 dreamstime.com )

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

    
por 11.07.2014 / 12:16