Arranque gráfico con Bootsplash, debian y barra de progreso


Quien tenga instalado las últimas versiones de SuSE y/o Mandrake habrá observado los arranques gráficos que poseen con barra de progresión incluida. Y lo que es más, al contrario que el sistema lpp que necesita compilar la imagen dentro del núcleo, el sistema que utilizan estas distribuciones llamada bootsplash, permite cambiar la imagen de fondo sin necesidad de recompilar el núcleo, además de darnos la opción de “desocultar” el arranque con tan sólo pulsar la tecla F2.

En este artículo explico como crear un arranque gráfico con Debian, incluida barra de progreso.

You can found this article in English here(1)

Puedes encontrar este artículo en inglés aquí(1)

INSTALACIÓN
Lo primero que hay que hacer es bajarse el parche de bootsplash, lo podéis encontrar en la página de parches de Con Kolivas(2) junto a muchos más, pero a nosotros por ahora sólo nos interesa el de bootsplash(3) en particular.
Ya en un artículo anterior(4) Gallir nos explicó como compilar y parchear un kernel, pero para los más torpecillos aquí van las intrucciones para este parche en particular:
Teniendo en cuenta que ya tenéis las fuentes del kernel correctamente descomprimidas en /usr/src/linux, copiais el parche a donde queráis (por ejemplo /usr/src) y los descomprimís con
bunzip2 patch-1090_BS_0306020027_2.4.21-ck2.bz2
Y a continuación lo aplicáis ejecutando desde el directorio /usr/src/linux el siguiente comando
patch -p1 < ../1090_BS_0306020027_2.4.21-ck2
Ya debéis tener el parche aplicado, ahora sólo queda configurar en el kernel con cualquiera de los cuatro sistemas disponibles lo siguiente.

  • En “Console drivers”->”Frame-Buffer support”, seleccionar “VESA VGA graphics console”, o cualquier otro que os sirva con vuestra tarjeta y activar la opción “Use splash screen instead of boot logo”
  • También debéis activar en “Block devices” el “Initial Ramdisk support”

Una vez hecho esto ya podéis cambiar el resto de parámetros a vuestro gusto y compilar e instalar el nuevo kernel que no explicaré, ya que como he dicho antes, está perfectamente explicado en el artículo de Gallir.
Ahora debemos bajarnos y compilar una aplicación que nos servirá para crearnos el archivo initrd que contendrá la imagen que aparecerá al iniciarse el sistema.Necesitamos esa imagen initrd que se cargará en RAM, ya que al principio no está montado ningún sistema, por lo tanto no puede cogerlo directamente del disco duro “a pelo”.
La aplicación se llama splash y puede bajarse de esta dirección ftp://ftp.suse.com/pub/people/stepan/bootsplash/rpm-sources/bootsplash/splashutils.tar.bz2(5). Una vez bajada lo podéis descomprimir donde queráis, como por ejemplo /usr/src y os creará el directorio /usr/src/splashutils, entráis en ese directorio y tan sólo tenéis que ejecutar como root
make
Os dará un warning o aviso en la compilación con respecto a progress, lo podéis ignorar. Bueno, en este momento os habrá creado cuatro ejecutables binarios que son fbresolution, getkey, progress y splash, que podéis copiar a /usr/local/bin para tenerlo en el path, aunque sólo nos interesará progress y splash.
El siguiente paso es elegir un tema de bootsplash que nos guste. En la página principal de Bootsplash(6) podéis encontrar un apartado dedicado a los distintos temas disponibles, os lo podéis hacer vosotros mismo con cualquier imagen, pero eso queda fuera del alcance del artículo. Yo recomiendo el de Theme-Linux(7) que es el que utilizaré en el resto del artículo como ejemplo, pero podéis escoger el que más os guste, pudiendolos cambiar a discreción sin tener que recompilar el kernel. Este tema en particular tiene barra de progreso, además de dos modos de visión:

  • Verbose: Aquí veremos todos los mensajes de inicio pero con una imagen de fondo translúcida, podéis ver como queda aquí(8)
  • Silent: Aquí no veremos ningún mensaje, tan sólo una imagen con una barra de progreso, tal y como se muestra aquí(9)

