2. ISOLINUX

Para poder crear un CDROM autoejecutable, en metadistros hacemos uso de ISOLINUX. Veamos un ejemplo de como crear un CD de estas características con esta aplicación. Las siguientes secciones mostrarán los archivos y configuraciones utilizadas en metadistros para crear un CD autoejecutable con ISOLINUX.

En el ejemplo trabajaremos bajo un directorio vacío: /mnt/metadistros/master. Este será la raíz de nuestro CD. Antes de proceder, creamos el directorio isolinux, que almacenará los archivos necesarios para que ISOLINUX cumpla con su misión. Los archivos que hemos de incluir en el directorio isolinux se listan en las siguientes secciones:

2.1. isolinux.bin

Imagen de arranque para los CDs autoejecutables que utilizan “El Torito”. Este archivo lo provee syslinux [2], copielo al directorio isolinux del CDROM.

2.2. isolinux.cat

Este archivo se crea a la hora de hacer la imagen ISO con mkisofs, por lo que no ha de preocuparnos. Únicamente hemos de tener cuidado de no utilizar ningún archivo con ese nombre bajo el directorio /mnt/metadistros/master/isolinux. Este archivo se utiliza a la hora de crear un CD autoejecutable "El Torito", como es nuestro caso.

2.3. isolinux.cfg

Archivo de configuración de ISOLINUX. Toda la información necesaria para configurar ISOLINUX está disponible en su página, por lo que no me extenderé mucho en su explicación.

El cuadro siguiente muestra el archivo de configuración utilizado en metadistros:

default sbm-usuario

timeout 300
prompt 1
kbdmap spanish.kbd
display isolinux.msg
f1 isolinux.msg
f2 f2.msg
f3 f3.msg

label sbm-usuario
	kernel vmlinuz.usuario
	append lang=es init=/linuxrc apm=power-off hda=scsi hdb=scsi \
               hdc=scsi hdd=scsi hde=scsi hdf=scsi hdg=scsi hdh=scsi \
               vga=785 initrd=initrd.gz quiet nomce
label sbm-servidor
	kernel vmlinuz.servidor
	append lang=es init=/linuxrc verbose apm=power-off hda=scsi \
               hdb=scsi hdc=scsi hdd=scsi hde=scsi hdf=scsi hdg=scsi \
               hdh=scsi vga=normal initrd=initrd.gz quiet nomce
label memtest
	kernel memtest

Las opciones listadas en el cuadro anterior serán brevemente explicadas a continuación:

  • default”: opciones por defecto para el arranque por defecto, si no se pasa ningún parámetro en el arranque, se aplicarán las opciones aquí listadas.

  • timeout”: tiempo de espera antes de comenzar el arranque desde el CD (en unidades de 1/10 s).

  • prompt”: si el valor está a 1, el arranque mostrará un prompt (boot: ). Si el valor está a 0, el arranque sólo mostrará el prompt si se pulsan las teclas Alt o Shift.

  • kbdmap”: carga el mapa de teclado indicado.

  • display”: muestra el archivo indicado antes del prompt.

  • f1, f2 y f3”: muestra los archivos indicados al pulsar las teclas de función en el prompt.

  • label”: etiqueta que identifica una determinada imagen y sus opciones asociadas (sobreescribirán la opciones por defecto).

  • kernel”: imagen a utilizar para el arranque.

  • append”: opciones pasadas a la imagen definida en la etiqueta de la que cuelga.

2.4. isolinux.msg

En nuestro caso, este archivo contiene el “saludo” inicial de la metadistribución[3], y tiene un aspecto similar a:

^O17^L^Xlogo.16

Sistema Base Metadistros 0.1         http://metadistros.hispalinux.es/
Presione las teclas F2 y F3 para ver la ayuda.

Si se fija, al comienzo del archivo, hay una serie de códigos especiales que ISOLINUX se encarga de interpretar[4]. Veamos que hacen estos códigos:

  • ^O17 (Ctrl+o17): Establece como color de fondo (primer número) un azul oscuro y de primer plano (segundo número) un gris claro.

  • ^L (Ctrl+l): Borra la pantalla y establece los colores definidos anteriormente.

  • ^Xlogo.16 (Ctrl+xlogo.16): muestra el gráfico incluido en el archivo logo.16.

