Ambiente de desenvolvimento - o uso da chave mágica (sysRq)

Links relacionados ao SysRq (escritos em detalhes):
   https://www.ibm.com/developerworks/cn/linux/l-cn-sysrq/

 

O que é SysRq?

    Você encontrou uma situação em que o servidor não consegue fazer login via SSH, nem consegue fazer login através de um terminal local (tty)?
    Nesse caso, você fez alguma coisa além de pressionar o botão liga / desliga ou reiniciar?
    Você já pensou que é possível se recuperar dessa situação?
    Você já pensou em coletar mais informações para localizar a causa do travamento do sistema?
        --A situação acima pode ser chamada de "travamento do sistema interrompível".
    Em outras palavras, o sistema parou de responder à maioria dos serviços normais por algum motivo, mas o sistema ainda pode responder à solicitação de interrupção de tecla do teclado (que na verdade deveria ser uma interrupção de porta serial).
    
    Sysrq é chamado de "combinação mágica de teclas" e é uma ferramenta de depuração embutida no kernel do Linux. Você pode pressioná-lo e o kernel responderá.
    É definido como uma série de combinações de teclas. É chamado de "mágica" porque pode completar uma série de operações predefinidas do sistema por meio de combinações de teclas quando o sistema trava e a maioria dos serviços não está mais respondendo.
    Contanto que o kernel não esteja completamente travado, não importa o que o kernel esteja fazendo, você pode usar essas combinações de teclas para coletar informações de operação do sistema, incluindo uso de memória do sistema, processamento de tarefas da CPU e status de execução do processo.
    Por meio dele, não só pode reiniciar um servidor suspenso enquanto garante a segurança dos dados do disco, evita a perda de dados e verificação do sistema de arquivos de longo prazo após a reinicialização,
    mas também coleta o uso da memória do sistema, processamento de tarefas da CPU, status de execução do processo, etc. As informações de operação do sistema podem até restaurar um servidor que parou de responder sem reiniciar.

 

Como iniciar o SysRq?

    É necessário configurar "CONFIG_MAGIC_SYSRQ" no "make menuconfig" do
    kernel. Depois de executar o kernel SysRq compilado, você pode controlar quais funções têm permissão para chamar a chave SysRq em "/ proc / sys / kernel / sysrq".
    A seguir está uma lista de valores possíveis para "/ proc / sys / kernel / sysrq" (o texto original está em Linux.xx / Documentation / sysrq.txt):

    Here is the list of possible values in /proc/sys/kernel/sysrq:
    0 - disable sysrq completely
    1 - enable all functions of sysrq
    >1 - bitmask of allowed sysrq functions (see below for detailed function description):
          2 =   0x2 - enable control of console logging level
          4 =   0x4 - enable control of keyboard (SAK, unraw)
          8 =   0x8 - enable debugging dumps of processes etc.
         16 =  0x10 - enable sync command
         32 =  0x20 - enable remount read-only
         64 =  0x40 - enable signalling of processes (term, kill, oom-kill)
        128 =  0x80 - allow reboot/poweroff
        256 = 0x100 - allow nicing of all RT tasks

    Você pode definir o valor no arquivo SysRq com o seguinte comando:

        echo "number" >/proc/sys/kernel/sysrq

    Se você precisar habilitar ou desabilitar permanentemente SysRqs, você pode defini-lo em /etc/sysctl.conf:

        kernel.sysrq = 1 (启用SsyRq)
        kernel.sysrq = 0 (禁用SysRq)

    kernel.sysrq também pode aceitar parâmetros de ativação diferentes de 0 e 1. Para obter detalhes, consulte a documentação do kernel sysrq.

 

Como usar o SysRq?

    O método de usar SysRq é diferente em plataformas diferentes. O texto original é o seguinte:


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.

On SPARC - You press 'ALT-STOP-<command key>', I believe.

On the serial console (PC style standard serial ports only) -
           You send a BREAK, then within 5 seconds a command key. Sending
           BREAK twice is interpreted as a normal BREAK.

On PowerPC - Press 'ALT - Print Screen (or F13) - <command key>,
             Print Screen (or F13) - <command key> may suffice.

On other - If you know of the key combos for other architectures, please
           let me know so I can add them to this section.

On all -  write a character to /proc/sysrq-trigger.  e.g.:

        echo t > /proc/sysrq-trigger

 