Para instalar el tema lo mejor es que descomprimáis el archivo en /etc/bootsplash/themes, así os ahorraréis más modificiaciones en el archivo de configuración.
En este momento tenéis los siguientes archivos:

  • /etc/bootsplash/themes/Linux/config/bootsplash-1024×768.cfg:tiene la configuración del arranque, una descripción detallada la podéis encontrar aquí(10), de todas formas no hace falta modificar nada.
  • /etc/bootsplash/themes/Linux/images/bootsplash-1024×768.jpg: esta imagen jpg será la que se utilice en el modo verbose (muestra mensajes)
  • /etc/bootsplash/themes/Linux/images/silent-1024×768.jpg: esta otra imagen jpg será la que se utilice en el modo silent (con barra de progreso y sin mensajes)

CONFIGURACION
Ahora es el momento de construir el initrd que contendrá la imagen mostrada en el arranque y se hará de la siguiente manera:
splash -s -f /etc/bootsplash/themes/Linux/config/bootsplash-1024×768.cfg >> /boot/initrd.splash
¿Por qué bootsplash-1024×768.cfg y no cualquiera de las imágenes?. Porque es ese archivo de configuración el que nos muestra de donde añadir las dos imágenes.
Ahora solo resta preparar el arranque para que nos muestre nuestra bonita pantalla de inicio:
En Grub:
kernel (hd0,3)/boot/vmlinuz-2.4.21-melenas root=/dev/hda4 vga=791 splash=silent
initrd (hd0,3)/boot/initrd.splash
Y en lilo debemos añadir y/o modificar las siguientes líneas:
vga=791
initrd=/boot/initrd.splash
append=”splash=silent”
Veamos que hace cada cosa:

  • vga=791: Nos muestra la pantalla de inicio a 1024×768 con 65000 colores, este dato dependerá de la resolución y profundidad de color del tema que utilicemos, a continuación pongo una pequeña tabla que nos mostrará los diferentes códigos:

    Colores640x480800x6001024x7681280x1024
    256769771773775
    32000784787790793
    65000785788791794
    16.7 Mill.786789792795

  • splash=silent: Hace que la pantalla de inicio sea la que no muestra ningún mensaje y sí la barra de progreso, si quisieramos la otra, simplemente deberíamos eliminar esta opción del arranque, ya que por defecto se inicia en modo verbose (con mensajes)
  • initrd=/boot/initrd.splash: Cargamos el initrd donde están almacenadas las imágenes jpg junto con la configuración.

CONSEGUIR LA BARRA DE PROGRESO
Bien, si hemos seguido todos estos pasos correctamente ahora podremos reiniciar y disfrutar de nuestro nuevo inicio gráfico pero con un pero, no hay barra de progreso. Los documentos que he consultado en Internet explican como conseguirlo en SuSE, Mandrake, Gentoo y LFS, pero ninguno en Debian. Lo intenté con los ejemplos que venían, e incluso con animaciones, pero nada funcionaba, finalmente lo conseguí, pero debo avisar que lo siguiente que explico es obra mía y sólo ha sido probado por mí en una Debian/Sarge, con lo que no sé como responderá en otras versiones, pero supongo que también funcionará en Woody y Sid.
Lo primero que hay que saber es que vamos a utilizar la utilidad progress que fue compilada junto con la utilidad splash y que debe de haber sido copiada a /usr/local/bin (o cualquier otro lugar que queráis). Progress lo único que hace es dibujar un cuadrilátero del tamaño y color deseado en cualquier dispositivo framebuffer (por defecto /dev/fb0). Si lo ejecutáis sin argumentos observaréis las opciones que tiene que dejaremos por defecto, lo único que nos interesa son los siguiente parámetros:

  • x: La coordenada x del origen del cuadrilátero.
  • y: La coordenada y del origen del cuadrilátero.
  • dx: Anchura del cuadrilátero
  • dy: Altura del cuadrilátero
  • color: Color del cuadrilátero, que será un número hexadecimal de 6 cifras, al igual que los colores que podáis definir en cualquier página web

Por ejemplo:
progress 0 0 512 384 FFFFFF
nos dibujará un cuadrilátero con origen en la parte superior izquierda de la pantalla y que ocupará un cuarto de esta.

