Diseccion al arranque de Kubuntu 6.10 para Full-PXE

Imagen de pepo

Esta se podría considerar la segunda parte de mi documento anterior “Configuración de un sistema de instalación remota usando PXE ;) y la explicación la hago muy detallada.


[color=#FF0000][size=30]Descripción:.[/size][/color]

¿Porqué es interesante este sistema de arranque, ahora que la instalación por red está muy soportado?

Bueno en realidad veamos más allá de la instalación: ¿???. Este sistema permite la ejecución remota de una distribución que en principio fue diseñada para correr de manera local y generalmente en algún dispositivo del computador; además que podemos ofrecer más de una distribución al momento de la instalación y no varía el método.

[color=#FF0000][size=30]El problema:.[/size][/color]

Desde el segundo año del FLISOL sabíamos que debíamos mejorar el [color=#FF0000]sistema completo de instalación[/color], los pasos eran muy repetitivos y sujetos a errores por la posibilidad muy alta de que se dañen los medios de instalación, en el primer año del FLISOL usamos discos compactos, y, con esto tuvimos problemas como:

Los CD's se dañaban o se perdían (mezclaban).
Los lectores de CDs eran muy lentos y en ocasiones estaban dañados.
La instalación en paralelo por parte del mismo encargado era prácticamente imposible ya que debía esperar la disponibilidad de sus propios CDs, esto aún en la actualidad es un cuello de botella si se usa una mini imagen para instalación por red.
El número de computadores en la cola de instalación crecía muy rápido generando molestias para algunos.

Pero entonces veamos a breves rasgos de que se trataba el [color=#FF0000]sistema completo de instalación[/color]:

Un computador llega y tiene una sola partición, generalmente con un virus que ocupaba todo el disco :)
Se necesita una aplicación para redimensionar y generar el espacio suficiente para la instalación de una de las distribuciones elegidas para su difusión: GParted, QtParted, etc.
El disco queda con espacio suficiente para la la instalación.
Se inicia el proceso de instalación de la distribución en el computador.
El computador a sido salvado del virus privativo que tiene la otra partición.

Entonces, usábamos una distribución Live-CD que tenía QtParted para el redimensionamiento y luego arracábamos el proceso de instalación.

[color=#FF0000][size=30]Mi solución:.[/size][/color]

Simple, arrancar el sistema desde la red y hacer todas las operaciones necesarias en tantas máquinas como se pueda.

[color=#FF0000][size=30]Un poco de bases:.[/size][/color]

[color=#FF0000][size=30]Arranque de Linux (kernel):.[/size][/color]

Recordamos que Linux es el kernel del sistema GNU/Linux y entonces este kernel al ser inicializado (booted) debe cargarse en memoria desde el dispositivo y entonces ser ejecutado. El kernel inicializa algunos dispositivos de hardware y entonces monta la partición raíz.

El disco RAM inicial o [color=#FF0000]initrd[/color] es un sistema de archivos temporal usado por el kernel de Linux durante el arranque. El [color=#FF0000]initrd[/color] es típicamente usado para hacer preparaciones antes que el sistema de archivos real pueda ser montado1.

[color=#FF0000][size=30]Pseudo-Crackeando:.[/size][/color]

Ok, entonces como cuando crackeamos algún programa y en el sistema de registro buscamos ese 74 para hacerlo 75 me puse a revisar el sistema de arranque y encontré el momento en el cuál se trata de descomprimir la imagen del CD; ahora era solo cuestión de encontrar la forma de que monte la imagen desde otro lado. Cabe recalcar que todo esto es legal ;)

[color=#FF0000][size=30]NFS:.[/size][/color]

Network File System ? NFS, es un sistema de archivos distribuido para un entorno de red de área local. Posibilita que distintos sistemas conectados a una misma red accedan a ficheros remotos como si se tratara de locales2.

[color=#FF0000][size=30]Procedimiento:.[/size][/color]

Debería montar el disco en otro lado y traerlo para que parezca local. Pero, el problema era que los Live-CDs y/o CDs instaladores no habían sido pensados para arrancar por red, por lo que al subir y descomprimir el [color=#FF0000]initrd[/color] no se tenía todos los módulos necesarios :(

Pero no había problema lo que tuve que hacer era instalar la distribución y así obtener todos los módulos necesarios, cabe recalcar que la instalación normal siempre instala la misma versión del kernel usado para el arranque del CD instalador.

Voy a describir brevemente como hice esto para cargar correctamente los drivers de las tarjetas más comunes y los módulos necesarios para nfs:

Para optimizar las cosas podría solo copiar los módulos de las tarjeta más comunes, pero yo no me hice problema y me copié todos los módulos en /lib/modules/2.6.15-1-486/kernel/drivers/net, de igual manera usé los módulos necesarios para NFS desde /lib/modules/2.6.15-1-486/kernel/net y /lib/modules/2.6.15-1-486/kernel/fs

Y para saber la correcta manera en que debo cargarlos, lo veo desde /lib/modules/2.6.18-4-amd64/modules.dep, y saco lo necesario usando herramientas como cat y grep.

También debía usar un mount que soporte nfs, porque el que venía por defecto en las herramientas blackbox no lo soportaba, pero estos ejecutables necesitaban algunas librerías extras, así que para saber cuales eran simplemente ldd <ejecutable> me entregaba esa información.

Listo, tenemos la información y archivos que necesitaremos para una montaje por red usando NFS.

Y porque les he comentado tan superficialmente esto, bueno ahora nos enfocaremos en Kubuntu>=6.10 y veremos que ya no es necesario lo hasta aquí explicado. ;) y espero ver como viene el siguiente CD instalador de Debian para ver si es necesario hacer un HowTo más detallado o simplemente eso quedará en un rincón perdido de mi memoria :.(

Ahora de frente con el [color=#FF0000]initrd[/color]; antes había que crearlo como punto de montaje loop y otras hierbas que aunque no difícil era tedioso; desde los 2.6 se nos simplifica las cosas porque vienen comprimidos como un archivo CPIO lo que lo hace más fácil.

Voy a ir paso a paso y si se pierden, solo griten!

[color=#FF0000][size=30]Paso a paso:.[/size][/color]

Obtener la imagen del Live-CD

Vamos a obtener la imagen .iso de nuestro Kubuntu 6.10; para montarlo y ofrecerlo por NFS ya que sería ridículo el ofrecer nuestro CD-rom porque obtendríamos peores resultados y sobre todo el abucheo de nuestros amigos :D

[code]
dd if=/dev/hda of=/home/pepo/imagenesISO/kubuntu-6.10.iso
[/code]

Como yo tengo discos SATA mi CD-rom está en el primer IDE, así que deberán apuntar según su sistema. Podemos hacerlo con herramientas como K3B, con esto perdemos el glamour de la consola ;)

Por ahora vamos a montar la imagen solo para sacarle el [color=#FF0000]initrd[/color] y pasarle nuestro bisturí.

[code]
sudo mount -o loop /home/pepo/imagenesISO/kubuntu-6.10.iso /media/cdrom
[/code]

Revisando el /media/cdrom/isolinux/isolinux.cfg vemos que el archivo buscado es /media/cdrom/casper/initrd.gz

Dentro de un directorio cómodo para descomprimir la imagen, obtenemos el pequeño filesystem con:

[code]
cd /home/pepo/damaging
gzip -dc /media/cdrom/casper/initrd.gz | cpio -i
[/code]

Listo vemos el filesystem, lo primero es hecharle un vistazo a /home/pepo/damaging/init y después de un café nos vemos que usa scripts de la carpeta scripts y la función a atacar, ups de donde salió eso ¿?, la función a analizar es [color=#FF0000]mountroot[/color], vemos que aquí según la opción enviada al arranque ejecuta los scripts necesarios; recordando el /media/cdrom/isolinux/isolinux.cfg sabemos que usa la opción [color=#FF0000]casper[/color], porque arranca con boot=casper sin embargo ya vemos que tienen un intento por usar NFS directamente, pues luego les cuento como termina eso.

Revisamos el script de nfs:

[code]
vi /home/pepo/damaging/scripts/nfs
[/code]

Y encontramos la sección dónde instala el módulo para NFS y también el necesario para DHCP; ];) esto nos servirá mucho luego, dejamos este archivo en paz y ahora vamos a revisar el que hace la magía, para nosotros hacer la ilusión ;)

[code]
vi /home/pepo/damaging/scripts/casper
[/code]

Y debemos ir a la función [color=#FF0000]mountroot[/color] que era la que debíamos analizar; la revisamos y vemos que la revisión de un sistema de archivos para Live-CD lo hace en [color=#FF0000]find_livefs[/color], vamos para allá porque allí es donde comenzaremos a jugar.

En [color=#FF0000]find_livefs[/color] lo que haremos es usar las ordenes que cargan el módulo de la tarjeta de red, NFS, DHCP y la configuración de la tarjeta; nos quedaría algo así:

[code]
find_livefs() {
[color=blue]# <Pepo>
run_scripts /scripts/nfs-top 2> /dev/null
modprobe -Qb nfs 2> /dev/null
modprobe -Qb af_packet 2> /dev/null
ipconfig eth0 2> /dev/null
. /tmp/net-eth0.conf 2> /dev/null
# </Pepo>[/color]
mounted=
for sysblock in $(ec .../...
[/code]

Luego hacemos que apunte a nuestro sistema de archivos remoto:

[code]
.../...
for sysblock in $(echo /sys/block/* | tr ' ' '\n' | grep -v loop | grep -v ram); do
#devname=$(sys2dev "${sysblock}")
[color=blue]# <Pepo>
devname="192.168.2.1:/opt/remotoK"
# </Pepo>[/color]
fstype=$(get_fstype "${devname}")
.../...
[/code]

Pero el resto de la función deberá ser modificado para que monte el sistema de archivos remoto y salga, veo que ya viene con el comando [color=#FF0000]nfsmount[/color] lo que casi me asegura que se puede hacer directamente enviando las opciones correctas en el arranque, pero no lo pude hacer, además así es más divertido ;)

[code]
.../...
fstype=$(get_fstype "${devname}")
[color=blue]# <Pepo>
nfsmount -o ro -o udp -o nolock "$devname" $mountpoint || continue
if is_casper_path $mountpoint; then
echo $mountpoint
return
else
umount $mountpoint
fi
# </Pepo>[/color]
.../...
[/code]

Como todo debería estar bien, lo que pasará es que hará ese segmento de la función y entonces retornará el valor deseado.

De vuelta a la función [color=#FF0000]mountroot[/color], seguimos los pasos y todo va de maravillas, pero OjO que al momento de cargar los módulos los mensajes son erróneamente asignados en la variable [color=#FF0000]livefs_root[/color], incluso redireccioné tanto salida estándar como salida de error estándar hacia /dev/null, pero seguí apareciendo los mensajes así que asigno manualmente el valor que deberá ir aquí:

[code]
.../...
panic "Unable to find a medium containing a live file system"
fi
[color=blue]# <Pepo>
livefs_root="/cdrom"
# </Pepo>[/color]
mount_images_in_directory "$livefs_root" "$rootmnt"
log_end_msg
.../...
[/code]

Y eso es todo para que el sistema arranque remotamente; pero les voy a contar porque no acabé todo en la misma noche, luego de que el sistema arranca creyendo que el CD está montado localmente, ejecuta una serie de scripts para las últimas configuraciones antes de tener el sistema ejecutándose; y como no había manera de ver hasta donde terminaba un script y comenzaba otro, además de que ya estaba con mucho sueño, simplemente todo se dañaba y caía el sistema cuando parecía que estaba a punto de salir bien, dándome un error en el RPC que simplemente se repetía tan rápido que era imposible saber la última sentencia ejecutada correctamente ... lo chistoso es que para depurar y obtener los mensajes más lentamente y poder leerlos, usé mi teléfono Sony Ericsson w810i y filmé los mensajes ;) luego el fichero lo vi en mi computador con VLC y lo pasé más lento, y con eso pude ver el error:

Cuando el sistema se está ejecutando y todo parece local, lo que hace es ejecutar un script que trata de obtener direcciones IP desde un servidor DHCP, y con esto baja nuestra interfaz que era el vínculo con nuestro sistema de archivos remotos, y, así se pierde todo el enlace y fuera como si al estar arrancando el Live-CD abruptamente sacamos el CD ;) para evitar esto se puede modificar el script o simplemente borrarlo ya que no repercutirá en nada, recordemos que lo usamos simplemente para reparticionar el disco y luego instalar pseudo-localmente la distribución; cuando el sistema esté instalado lo arreglaremos manualmente; bueno a borrar este dichoso script:

[code]
rm -f /home/pepo/damaging/scripts/casper-bottom/23networking
[/code]

Ahora lo que tenemos que hacer es guardar todo en la misma caja y poner como lo encontramos, para eso estamos en /home/pepo/damaging/ y hacemos:

[code]
find . -print | cpio -Hnewc -o | gzip -9 > ../pepo.gz
[/code]

Tenemos ya nuestro disco ram inicial, y lo copiaremos en una carpeta disponible por nuestro servidor tftp, lo mismo que el kernel:

[code]
sudo cp /home/pepo/pepo.gz /var/lib/tftpboot/deKubuntu-6.10
sudo cp /media/cdrom/casper/vmlinuz /var/lib/tftpboot/deKubuntu-6.10
[/code]

Lo que vamos a hacer es crear el archivo de arranque de PXE:

[code]
sudo vi /var/lib/tftpboot/pxelinux.cfg/default
[code]

[code]
default 1
prompt 1
# Tiempo suficiente para que se muestre la imagen.
timeout 500
display /extras/texto.msg

label 1
kernel /deKubuntu-6.10/vmlinuz
append boot=casper initrd=/deKubuntu-6.10/pepo.gz ramdisk_size=148576 root=/dev/ram rw quiet splash --
[/code]

El archivo con nuestro mensaje:

[code]
sudo vi /var/lib/tftpboot/extras/texto.msg
[/code]

[code]
^X/extras/menuPXE.lss
^O07
Opciones ^O021:Kubuntu 6.10 ^O022:Ubuntu 6.10^O023:Ubuntu 7.04
[/code]

Y ahora tener nuestra imagen que como han visto se llamará menuPXE.lss, esta imagen es cualquiera, la nuestra nos quedó bastante bien y la hice en unos diez minutos la noche anterior al FLISOL-2007, las dimensiones serán 640x420. La imagen por supuesto no puede tener una paleta muy extensa así que usaremos 14 o 15 colores:

[code]
convert -colors 14 menuPXE.png menuPXE.ppm
ppmtolss16 < menuPXE.ppm > menuPXE.lss
[/code]

Et viôla!

[color=#FF0000][size=30]Finales:.:.[/size][/color]

El sistema arranca, funciona e instala todo chévere; con este método el número de instalaciones paralelas de la misma persona crece muchísimo ya que simplemente se usa un punto de red, nuestro servidor DHCP entrega una dirección, se redimensiona y se empieza a instalar.

Como teníamos nuestro propio repositorio entonces para terminar la instalación, bajábamos un script del servidor http que corría en la red, ejecutábamos ese script y dejaba listo el fichero de las interfaces de red, el apt.sources y nos faltó que automáticamente cambie la imagen de fondo por la diseñada por nosotros.

El script actualizaba las listas del repositorio y bajaba los paquetes comunes como por ejemplo el paquete para cambiar el idioma a todas (o casi todas) las aplicaciones. De allí ya solo era cuestión de los gustos del usuario.

Si les falta algo sobre la configuración de tftp, dhcp, nfs y pxe; deberán revisar mi otro documento donde lo explico de mejor manera.