Etiquetas

viernes, 6 de diciembre de 2013

Optimizando recursos migrando a ngetty como terminales virtuales ttys

Linux es heredero de Unix, el sistema operativo creado por Dennis Ritchie y Ken Thompson en los Bell Labs de AT&T a fines de los años '60. Por eso, algunas "cosas" que Linux aún corre, vienen de larga data, son producto del desarrollo colectivo de muchas muchas personas. Getty es uno de esos procesos, que se encargan de las llamadas tty o terminales virtuales. En este post sigue un procedimiento para ahorrar significativamente memoria RAM migrando de getty a ngetty.


Getty es el proceso encargado de la gestión de las terminales virtuales (tty). Como Unix, getty tiene una historia larga: su nombre proviene de "Get Teletype", porque antiguamente las consolas que se conectaban eran teletipos. La tarea de getty es detectar una conexión y proceder al login.
En los Linux actuales las terminales virtuales se acceden con ctrl+alt+Fn donde Fn es una tecla de función F1-F6 en la configuración canónica.
El proceso getty es iniciado por init, y por lo tanto configurado en /etc/inittab.
En sistemas con mucha memoria RAM, es prácticamente despreciable el uso getty hace de recursos. Pero puede darse el casos que Linux tuviera que correr como un sistema "embebido" o que el hardware que vayamos usar no tenga GB de memoria sino algunos MBs. Un ejemplo también podría ser la Raspberry Pi. Entonces ahorrar algo de consumo de RAM podría ayudar.
Veamos el consumo inicial de memoria de los procesos gettys corriendo:


En los campos VSZ (Virtual Size) y RSS (Resident Set Size) nos podemos hacer una idea de la memoria que están usando las gettys tradicionales. Sin entrar en los detalles acá de VSZ y RSS más info se puede encontrar aquí
http://www.linuxquestions.org/questions/linux-hardware-18/why-is-vsz-more-than-rss-in-ps-aux-even-if-i%27m-not-using-any-swap-663109/

ngetty entra en juego

ngetty a diferencia de getty no inicia N procesos dependiendo de cuántas terminales virtuales estemos usando. ngetty es un demonio único, y su uso de recursos es a demanda. Según indica su autor, Nikola Vladov, "ngetty es un demonio que inicia sesiones de login en consolas de terminales virtuales bajo demanda. Es un buen reemplazo de todos aquellos procesos gettys iniciados por init que, la mayor parte del tiempo, sólo toman memoria. ngetty, cuando se compila usando dietlibc el binario ngetty solo tiene 2k y usa mucha menos memoria que getty".
Esas y otras informaciones sobre ngetty se pueden encontrar en el site oficial del proyecto: http://riemann.fmi.uni-sofia.bg/ngetty/

En Debian, para instalar ngetty es tan simple como:

aptitude install ngetty

Antes de reemplazar definitivamente ngetty se puede hacer una prueba para verificar el comportamiento, como se indica en el site de ngetty. Para eso editar /etc/inittab y agregar la si:

1:2345:respawn:/sbin/mingetty tty1
2:2345:respawn:/sbin/mingetty tty2
3:2345:respawn:/sbin/mingetty tty3
# 4:2345:respawn:/sbin/mingetty tty4
# 5:2345:respawn:/sbin/mingetty tty5
# 6:2345:respawn:/sbin/mingetty tty6
# Run ngetty in standard run-levels

#Config de ngetty en ttys 4,5 y 6
ng:2345:respawn:/sbin/ngetty 4 5 6
Aquí se han comentado las getty originales de las tty 4, 5 y 6. Es decir las que se acceden con ctrl+alt+F4, F5 o F6.

con init q podemos hacer que el sistema haga un reload de inittab, pero si se quiere para más seguridad se puede dar un reboot o pasar a modo single-user y luego a un runlevel multiusuario.

init q

Entonces si con ctrl+alt+F4, F5 o F6 podemos acceder bien y loguearnos en esas terminales virtuales, entonces podemos pasar a deshabilitar definitivamente getty:

# 1:2345:respawn:/sbin/mingetty tty1
# 2:2345:respawn:/sbin/mingetty tty2
# 3:2345:respawn:/sbin/mingetty tty3
# 4:2345:respawn:/sbin/mingetty tty4
# 5:2345:respawn:/sbin/mingetty tty5
# 6:2345:respawn:/sbin/mingetty tty6

# Run ngetty in standard run-levels
ng:2345:respawn:/sbin/ngetty 1 2 3 4 5 6

Aquí ngetty se iniciará en los runlevels estándares 2, 3, 4 y 5 y habilitará ttys (o consolas virtuales) de 1 a 6 (ctrl+alt+F1 hasta F6).

Comparemos ahora el consumo de memoria:


Comparemos los valores de VSZ y RSS y veremos que los valores de ngetty son notablemente menores a las que acumulan todos los procesos getty canónicos.
En sistemas muy antiguos, o en hard donde Linux tenga que consumir menos recursos ngetty puede hacer alguna diferencia.

En la Raspberry Pi

En la RasPi, aunque mucho de nosotros no usemos las consolas virtuales, ngetty es una forma de reducir el uso de ram, sin deshabilitar el acceso a las ttys por completo.

# Note that on most Debian systems tty7 is used by the X Window System,
# so if you want to add more getty's go ahead but skip tty7 if you run X.
#
#1:2345:respawn:/sbin/getty --noclear 38400 tty1
#2:23:respawn:/sbin/getty 38400 tty2
#3:23:respawn:/sbin/getty 38400 tty3
#4:23:respawn:/sbin/getty 38400 tty4
#5:23:respawn:/sbin/getty 38400 tty5
#6:23:respawn:/sbin/getty 38400 tty6

ng:123:respawn:/sbin/ngetty 1 2 3 4 5 6

# Example how to put a getty on a serial line (for a terminal)
#
#T0:23:respawn:/sbin/getty -L ttyS0 9600 vt100
#T1:23:respawn:/sbin/getty -L ttyS1 9600 vt100

# Example how to put a getty on a modem line.
#
#T3:23:respawn:/sbin/mgetty -x0 -s 57600 ttyS3


#Spawn a getty on Raspberry Pi serial line
T0:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100

Nótese la línea final, en la que dejé un proceso para getty, ya que esa es la consola serial que la RasPi tiene disponible a través del puerto serie ttyAMA0, ubicado en el GPIO (no son niveles RS-232, así que cuidado. Hace falta hardware para adaptar los niveles). Si la quisiéramos deshabilitar se puede comentar, claro.

No hay comentarios.:

Publicar un comentario