progress 256 192 512 384 FCD192
nos dibujará un cuadrilátero centrado de un color amarillo chillón
Estos ejemplos debemos de ejecutarlos en un terminal tty (preferiblemente en tty1) y no en una ventana de Konsole o xterm.
Está muy bien eso de dibujar cuadrados, pero ahora hemos de relacionarlo con el arranque. Yo me fijé en el de Mandrake y vi que utilizaba esa aplicación para dibujar un cuadrado de cierto tamaño y en cierta posición cada vez que arrancaba cierto servicio (xfs, cron, samba o cualquier otro que tengáis instalado), en Mandrake esto se hace mediante el script /etc/rc.d/rc, pero en Debian se hace mediante dos /etc/init.d/rcS que se ejecuta primero y /etc/init.d/rc que se ejecuta después (explicar que hace cada uno exactamente queda fuera de la temática del artículo).
Bien, para abreviar fijémosnos en este trozo de código de /etc/init.d/rcS, fijémosnos en que es el que se encarga de llamar a todos los scripts de los diferentes runlevel en orden, aquí debemos insertar nuestro código señalado en negrita, para que dibuje la barra de progreso, con lo cual nos quedaría esto:

# Inicializamos la variable j
# que determinará el ancho
# inicial de la barra de progreso
j=20

for i in /etc/rcS.d/S??*
do
# Ignore dangling symlinks for now.
[ ! -f “$i” ] && continue

# Inicia la barra de proceso
#

# Esto hace que no se pase la barra del tamaño establecido

if ((j < 616))
then
# Con esto llamamos a progress para que dibuje cada vez
# una barra más ancha que la anterior, en concreto 15
# píxeles más ancha (j=dx)
# x y dx dy color

/usr/local/bin/progress 204 667 $j 21 FCD123
let j=j+15
fi
# Fin barra proceso

case “$i” in
*.sh)
# Source shell script for speed.
(
trap – INT QUIT TSTP
set start
. $i
)
;;
*)
# No sh extension, so fork subprocess.
$i start
;;
esac
done

Esto nos dibuja la primera parte de la barra, pero ahora debemos dibujar la segunda con /etc/init.d/rc. Para ello debemos tener en cuenta donde dejó de dibujar la anterior barra pero que esta la continue de forma lineal. Pero para explicarlo mejor, miremos el código:

# Lo explicamos más abajo

variable_peligro=395
j=variable_peligro

for i in /etc/rc$runlevel.d/S*
do
[ ! -f $i ] && continue

if [ $previous != N ] && [ $previous != S ]
then
#
# Find start script in previous runlevel and
# stop script in this runlevel.
#
suffix=${i#/etc/rc$runlevel.d/S[0-9][0-9]}
stop=/etc/rc$runlevel.d/K[0-9][0-9]$suffix
previous_start=/etc/rc$previous.d/S[0-9][0-9]$suffix
#
# If there is a start script in the previous level
# and _no_ stop script in this level, we don’t
# have to re-start the service.
#
[ -f $previous_start ] && [ ! -f $stop ] && continue

fi
#Continúa la barra de progreso
#Esto hace que no se pase la barra
if ((j < 616))
then

/usr/local/bin/progress 204 666 $j 21 FCD123
let j=j+15
fi
#Fin barra proceso

case “$runlevel” in
0|6)
startup $i stop
;;
*)
startup $i start
;;
esac
done

La segunda parte de este código está clara, ya que hace exactamente lo mismo que la anterior, dibujar la barra de progreso, pero ¿que es eso de variable peligro?. Bueno vayamos por partes, ya dije que teníamos que tener en cuenta donde se quedó la anterior barra de progreso para continuar con la actual. Pasar variables que no sean de entorno entre dos scripts aunque sea con export fue para mí una tarea imposible, así que me las tuve que ingeniar para inventar otro método que sí lo hiciera, he de reconocer que es un poco burdo e incluso peligroso si no se hace correctamente, pero como siempre, mejor miremos el código para entenderlo mejor. El siguiente trozo de código debe de colocarse justo al final del archivo /etc/init.d/rcS

sed ‘s/variable_peligro=[0-9]*/variable_peligro=’$j’/g’ /etc/init.d/rc > /tmp/boots
mv /tmp/boots /etc/init.d/rc
chmod 755 /etc/init.d/rc

Más claro imposible, cogemos el valor de j, buscamos la cadena variable_peligro=número_cualquiera en el archivo rc y lo modificamos por variable_peligro=último_valor_de_j, lo guardamos como /tmp/boots, depués lo renombramos como /etc/init.d/rc y le cambiamos los permisos. Está claro que lo de variable_peligro es por buscar un nombre lo suficientemente raro como para que no haya ninguna otra coincidencia con él.
Si reiniciáramos ahora tendríamos una bonita barra de inicio, pero al salir veríamos que no sale ninguna barra, esto se soluciona con el siguiente código (que aparece en negrita) que introduciríamos en /etc/init.d/rc

