Ayer estuve experimentando con formas de mejorar el tiempo de booteo de Linux.
No es ninguna novedad decir que Linux se tarda en bootear, y también se toma harto tiempo en levantar la sesión (GNOME/KDE) y en levantar algunas aplicaciones como OpenOffice.
Los resultados que tengo son preliminares. Pero he logrado bajar el tiempo de inicio de GNOME de 36 a 20 segundos (incluyendo xcompmgr+jhbuild), y el de OpenOffice de 20 a solo 5 segundos.
En cuanto a GNOME, los tiempos se pueden mejorar aun mas, pero modificando las aplicaciones. Según lo que he visto hay algunos componentes que cargan demasiados archivos.
Por ejemplo gnome-panel carga un montón de iconos que no parecen ser necesarios para iniciar la sesión. En mis mediciones, gnome-panel carga casi 1000 archivos desde /usr/share, mientras que Nautilus carga alrededor de 350.
Mientras no se corrijan esas aplicaciones, se puede mejorar el tiempo de inicio de la sesión a nivel de percepción. Es decir, hacerlo parecer mas rápido, pero en realidad no lo es.
Cuando se bootea el sistema, comienza a iniciar una serie de servicios. En el caso de Fedora Core, X/gdm solamente se carga una vez que todo el sistema esta arriba. Esto incluye servicios como ssh, httpd y otros que no son necesarios para iniciar una sesión. Pasa mucho tiempo desde que el usuario ve GRUB hasta que ve una pantalla de login.
El primer paso entonces es crear un script de inicio para gdm y eliminarlo de /etc/inittab. Una vez creado, hacemos que todos los servicios que X no necesite, se carguen después de gdm. De esta forma, tendremos un login apenas sea posible.
La técnica complementaria consiste en precargar archivos, esto se puede hacer con una utilidad que incluye Fedora llamada readahead.
Esta utilidad viene configurada en forma genérica, que no siempre se adapta a las necesidades propias. En la forma en que viene configurado, hace que el tiempo de booteo sea mucho mas largo. Lo ideal seria aprovechar los tiempos muertos. Por ejemplo, el momento en que el usuario esta ingresando su login, o el momento en que la sesión ya esta arriba.
Estoy realizando pruebas precargando archivos en 3 etapas. La primera comienza antes de cargar los servicios, apenas parte el sistema. Con nice se puede dar baja prioridad para que no vaya entorpeciendo la carga del resto de los componentes. Una vez iniciado gdm, se comienza la carga de los archivos necesarios para la sesión de gnome, mientras el usuario ingresa su login. Es aquí en donde influyen los casi 1500 archivos que se deben precargar y que perfectamente se podrían reducir a unos 400.
La tercera etapa es la carga de archivos después de iniciar la sesión. Aquí se pueden cargar las bibliotecas de openoffice o epiphany, mientras el usuario esta pensando en que hacer. En resumen (tiempos entre paréntesis) :
- (t=b) Se inicia el booteo
- (t=b+10) Se inicia INIT
- (t=b+20) Precarga de X y sus bibliotecas en background (nice -n 19)
- El sistema carga los servicios necesarios para el login (network, xfs, etc)
- (t=b+30) Se inicia gdm en background
- (t=b+47) Se inicia la carga de archivos de sesión en background, pero programado para comenzar después de terminar la carga de gdm (sleep 12 en mi caso hace el trabajo)
- Se continua cargando los otros servicios (ssh, httpd, etc) en background
- (t=b+45) Apenas aparece el login, el usuario puede ingresar sus datos
- (t=s) Se inicia la sesión (precargada)
- (t=s+20) Apenas termina la carga de la sesión, se inicia la precarga de aplicaciones como openoffice en background. Esto se puede programar via gnome-session-properties
- (t=o) Usuario carga OpenOffice
- (t=o+5) OpenOffice se carga completamente
El método completo lo publicare apenas lo tenga refinado. Para los inquietos. Fedora viene con scripts para las primeras 2 precargas, solo hay que ajustar /etc/readahead.early.files y /etc/readahead.files. Como saber que archivos se necesitan? Con una buena dosis de strace -e trace=open, greps y cuts 😉 Para la tercera precarga, solo basta un script que llame a /usr/sbin/readahead con una lista de archivos obtenida de openoffice, epiphany, etc.