- El Pensadero de Canek - https://aztlan.fciencias.unam.mx/~canek/pensadero -

Systemd

Estoy programando un pequeño proyecto personal desde hace un par de meses. Ahorita estoy atorado en una parte bastante mensa, así que decidí escribir acerca de un proyecto que, muy indirectamente, me inspiró a escribir el mío.

Hace ocho meses, Lennart Pottering escribió en su blog [1] acerca de systemd [2], un reemplazo para el venerable (y anticuado) sysvinit (de “System V Init”). La idea en resumidas cuentas, es copiarle más o menos lo que hace Apple para iniciar rápidamente Mac OS X, y haciéndolo tomando todas las posibles ventajas que ofrece Linux. Esto último es importante; systemd por diseño no es portátil: está pensado para Linux y únicamente para Linux.

Lo principal para que funcione únicamente en Linux es el uso de Control Groups, una característica del kernel de Linux que ha estado disponible desde la versión 2.6.35, y que no mucha gente le ha hecho mucho caso, hasta hace unas semanas que Slashdot reportó una historia [3] acerca de como un parche de 200 míseras líneas en el kernel volvía el escritorio súper usable, incluso bajo intenso uso (el ejemplo clásico siendo el compilar un kernel usando todos los procesadores). Como Lennart mismo mencionó poco después [4], el parche ni siquiera es necesario configurando inteligentemente los famosos Control Groups, o cgroups para abreviar.

Los cgroups son eso, grupos de control para procesos. Permiten agrupar ciertos procesos de tal forma que se les pueda asignar recursos a todos los procesos en el grupo. El “milagroso” parche lo que hacía era poner al proceso compilando el kernel en un mismo grupo, y el resto del escritorio en otro; por lo tanto el CFQ (Completely Fair Queue, la implementación del scheduler usada por omisión en Linux) les da igual tiempo de procesador al grupo compilando el kernel (aunque al llamar make le pidamos que use todos los procesadores), y a la ejecución del escritorio.

Systemd utiliza a lo bestia los cgroups; siendo un reemplazo de sysvinit, lo que hace es ser el primer proceso que es llamado por el kernel, y se encarga de todos los otros procesos que levanta después el sistema. Entonces si uno de esos procesos es Apache, por ejemplo, systemd pone a todos los procesos derivados de Apache en un grupo de control, incluyendo scripts CGI que hagan un “doble fork” para tratar de escapar del control del mismo Apache. Los cgroups impiden que tal escape sea posible.

Por supuesto, no es lo único que hace systemd distinto a sysvinit; también manda al carajo la idea de tener scripts para levantar y tumbar servicios, y los reemplaza con archivos (llamados unidades en la terminología de systemd) que son sospechosamente similares a los archivos .desktop que pululan los distintos escritorios en Linux (aunque mantiene compatibilidad para poder usar los scripts de sysvinit). El no mandar llamar a bash (y a un montón de programas a través de bash) acelera el tiempo que tarda en levantar el sistema enormemente.

Encima de esto, systemd intenta levantar cuanto proceso pueda de forma paralela, y reemplaza muchos scripts escritos en bash por sencillos programitas escritos en C. Todo esto además pensando en que systemd funcione de forma idéntica entre distintas distribuciones, lo cual tendría la alegre consecuencia de que las diferencias idiotas que hay entre todas las distribuciones para levantar el sistema desaparecerían.

Pocos meses después de que Lennart anunció systemd, traté de instalarlo en Gentoo, y fallé miserablemente. Lo cual no es de extrañar; Gentoo utiliza su propio sistema de inicio disinto de sysvinit (OpenRC le dicen), y esto ocasiona que si uno quiere intentar usar systemd, debe poder reemplazar toda la inicialización, no se puede utilizar nada de OpenRC. Lo dejé estar un par de meses más, y hace unas semanas lo volví a intentar.

Aunque no funcionó a la primera, poco a poco (y reportando bugs y parchando distintos programas y ebuilds de Gentoo), por fin logré que mi laptop utilizara systemd exclusivamente. Mi laptop pasó de tardar 1 minuto 40 segundos en inicializar, a tardar “únicamente” 50 segundos. Sé que no suena mucho, pero no es tan rápida.

Cuando por fin me sentí lo suficientemente cómodo con systemd en mi laptop, lo puse en mi media center. Ahí la diferencia sí fue significativa; mi media center inicializaba en 50 segundos, y con systemd tarda alrededor de 20 ahora.

Además del booteo indudablemente más rápido, el diseño de systemd me parece extremadamente elegante y bien pensado. Y el uso de cgroups además ocasiona un montón de cosas buenas, como el poder cambiarle la prioridad a todo un conjunto de procesos de forma sencilla. Si además consigue convertirse en el estándar para inicializar Linux a través de distintas distribuciones (Fedora y OpenSUSE, y a lo mejor Debian sí parecen serios al respecto), ciertamente esto mejoraría la vida de todos.

En mi laptop ya llevo un par de semanas usando exclusivamente systemd, y en mi media center unos días. Todavía no lo pongo en mi máquina de escritorio, pero probablemente lo haga estas vacaciones. Está muy simpático el proyectito.

1 Comment (Open | Close)

1 Comment To "Systemd"

#1 Comment By Jesuschrist Superstar On abril 19, 2011 @ 12:51 PM

¿Y siempre cual es el proyectititito personal?