# First, run the KILL scripts.
if [ $previous != N ]
then

k=20

for i in /etc/rc$runlevel.d/K[0-9][0-9]*
do
# Check if the script is there.
[ ! -f $i ] && continue

# Stop the service.

# Esto hace que no se pase la barra

if ((k < 616))
then

/usr/local/bin/progress 204 666 $k 21 FCD123
let k=k+25
fi
# Fin barra proceso

startup $i stop
done
fi

Creo que sobran las explicaciones de por qué se usa k como variable y el por qué se coloca ahí 😉
Ya con esto tan sólo nos queda reiniciar la máquina y disfrutar con nuestro nuevo arranque con barra de progreso.

EXTRAS Y NOTAS FINALES
Y como extra un mini-truco, si colocáis esto
/usr/local/bin/splash -n -s -u 1 /etc/bootsplash/themes/Linux/config/bootsplash-1024×768.cfg
/usr/local/bin/splash -n -s -u 2 /etc/bootsplash/themes/Linux/config/bootsplash-1024×768.cfg
/usr/local/bin/splash -n -s -u 3 /etc/bootsplash/themes/Linux/config/bootsplash-1024×768.cfg
/usr/local/bin/splash -n -s -u 4 /etc/bootsplash/themes/Linux/config/bootsplash-1024×768.cfg
/usr/local/bin/splash -n -s -u 5 /etc/bootsplash/themes/Linux/config/bootsplash-1024×768.cfg
en el archivo /etc/init.d/rcS, preferiblemente al final de él, veréis como los distintos tty del 2 al 6 tienen la misma imagen de fondo que tendría tty1 en modo verbose. Y aún hay más, si os bajáis otros temas, podéis tener una imagen de fondo por cada tty con tan sólo cambiar el archivo de configuración, como por ejemplo:
/usr/local/bin/splash -n -s -u 1 /etc/bootsplash/themes/OfficeDesktop/config/bootsplash-1024×768.cfg
que tiene un tema de SuSE con texto encerrado en una caja.
Notas

  • Cuidado al modificar /etc/init.d/rcS y /etc/init.d/rc, si os equivocáis puede que no arranque correctamente vuestro linux, a mí me pasó más de una vez. Yo lo solucionaba arrancado con otra distribución que tengo instalado y arreglando allí los fallos, supongo que una Knoppix también servirá, pero repito, mucho cuidado al modificar ambos archivos.
  • Cualquier actualización de sysinit puede que machaque vuestras modificaciones de rc y rcS, así que no estaría de más que sacárais una copia de seguridad
  • Si cambiáis al modo verbose con F2 cuando veáis la barra de progreso, observaréis que esta se sigue dibujando, no dejandoos ver algunos mensajes, aún no sé como solucionarlo.
  • Enlaces recomendados

    Lista de enlaces de este artículo:

  • http://bulma.net/body.phtml?nIdNoticia=1812
  • http://members.optusnet.com.au/ckolivas/kernel/
  • http://members.optusnet.com.au/ckolivas/kernel/patch-1090_BS_0306020027_2.4.21-c
  • http://bulma.net/body.phtml?nIdNoticia=1789
  • ftp://ftp.suse.com/pub/people/stepan/bootsplash/rpm-sources/bootsplash/splashuti
  • http://www.bootsplash.org
  • ftp://ftp.suse.com/pub/people/stepan/bootsplash/themes/Theme-Linux.tar.bz2
  • http://www.bootsplash.org/verbose-mode.jpg
  • http://www.bootsplash.org/silent-mode.jpg
  • http://www.bootsplash.org/config.html
  • http://sdb.suse.de/es/sdb/html/jkoeke_splashscreen.html
  • http://forums.gentoo.org/viewtopic.php?t=49036
  • http://hints.linuxfromscratch.org/hints/bootsplash.txt
  • http://wiki.escomposlinux.org/Escomposlinux/DoLiCaBootsplashEnDebian
  • Este post ha sido traido de forma automatica desde https://web.archive.org/web/20140625063149/http:/bulma.net/body.phtml?nIdNoticia=1807 por un robot nigromante, si crees que puede mejorarse, por favor, contactanos.


    Deja una respuesta

    Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

    Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.