depuração de nó sysrq-trigger

    Habilite a opção CONFIG_MAGIC_SYSRQ nas opções de configuração do kernel, de modo que após o sistema iniciar, um nó / proc / sysrq-trigger seja gerado para depuração.
    Observe que definir o valor de "/ proc / sys / kernel / sysrq" afeta apenas as chamadas por meio do teclado.
    O nó "/ proc / sysrq-trigger" pode chamar qualquer operação (usuário com privilégios administrativos)
    parte da função:

        echo m > /proc/sysrq-trigger 导出内存分配信息
        echo t > /proc/sysrq-trigger 导出当前任务状态信息
        echo p > /proc/sysrq-trigger 导出当前CPU寄存器和标志位信息
        echo c > /proc/sysrq-trigger 产生空指针panic事件,人为导致系统崩溃
        echo s > /proc/sysrq-trigger 即时同步所有挂载的文件系统
        echo u > /proc/sysrq-trigger 即时重新挂载所有的文件系统为只读
        echo w > /proc/sysrq-trigger 转储处于uninterruptable阻塞状态的任务

 

Quais são os "comandos" para teclas mágicas?

    As teclas mágicas usam ajuda:

    0-9 设定终端输出的内核 log 优先级
    b 立即重启系统
    c 内核live reboot,并输出错误信息
    d 显示所有排它锁(显示所有被持有的锁)
    e 向除 init 外进程发送 SIGTERM 信号,让其自行结束
    f 人为触发 OOM Killer (out of memory)
    g 当进入内核模式时,以 framebuttter 代替输出(kgdb(内核调试器)使用)
    h 输出帮助
    i 向除 init 以外所有进程发送 SIGKILL 信号,强制结束进程
    k 安全访问密钥(SAK)杀死当前虚拟控制台上的所有程序
    l 显示所有活动cpu的堆栈回溯。
    m 内存使用信息(将当前内存信息转储到您的控制台。)
    n 重置所有进程的 nice(优先级)
    o 关机
    p 输出cpu 寄存器信息
    q Display all active high-resolution timers and clock sources.
    r 把键盘设置为 ASCII 模式,使按键可以穿透 x server 捕捉传递给内核
    s 同步缓冲区数据到硬盘
    t 输出进程列表(将当前任务及其信息的列表转储到您的控制台。)
    u 重新挂载所有文件系统为只读模式
    v 输出 Voyager SMP 处理信息
    w 输出 block(d状态)进程列表

 

O que podemos fazer com SysRq?

    1. "k" - (chave de acesso seguro) é muito útil, quando você deseja garantir que nenhum programa cavalo de Tróia esteja sendo executado no console, esperando por uma oportunidade para obter sua senha

        Quando você tenta fazer o login. Ele irá matar todos os programas em um determinado console,
        então você pode ter certeza de que o prompt de login que você vê é, na verdade, do init, não de um Trojan.
    2. "b" -Reiniciar quando o sistema não pode ser desligado (b) está bom. Mas você também deve sincronizar (s) e umount (u) primeiro.
    3. "s" -Sincronização (ões) é ótima, quando seu sistema está bloqueado, permite que você sincronize seu disco, o que obviamente irá reduzir a chance de perda de dados e fscking.
        Observe que a sincronização não ocorrerá até que "OK" e "Concluído" apareçam na tela. (Se o kernel estiver realmente em conflito, você pode nunca obter a mensagem OK ou Concluído ...)
    4. "u" -Unmount (u) é basicamente tão útil quanto sync (s). Eu normalmente sincronizo (s), desmonto (u) e reinicio (b) quando meu sistema trava.
        Isso me economiza muitas operações. Da mesma forma, antes de ver as mensagens "OK" e "Concluído" aparecerem na tela, a desmontagem (remontagem somente leitura) não ocorreu.
    5. "0-9" -Log levels "0" - "9" são muito úteis quando o console está inundado com mensagens indesejáveis ​​do kernel.
        Escolher "0" impedirá que todas as mensagens, exceto as mensagens mais urgentes do kernel, cheguem ao seu console.
        (No entanto, se syslod / klogd estiver ativo, eles ainda serão registrados.)
    6. "e", "i" -term (e) e kill (i) são úteis se você tiver algum tipo de processo descontrolado ,
        Você não pode usar nenhum outro método para eliminá-lo, especialmente quando ele gera outros processos.
    7. "m" -Informações de memória (m) são muito úteis quando o sistema está travado e você deseja verificar o uso atual da memória do sistema.
    8. "t" -Lista de processos (t) pode imprimir todas as tarefas atuais e suas informações. Usado para encontrar alguns processos anormais.
    9. O registro da CPU-p "(p) também é muito útil. Quando o sistema está travado, você pode descobrir onde o ponteiro do sistema atual está verificando o registro."
    10. "REISUB" -Reinicie o sistema com segurança. A forma recomendada de usar esta sequência de REISUB é:
        R - 1 segundo - E - 30 segundos - I - 10 segundos - S - 5 segundos - U - 5 segundos - B, ao invés de pressionar essas seis teclas de uma vez,
        imagine que é normal uma vez O comando de reinicialização não é concluído em um instante.
        R-Configure o teclado para o modo ASCII
        E-Send SIGTERM sinal
        para todos os processos, exceto init I-Send SIGKILL sinal para todos os processos, exceto init
        S-Disk sincronização buffer
        U-Remount para modo somente leitura
        B-Reiniciar o sistema imediatamente
    
    

