Este es otro articulo que escribi tambien hace bastante tiempo (2003-11-12). Ahora lo vuelvo a publicar aqui:
Introduccion
Las teclas Magic SysRq pueden resultar muy utiles cuando estamos administrando un sistema linux (sobre todo de forma remota, si accedemos por consola serie desde otro equipo). En ciertos momentos incluso pueden resultar ser la unica forma de actuar con el sistema (sin no queremos desplazarnos para rebotarlo por ejemplo).
Nos permitiran realizar acciones como:
* observacion del estado de la maquina: memoria, procesos, registros,
* reboot de emergencia,
* apagar el sistema (apagado electrico),
* provocar un panic y vocado de un dump (con un parche de kernel).
Lo mejor es que todo occure a nivel de kernel, con lo cual no hace falta que este ningun servicio arrancado, y suele responder bien incluso si la maquina esta “colgada”.
Habilitar las teclas Magic SysRq en el kernel
Para poder usar las teclas magicas, tenemos que hacer dos cosas:
* habilitar el soporte en el kernel para las teclas Magic SysRq
* activarlas (ver apartado siguiente)
Para habilitar el soporte en el kernel, poner la opcion siguiente en nuestro .config:
CONFIG_MAGIC_SYSRQ=y
En el make menuconfig de un kernel 2.4 la opcion esta en :
...
[*] Kernel debugging
...
[*] Magic SysRq key
...
Activar las teclas Magic SysRq en el kernel
Para activarlas, primero debemos correr un kernel con soporte para las teclas Magic SysRq. (ver apartado anterior).
En los kernel derivados del stock kernel, deberia estar activado por defecto. De no ser asi (por ejemplo en los kernel de RH) hay que activarlo en el arranque, con:
echo "1" > /proc/sys/kernel/sysrq
Tambien se puede usar sysctl(8).
El no tenerlas activadas por defecto, impide poder usar las teclas magicas durante el arranque del kernel (hasta que se activen). Esto puede ser problematico. Con lo que, en mi opinion, es mejor que este activado por defecto.
Para comprobar y/o activarlo por defecto, basta mirar en las fuentes de nuestro kernel, en /usr/src/linux/drivers/char/sysrq.c y buscar sysrq_enabled:
...
/* Whether we react on sysrq keys or just ignore them */
int sysrq_enabled = 1;
...
Resumen de teclas Magic SysRq
'h' '.' - Will display help ( actually any other key than those listed
above will display help. but 'h' is easy to remember
* Estado de la maquina:
'0'-'9' - Sets the console log level, controlling which kernel messages
will be printed to your console. ('0', for example would make
it so that only emergency messages like PANICs or OOPSes would
make it to your console.)
'm' - Will dump current memory info to your console.
't' - Will dump a list of current tasks and their information to your
console.
'p' - Will dump the current registers and flags to your console.
* Accion sobre los procesos en maquina:
'e' - Send a SIGTERM to all processes, except for init.
'i' - Send a SIGKILL to all processes, except for init.
'l' - Send a SIGKILL to all processes, INCLUDING init. (Your system
will be non-functional after this.)
* Forzar reboot:
Pulsar esta secuencia de teclas Magic SysRq para forzar un reboot limpio del sistema: primero intenta hacer un sync de los filesystems, despues los intenta cambiar a modo r/o, y por fin se manda reiniciar el sistema (no pasa por los rc).
's' - Will attempt to sync all mounted filesystems.
'u' - Will attempt to remount all mounted filesystems read-only.
'b' - Will immediately reboot the system without syncing or unmounting
your disks.
* Apagar:
'o' - Will shut your system off (if configured and supported).
Como usamos estas teclas?
* Desde la consola “fisica” (monitor & teclado pinchado al equipo), tenemos que teclear Alt-SysRq-Tecla. En un teclado normal, la tecla “SysRq” es tambien la tecla “Print Screen”.
* Desde la consola serie, tendremos que mandar un break. Una vez mandado el break, tendremos un tiempo de 2-3 segundos para teclear la tecla en cuestion.
Por ejemplo: Break+’.’ -> Ayuda.
Ejemplo: servidor “colgado”
Para el ejemplo, imaginemos que tenemos un servidor A que se ha quedado colgado (por ejemplo ha hecho un oops! y no se recupera solo). Ya no nos deja ya entrar ni por telnet, ni por ssh… nada! Nosotros estamos en otro edificio, pero, por suerte, podemos entrar en B que hace de consola remota de A (por conexion serie – ver articulo sobre como configurar consola serie).
Nos conectamos a B (por telnet, ssh, lo que sea…), y desde B nos conectamos a A por serie (con cu o minicom por ejemplo. Yo prefiero cu, por su tecla de escape).
Una vez que tenemos la consola, le damos a intro, a ver si sale el login de A. Si sale el login, bien, podremos intentar entrar y hacer reboot ordenado del servidor.
Si no sale el login, que hacemos ?? Vamos a usar las teclas Magiq-SysRq !
Primero, lo que suelo hacer para asegurarme que responde bien el kernel, es comprobar que funcione la tecla ‘.’ . Debe aparecerme la ayuda.
servidorB$ cu -l /dev/ttyS0 -s 9600 dir
Connected.
~# '.'
SysRq : HELP : loglevel0-8 reBoot tErm kIll saK showMem showPc unRaw Sync showTasks Unmount
Ok !!
Ahora, la secuencia de teclas que usaremos para rebotar es SUB: S-U-B,
o sea:
S: Syncronizar los FS
U: desmontar y montar r/o los FS
B: reboot
Asi intentaremos minimizar una eventual corrupcion de los filesystems.
~# 's'
SysRq : Emergency Sync
Syncing device 08:02 ... OK
Syncing device 08:01 ... OK
Syncing device 08:04 ... OK
Done.
Segun la documentacion, el sync se ha hecho bien si aparece el OK. A veces me ha pasado que no aparecia… supongo que no se habra hecho el sync. Tampoco es grave.
~# 'u'
SysRq : Emergency Remount R/O
Remounting device 08:02 ... OK
Remounting device 08:01 ... OK
Remounting device 08:04 ... OK
Done.
~# 'b'
SysRq : Resetting
Disconnected.
En ese momento, la maquina estara rebotando (como si le hubieramos dado al boton de reset).
Mas informacion
La documentacion del sysrq esta en:
/usr/scr/linux/Documentation/sysrq.txt.
Conectarse a la consola serie con cu:
cu -l /dev/ttyS0 -s 9600 dir
Mandar un break con cu: ~#