[Note]Nota

Si utiliza vi(m) como editor, para teclear los caracteres de control anteriormente listados, ha de teclearlos en modo visual. De forma que, si queremos añadir el código ^L (Ctrl+L) hemos de hacer lo siguiente: entramos en modo inserción, si no lo estábamos ya. Pulsamos Ctrl+v para entrar en modo visual y seguidamente pulsamos Ctrl+l. Una vez realizado esto, ya tendremos correctamente tecleado el código de control.

2.5. logo.16

Imagen en formato LSS16. Syslinux provee un script (ppmtolss16) en perl para producir este tipo de imágenes. Estas imágenes se muestran en una resolución de 640x480 pixels y 16 bits de profundidad de color.

Cuando se entra en modo gráfico, los colores definidos con los códigos antes comentados (por ejemplo: ^014) se tratan de forma distinta: el color de fondo se ignora, y los colores de primer plano se especifican en la imagen (16 en total). Esto se especifica a la hora de crear la imagen en formato LSS16 con ppmtolss16.

Veamos como se crea una imagen de este tipo con ppmtolss16, pero antes echemos un vistazo a la cabecera del script en cuestión:

##
## ppmtolss16
##
## Convert a "raw" PPM file with max 16 colors to a simple RLE-based format:
##
## uint32 0x1413f33d    ; magic (littleendian)
## uint16 xsize         ; littleendian
## uint16 ysize         ; littleendian
## 16 x uint8 r,g,b     ; color map, in 6-bit format (each byte is 0..63)
##
## Then, a sequence of nybbles:
##
## N    ... if N is != previous pixel, one pixel of color N
## ... otherwise run sequence follows ...
## M    ... if M > 0 then run length is M+1
## ... otherwise run sequence is encoded in two nybbles,
##     littleendian, +17
##
## The nybble sequences are on a per-row basis; runs may not extend
## across rows and odd-nybble rows are zero-padded.
##
## At the start of row, the "previous pixel" is assumed to be zero.
##
## BUG: This program does not handle comments in the header, nor
## "plain" ppm format.
##
## Usage:
##
##      ppmtorle16 [#rrggbb=i ...] < input.ppm > output.rle
##
## Command line options of the form #rrggbb=i indicate that
## the color #rrggbb (hex) should be assigned index i (decimal)
##

Como podemos observar, esta breve explicación nos da una idea de como funciona este script.

Antes de poder obtener la imagen en formato LSS16, hemos de seleccionar la imagen a utilizar, esta ha de estar en formato PPM, con un máximo de 16 colores. Puedes utilizar The Gimp! para obtenerlo a partir de una imagen, o ImageMagick de la siguiente forma:

$ convert -depth 8 imagen.png imagen.ppm

Una vez tenemos la imagen en formato PPM, procedemos a transformarla a formato LSS16, para ello, tecleamos:

$ ppmtolss16 < imagen.ppm > logo.16

Hecho esto, copiamos el archivo logo.16 al directorio isolinux.

[Note]Nota

En este apartado es necesario profundizar más, por favor añada lo que crea conveniente.

2.6. f2.msg y f3.msg

Los archivos de esta sección son los encargados de mostrar la ayuda al usuario en el arranque. Normalmente tienen las distintas opciones que se le pueden pasar al prompt en el arranque. Como se ha definido en el archivo de configuración (Sección 2.3, “isolinux.cfg”), a estos archivos se accede pulsando las teclas F2 y F3. Su contenido es el siguiente:

Archivo f2.msg

^Y^O0f^L                       -  Basic boot options -

    ||   At the prompt type "sbm-usuario option", "memtest" for RAM     ||
    ||         test or just hit enter if no options are needed.         ||
    ||                                                                  ||
    ||   [ F1 to redisplay boot graphic || F3 for additional options ]  ||
       -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -
 
  - - - - - - -  - - - - - - 