Cliquei em SysRq, mas não aconteceu nada, por quê?

    Alguns teclados geram códigos de tecla para SysRq que são diferentes do valor predefinido 99 (consulte KEY_SYSRQ em include / linux / input.h) ou não há nenhuma chave SysRq.
Quero adicionar um evento ao módulo SysRq, o que devo fazer?
    Não sei fazer, porque não fiz ...
    Verifique as informações, o texto original é o seguinte:


In order to register a basic function with the table, you must first include
the header 'include/linux/sysrq.h', this will define everything else you need.
Next, you must create a sysrq_key_op struct, and populate it with A) the key
handler function you will use, B) a help_msg string, that will print when SysRQ
prints help, and C) an action_msg string, that will print right before your
handler is called. Your handler must conform to the prototype in 'sysrq.h'.

After the sysrq_key_op is created, you can call the kernel function
register_sysrq_key(int key, struct sysrq_key_op *op_p); this will
register the operation pointed to by 'op_p' at table key 'key',
if that slot in the table is blank. At module unload time, you must call
the function unregister_sysrq_key(int key, struct sysrq_key_op *op_p), which
will remove the key op pointed to by 'op_p' from the key 'key', if and only if
it is currently registered in that slot. This is in case the slot has been
overwritten since you registered it.

The Magic SysRQ system works by registering key operations against a key op
lookup table, which is defined in 'drivers/tty/sysrq.c'. This key table has
a number of operations registered into it at compile time, but is mutable,
and 2 functions are exported for interface to it:
    register_sysrq_key and unregister_sysrq_key.
Of course, never ever leave an invalid pointer in the table. I.e., when
your module that called register_sysrq_key() exits, it must call
unregister_sysrq_key() to clean up the sysrq key table entry that it used.
Null pointers in the table are always safe. :)

If for some reason you feel the need to call the handle_sysrq function from
within a function called by handle_sysrq, you must be aware that you are in
a lock (you are also in an interrupt handler, which means don't sleep!), so
you must call __handle_sysrq_nolock instead.

 

Quando clico em uma combinação de teclas SysRq, apenas o cabeçalho aparece no console?

    A saída do Sysrq é controlada pelo mesmo nível de log do console que todas as outras saídas do console.
    Isso significa que se o kernel inicializar como "silencioso" como é comum em kernels de distribuição,
    a saída pode não aparecer no console real, mesmo se aparecer no buffer dmesg
    e pode ser passada através do comando dmesg e Acesso do consumidor de proc / kmsg. Como uma exceção específica,
    a linha de cabeçalho do comando sysrq é passada para todos os consumidores do console, como se o nível de log atual fosse o maior.
    Se apenas o cabeçalho for enviado, o nível de log do kernel é quase certamente muito baixo.
    Se precisar de saída no canal do console, você precisa usar alt-sysrq-8 ou:
        echo 8> / proc / sysrq-trigger
    Lembre - se, depois de acionar o comando sysrq no qual está interessado, restaure o nível de log ao normal.

 

Eu tenho mais perguntas, a quem posso perguntar?

    Não me pergunte, pergunte a eles!
    Pergunte a eles na lista de discussão do kernel do Linux:
        [email protected]

    
(Ps: "h" -Veja a ajuda de usar chaves mágicas)

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) show-blocked-tasks(w)