| lang|keymap=es|de|be|bg    |
|            =ch|cn|cs|cz    |
|            =da|dk|fi|fr     \       specify language and/or keymap
|            =it|ja|nl|pl     / (default settings: lang=es and keymap=es )
|            =ru|sk|tr|tw    |
|            =uk             |
  - - - - - - -  - - - - - -

interactive    -->       Interactive setup for experts
verbose    ---->       Show information at boot up progress
showdebug    --->       Show debug information
vga=normal  -->        No-framebuffer mode

install    -->         Install mode (no live CD)

Archivo f3.msg

^Y^O0f^L                    -  Additional boot options -

    ||   At the prompt type "sbm-usuario option", "memtest" for RAM     ||
    ||         test or just hit enter if no options are needed.         ||
    ||   [ F1 to redisplay boot graphic || F2 for basic options ]       ||

  - - - - - - -  - - - - - 
| ip=192.168.1.1           |
| broadcast=192.168.1.255   \              Network configuration
| netmask=255.255.255.0     /  (Set this variables for personal configuration)
| gateway=192.168.1.1      |
  - - - - - - -  - - - - - 

ramsize=1000000  >>>  Default maximum size of dynamic ramdisk in kilobytes

  -----------
| noscsi      >>>>>>>>>>>  not scan for scsi devices
| dofirewire  >  modprobes firewire modules in initrd (for firewire cdroms,etc)
| nousb       >>>>>  disables usb module load from initrd, disables hotplug
| doataraid   >>>>>>  loads ide raid modules from initrd
| dopcmcia    >>>>>>>>>>>  starts pcmcia service
| cdcache     >>>  Cache the entire runtime portion of cd in ram, This
  -----------      uses a lot of RAM , but allows you to umount /mnt/cdrom
                   and mount another cdrom.

Al igual que en la Sección 2.4, “isolinux.msg”, los archivos de esta sección también poseen caracteres de control. Cómo en ambos archivos son los mismos códigos, los explicaré una vez:

  • ^Y (Ctrl+Y): pasamos a modo texto, si estábamos en modo gráfico.

  • ^O (Ctrl+O0f): establecemos los colores negro y blanco para el fondo y el primer plano de la pantalla, respectivamente.

  • ^L (Ctrl+L): borra la pantalla y establece los colores definidos.

2.7. memtest

Memtest86 es un programa de diagnóstico para la memoria RAM. La imagen necesaria para arrancar Memtest86 en el arranque está incluida en el archivo de distribución del programa (que puede encontrar aquí), por lo que lo copiaremos al directorio /mnt/metadistros/master/isolinux.

Para poder utilizar este programa de diagnóstico, en el prompt de arranque teclearemos:

boot: memtest
Una vez hecho esto, Memtest86 comenzará a ejecutarse:

Captura de pantalla de Memtest86

Captura de pantalla de Memtest86

2.8. spanish.kbd

Mapa de teclado utilizado en el prompt de arranque. El siguiente ejemplo creará [5] el mapa de teclado para usuarios españoles. Necesitamos el programa keytab-lilo [6] y la definición del teclado español[7], en este caso. Una vez tenemos todo esto, ejecutaremos:

$ keytab-lilo /usr/share/keymaps/i386/qwerty/es.kmap.gz > spanish.kbd
Loading /usr/share/keymaps/i386/qwerty/us.kmap.gz
Loading /usr/share/keymaps/i386/qwerty/es.kmap.gz
$ 
Una vez finalice su ejecución, tendremos un nuevo archivo, spanish.kbd, el cual copiaremos al directorio /mnt/metadistros/master/isolinux. De esta forma, y como vimos en la Sección 2.3, “isolinux.cfg”, al arrancar el sistema desde el CDROM, tendremos nuestro mapa de teclado en español.

2.9. vmlinuz.usuario

Núcleo para nuestra distribución. En este caso se ha utilizado el núcleo destinado a sistemas de escritorio que provee Metadistros. Puede descargarlo de cualquier mirror disponible.

2.10. initrd.gz

En este apartado vamos a crear un archivo initrd, que no es otra cosa que un un disco RAM que es inicializado (es decir, cargado) por el gestor de arranque antes de cargar e iniciar el núcleo del sistema (como dice la página del manual man initrd).

En el siguiente ejemplo crearemos un archivo de 5 megabytes de tamaño, en cuyo interior se podrán colocar los scripts, programas, módulos y dispositivos necesarios para arrancar el sistema. La forma de crear este archivo es con el comando dd, como vemos a continuación:

$ dd if=/dev/zero of=initrd bs=5000k count=1
1+0 registros leídos
1+0 registros escritos
5120000 bytes transferred in 0,238769 seconds (21443318 bytes/sec)

Una vez ejecutado el anterior comando, tendremos disponible un archivo llamado initrd, el cual ya podremos formatear con el sistema de archivos ext2:

$ mke2fs -v -N 7000 initrd
mke2fs 1.33 (21-Apr-2003)
initrd is not a block special device.
Proceed anyway? (y,n)

A esta pregunta respondemos afirmativamente, con lo que nos creará un sistema de ficheros ext2 en el interior del archivo initrd:

Filesystem label=
OS type: Linux
Block size=1024 (log=0)
Fragment size=1024 (log=0)
7000 inodes, 5000 blocks
250 blocks (5.00%) reserved for the super user
First data block=1
1 block group
8192 blocks per group, 8192 fragments per group
7000 inodes per group

Writing inode tables: done
Writing superblocks and filesystem accounting information: done

This filesystem will be automatically checked every 24 mounts or
180 days, whichever comes first.  Use tune2fs -c or -i to override.
[Note]Nota

Hemos pasado el parámetro -N 7000 a mke2fs, que sobreescribe el número de inodos que se crearán por defecto, al número especificado en el parámetro. Esto es necesario debido a que crea un número muy bajo de inodos por defecto, que al utilizar archivos de tamaño muy pequeño y en gran cantidad, se terminan en seguida.

[Warning]Aviso

El número de inodos especificados anteriormente es orientativo y puede ser necesario variarlo dependiendo del tamaño del archivo initrd. Dicho número, en este caso, no pude ser superior a 7200 aprox., ya que si se eleva por encima de dicha cifra, el sistema no arrancará.

Ahora sólo nos queda afinar el sistema de ficheros que hemos creado e incorporarle la información necesaria en su interior. En el afinado, ampliaremos el número de veces que el sistema puede ser montado sin necesidad de que este sea chequeado. Este número lo ajustaremos alto, ya que montaremos muchas veces el archivo en cuestión:

$ tune2fs -c 1000 initrd
tune2fs 1.33 (21-Apr-2003)
Setting maximal mount count to 1000

Ahora ya estamos en disposición de montar el archivo que hemos creado, para ello teclearemos, por ejemplo:

$ mount -o loop -t ext2 initrd /mnt/initrd

Una vez montado, copiaremos los archivos necesarios en su interior (vea la Sección 3, “Contenido de initrd”) y lo comprimiremos (una vez desmontado).

$ umount /mnt/initrd
$ gzip -9 initrd

2.11. Resumiendo

Hasta aquí hemos visto los archivos utilizados en metadistros para ISOLINUX, en la siguiente sección, veremos el contenido del archivo initrd.

El listado de archivos que se ve a continuación, son los que hemos repasado en esta sección:

$ tree isolinux
isolinux/
|-- f2.msg
|-- f3.msg
|-- initrd
|-- isolinux.bin
|-- isolinux.cat
|-- isolinux.cfg
|-- isolinux.msg
|-- logo.16
|-- memtest
|-- spanish.kbd
`-- vmlinuz.usuario


[2] Puede encontrar el archivo utilizado en metadistros en su CVS

[3] Esto se ha definido así en el archivo isolinux.cfg con la opción “display isolinux.msg”, que podremos ver en la Sección 2.3, “isolinux.cfg”

[4] Para más información sobre estos comandos, visite la sección “What is the DISPLAY File Format?” de la página de syslinux

[5] La información de como crear el mapa de teclado se ha obtenido de un mensaje enviado por Luis Llorente a la lista de correo de Metadistros.

[6] Viene en el mismo paquete que LILO

[7] Viene por defecto en las distribuciones GNU/Linux, y se denominará es.kmap.gz o similar.