(Ps: "m" - veja o uso de memória atual)

sysrq: SysRq : Show Memory
Mem-Info:
active_anon:34588 inactive_anon:1508 isolated_anon:0
 active_file:0 inactive_file:0 isolated_file:0
 unevictable:0 dirty:0 writeback:0 unstable:0
 slab_reclaimable:774 slab_unreclaimable:10682
 mapped:2297 shmem:33632 pagetables:218 bounce:0
 free:42392 free_pcp:88 free_cma:3934
Node 0 active_anon:138352kB inactive_anon:6032kB active_file:0kB inactive_file:0kB unevictable:0kB isolated(anon):0kB isolated(file):0kB mapped:9188kB dirty:0kB writeback:0kB shmem:134528kB writeback_tmp:0kB unstable:0kB pages_scanned:0 all_unreclaimable? yes
Normal free:169568kB min:8192kB low:10240kB high:12288kB active_anon:138352kB inactive_anon:6032kB active_file:0kB inactive_file:0kB unevictable:0kB writepending:0kB present:393216kB managed:380740kB mlocked:0kB slab_reclaimable:3096kB slab_unreclaimable:42728kB kernel_stack:968kB pagetables:872kB bounce:0kB free_pcp:352kB local_pcp:128kB free_cma:15736kB
lowmem_reserve[]: 0 0 0
Normal: 4*4kB (MEC) 2*8kB (ME) 2*16kB (EC) 3*32kB (MEC) 1*64kB (C) 1*128kB (E) 3*256kB (MEC) 3*512kB (UME) 1*1024kB (C) 3*2048kB (UMC) 39*4096kB (MC) = 169568kB
33632 total pagecache pages
98304 pages RAM
0 pages HighMem/MovableOnly
3119 pages reserved
4096 pages cma reserved

(Ps: "l" -visualizar o rastreamento da pilha da cpu ativa atual)

sysrq: SysRq : Show backtrace of all active CPUs
NMI backtrace for cpu 1
CPU: 1 PID: 0 Comm: swapper/1 Tainted: P           O    4.9.37 #396
Hardware name: Generic DT based system
[<c010f8b8>] (unwind_backtrace) from [<c010b4e0>] (show_stack+0x10/0x14)
[<c010b4e0>] (show_stack) from [<c03807bc>] (dump_stack+0x84/0x98)
[<c03807bc>] (dump_stack) from [<c0383f54>] (nmi_cpu_backtrace+0xc0/0xc4)
[<c0383f54>] (nmi_cpu_backtrace) from [<c038403c>] (nmi_trigger_cpumask_backtrace+0xe4/0x12c)
[<c038403c>] (nmi_trigger_cpumask_backtrace) from [<c03fca14>] (__handle_sysrq+0x120/0x174)
[<c03fca14>] (__handle_sysrq) from [<c040fd60>] (pl011_fifo_to_tty+0x19c/0x1f4)
[<c040fd60>] (pl011_fifo_to_tty) from [<c04106e4>] (pl011_int+0x254/0x44c)
[<c04106e4>] (pl011_int) from [<c015f7fc>] (__handle_irq_event_percpu+0x9c/0x124)
[<c015f7fc>] (__handle_irq_event_percpu) from [<c015f8a0>] (handle_irq_event_percpu+0x1c/0x58)
[<c015f8a0>] (handle_irq_event_percpu) from [<c015f920>] (handle_irq_event+0x44/0x68)
[<c015f920>] (handle_irq_event) from [<c0162d6c>] (handle_fasteoi_irq+0xb4/0x194)
[<c0162d6c>] (handle_fasteoi_irq) from [<c015eb28>] (generic_handle_irq+0x24/0x34)
[<c015eb28>] (generic_handle_irq) from [<c015f04c>] (__handle_domain_irq+0x5c/0xb4)
[<c015f04c>] (__handle_domain_irq) from [<c0101438>] (gic_handle_irq+0x48/0x8c)
[<c0101438>] (gic_handle_irq) from [<c010bfcc>] (__irq_svc+0x6c/0x90)
Exception stack(0xd6877f98 to 0xd6877fe0)
7f80:                                                       00000000 023343d6
7fa0: d6cd62e8 c0115200 d6876000 c0a02fe4 00000002 c0a0304c c0a0d44a 410fd034
7fc0: 00000000 00000000 00000000 d6877fe8 c0108680 c0108684 60000013 ffffffff
[<c010bfcc>] (__irq_svc) from [<c0108684>] (arch_cpu_idle+0x38/0x3c)
[<c0108684>] (arch_cpu_idle) from [<c01528dc>] (cpu_startup_entry+0xc8/0x13c)
[<c01528dc>] (cpu_startup_entry) from [<22101528>] (0x22101528)
Sending NMI from CPU 1 to CPUs 0:

(Ps: "p" - imprime informações de registro de CPU)

sysrq: SysRq : Show Regs
CPU: 1 PID: 0 Comm: swapper/1 Tainted: P           O    4.9.37 #396
Hardware name: Generic DT based system
task: d6853440 task.stack: d6876000
PC is at arch_cpu_idle+0x38/0x3c
LR is at arch_cpu_idle+0x34/0x3c
pc : [<c0108684>]    lr : [<c0108680>]    psr: 60000013
sp : d6877fe8  ip : 00000000  fp : 00000000
r10: 00000000  r9 : 410fd034  r8 : c0a0d44a
r7 : c0a0304c  r6 : 00000002  r5 : c0a02fe4  r4 : d6876000
r3 : c0115200  r2 : d6cd62e8  r1 : 023348a2  r0 : 00000000
Flags: nZCv  IRQs on  FIQs on  Mode SVC_32  ISA ARM  Segment none
Control: 10c5383d  Table: 230fc06a  DAC: 00000051
CPU: 1 PID: 0 Comm: swapper/1 Tainted: P           O    4.9.37 #396
Hardware name: Generic DT based system
[<c010f8b8>] (unwind_backtrace) from [<c010b4e0>] (show_stack+0x10/0x14)
[<c010b4e0>] (show_stack) from [<c03807bc>] (dump_stack+0x84/0x98)
[<c03807bc>] (dump_stack) from [<c03fca14>] (__handle_sysrq+0x120/0x174)
[<c03fca14>] (__handle_sysrq) from [<c040fd60>] (pl011_fifo_to_tty+0x19c/0x1f4)
[<c040fd60>] (pl011_fifo_to_tty) from [<c04106e4>] (pl011_int+0x254/0x44c)
[<c04106e4>] (pl011_int) from [<c015f7fc>] (__handle_irq_event_percpu+0x9c/0x124)
[<c015f7fc>] (__handle_irq_event_percpu) from [<c015f8a0>] (handle_irq_event_percpu+0x1c/0x58)
[<c015f8a0>] (handle_irq_event_percpu) from [<c015f920>] (handle_irq_event+0x44/0x68)
[<c015f920>] (handle_irq_event) from [<c0162d6c>] (handle_fasteoi_irq+0xb4/0x194)
[<c0162d6c>] (handle_fasteoi_irq) from [<c015eb28>] (generic_handle_irq+0x24/0x34)
[<c015eb28>] (generic_handle_irq) from [<c015f04c>] (__handle_domain_irq+0x5c/0xb4)
[<c015f04c>] (__handle_domain_irq) from [<c0101438>] (gic_handle_irq+0x48/0x8c)
[<c0101438>] (gic_handle_irq) from [<c010bfcc>] (__irq_svc+0x6c/0x90)
Exception stack(0xd6877f98 to 0xd6877fe0)
7f80:                                                       00000000 023348a2
7fa0: d6cd62e8 c0115200 d6876000 c0a02fe4 00000002 c0a0304c c0a0d44a 410fd034
7fc0: 00000000 00000000 00000000 d6877fe8 c0108680 c0108684 60000013 ffffffff
[<c010bfcc>] (__irq_svc) from [<c0108684>] (arch_cpu_idle+0x38/0x3c)
[<c0108684>] (arch_cpu_idle) from [<c01528dc>] (cpu_startup_entry+0xc8/0x13c)
[<c01528dc>] (cpu_startup_entry) from [<22101528>] (0x22101528)

 

 

 

 

 

 

Acho que você gosta

Origin blog.csdn.net/Ivan804638781/article/details/97921188
Recomendado
Clasificación