Creación de un disquete de arranque personalizado

Necesidades de un disquete de rescate decente

En realidad, esta sección es sobre la creación de un disquete de rescate. Como el nombre rescate implica, el sistema anfitrión tiene un problema, con frecuencia la pérdida de información de la partición o corrupción del sistema de ficheros, que impide que arranque y/o funcione normalmente. Por esta razón, no debes depender de recursos procedentes del anfitrión a "rescatar". Asumir que cualquier partición o disco duro estará disponible es una presunción arriesgada.

Atendiendo a los peligros, el disco de rescate creado aquí no tiene dependencia de los recursos del sistema anfitrión, aparte de la arrancabilidad básica y la validez del hardware. Como mínimo, los tipos de fallos mas comunes que requieren de un disco de rescate deben ser resueltos con el contenido del disquete de arranque. Esto debería incluir la común pérdida de particiones (el registro maestro de arranque se ha perddido o está corrupto), corrupción del sistema de ficheros, y poder crear y editar ficheros que puedan haberse perdido o corrompido, posiblemente por efecto de uno de los otros dos problemas.

Debería haber disponibles utilidades adicionales para buscar texto o ficheros, mover y eliminar ficheros y muchas otras operaciones normales que es de esperar que se necesiten durante la reconstrucción.

Este decente disco de rescate mínimo

Aquí la intención es crear un "disquete de rescate" que soportará las operaciónes comunes listadas arriba. Estas funciones se suministran mediante la inclusión de ejecutables seleccionados procedentes de busybox y e2fsprogs. Opcionalmente pueden incluirse también un editor básico y una utilidad rudimentaria de particionado de discos.

Esto, sin embargo, no es el límite. Aquí se describe un disco mínimo, pero puedes añadir todo lo que puedas meter en el disquete. Mas aún, si un disquete no es suficiente para cubrir tus necesidades, puedes hacer un conjunto de rescate multidisquete que lo haga. En esencia, el cielo es el límite. Esto se expone mas adelante. El número de otras variaciones posibles es demasiado grande para mencionarlas aquí.

Construir el disquete de rescate

Prerrequisitos

Deberias disponer de varios disquetes de confianza. Hay quien prefiere usar el comando fdformat para prepararlos debido a que también los verifica. Mira los detalles en su página de manual. Otra buena idea es tener siempre preaparado un duplicado del disquete de rescate, pues se deterioran con el tiempo.

Estas instrucciones asumen que hay instalado un sistema base LFS utilizando el sistema de ficheros ext2/ext3.

Las versiones del núcleo 2.4.22 y 2.6 anteriores a test6 tienen una deficiencia que impiden que busybox y aplicaciones similares arranquen correctamente. Necesitas descargar y aplicar el parche init-1 para corregir esto, permitir que busybox sea usado por nuestra aplicación, y reconstruir tu núcleo. Ten en cuenta las siguientes cuestiones sobre el núcleo mientras lo haces.

Para usar este procedimiento, necesitas tener activado el soporte para el dispositivo de bucle (loopback) en el núcleo de tu anfitrión.

Deberías hacer un núcleo personalizado que incluya solo aquellas características necesarias para rescatar tu sistema, así tendrá un menor tamaño. No tiene sentido construirle soporte para cosas como XFree86, DRI, etc, pues muchos rescates se realizan desde la línea de comandos. En esta línea, si tienes GCC-2.95.3, se sabe que este genera núcleos mas pequeños. Si lo haces no olvides cualquier módulo cargable (que no se mencione aquí) que puedas necesitar. Deben compilarse con el mismo compilador usado para hacer el núcleo.

La imagen de rescate debe incluir soporte para el sistema de ficheros de tu elección (aquí asimimos ext2/ext3), disco de memoria (ramdisk) y disco de memoria inicial (initrd). Desactiva todo lo que puedas de la configuración del núcleo. Deberías mantener el soporte para los sistemas de ficheros proc y tmpfs, pues son de utilidad general. El sistema de ficheros proc se necesita para que mount informe correctamente.

Si instalas solo el conjunto mínimo de componentes mostrado en este documento, necesitarás un núcleo que ocupe 643 bloques o menos. Si quieres los programas opcionales (un editor muy básico como ed, un particionador de discos rudimentario como sfdisk) es necesario que el núcleo sea de 595 bloques o menos. Esto no debería ser un problema a menos que tus necesidades sean esotéricas. En el sistema usado para desarrollar esta versión del procedimiento, usando solo sistemas de ficheros ext2 y sin utilizar para la recuperación la red o CDs, la imagen del núcleo es de solo 481 bloques. Y puede haber mas por ganar, no se examinó detenidamente para encontrar ahorros adicionales.

De aquí en adelante, esta imagen del núcleo se llamará "rescueimage". En realidad, puedes ponerle el nombre que quieras y usar ese nombre en los comandos que lo contengan, en sustitución de "recueimage".

Si no consigues que tu imagen de rescate baje hasta el tamaño necesario para permitir todo lo que necesitas en la imagen de disco de memoria, no te procupes. Siempre puedes construir un conjunto de dos diquetes, uno de arranque y otro como raíz. El núcleo te pedirá que insertes el disquete con el sistema de ficheros raíz. Esto permitirá tener espacio para una imagen comprimida de disco de memoria de 1440 bloques y una imagen de rescate del mismo tamaño.

Los anteriores límites en el tamaño de la imagen de rescate pueden variar al cambiar las configuraciones específicas locales del sistema. Úsalas solo como una guía, y no como la bíblia. El tamaño de la imagen de rescate mostrado por ls -sk es solo una aproximación debido a cierto "aumento". En el sistema usado para desarrollar este versión del procedimiento dicho comando muestra 488 bloques, pero el número real de bloques escritos es de solo 480 y un poco, lo que indica que en realidad ha usado 481 bloques.

Proceso de construcción del disco de rescate

El proceso básico será:

  • crear un punto de montaje para un sistema de ficheros

  • crear un fichero vacio para almacenar el sistema de ficheros

  • vincular el fichero vacío a un dispositivo de bucle

  • crear un sistema de ficheros de 4MB

  • montar el sistema de ficheros

  • añadir componentes al sistema de ficheros

  • crear el initrd comprimido

  • unir la imagen de rescate y el initrd dentro de un disquete

El disco de memoria inicial se cargará automaticamente al arranque si la configuración se hace correctamente.

Crear un punto de montaje y un fichero vació para almacenar un sistema de ficheros

mkdir -p /mnt/loop1
dd if=/dev/zero of=/tmp/rfloppy bs=1k count=4096

Explicación de los comandos

dd: Esta es una utilidad generalizada de copia de entrada a salida que también tiene muchas capacidades de transformación.

if=/dev/zero: Este parámetro asigna el fichero de entrada de dd a un dispositivo que devuelve un flujo infinito de ceros.

of=/tmp/rfloppy: Este parámetro dirige la salida de dd a /tmp/rfloppy.

bs=1k count=4096: Estos parámetros le indican a dd que lea y escriba en "trozos" de 1024 bytes y procese 4096 "trozos".

Vincular el fichero a un dispositivo de bucle, crear un sistema de ficheros y montarlo.

La razón para usar estos comandos es que funcionan sea cual sea la versión de mount (las mas antiguas no tienen la opción -o loop) o si /etc/mtab es un enlace simbólico a /proc (lo que hace que mount no pueda "desvincular" un dispositivo de bucle debido a la información "perdida"). Tras estos tres comandos se facilita un conjunto alternativo de comandos que puedes usar si no tienes ninguna de estas situaciones.

losetup /dev/loop1 /tmp/rfloppy
mke2fs -m 0 -N 504 /dev/loop1
mount -t ext2 /dev/loop1 /mnt/loop1

Explicación de los comandos

losetup /dev/loop1 /tmp/rfloppy: Este comando "vincula" un dispositivo de bucle al fichero vacio.

mke2fs -m 0 -N 504 /dev/loop1: Este comando crea un sistema de ficheros ext2 en el dispositivo de bucle (lo que significa que en realidad es creado en el fichero al que está vinculado el dispositivo de bucle) y no reserva bloques. El parámetro -N 504 causa que solo se asignen 504 inodos, dejando espacio en el sistema de ficheros para otras cosas necesarias.

mount -t ext2 /dev/loop1 /mnt/loop1: Esto monta el sistema de ficheros recién creado igual que si fuese un dispositivo real, como un disco duro o un disquete. Esto le permite operar a todos los comandos normales de I/O como si hubiese presente un dispositivo real.

Si tu mount soporta la opción -o loop y tu /etc/mtab es un fichero real en vez de un enlace simbólico a /proc, los tres comandos anteriores pueden reemplazarse por los dos comandos siguientes:

mke2fs -F -m 0 -N 504 /tmp/rfloppy
mount -o loop /tmp/rfloppy /mnt/loop1

Explicación de los comandos

mke2fs -F -m 0 -N 504 /tmp/rfloppy: Como antes, se crea un sistema de ficheros ext2 de solo 504 inodos y sin bloques reservados, que será vinculado a un dispositivo de bucle. El parámetro -F elimina una pregunta irritante que aparece cuando mke2fs advierte que no estás accediendo a un dispositivo.

mount -o loop /tmp/rfloppy /mnt/loop1: Este comando le indica a mount que vincule el mencionado fichero a un dispositivo de bucle seleccionado automáticamente (el primero disponible) y monte el dispositivo en /mnt/loop1.

Añadir componentes al sistema de ficheros

Una nota de advertencia. Si no estás trabajando dentro de un entorno chroot, asegurate de que no omites accidentalmente la referencia en los comandos a /mnt/loop1. Si lo haces podrías reemplazar los componentes equivalentes de tu anfitrión con los componentes instalados por estos procedimientos. Incluso si estás en un entorno chroot, deberías ser muy cuidadoso si tu entorno es el sistema LFS recién construido que piensas usar como anfitrión en el futuro.

Primero, para tener tanto espacio libre como sea posible, elimina el directorio lost+found, que no es necesario pues solo lo utiliza fsck. Puesto que fsck nunca se ejecutará sobre este sistema de ficheros, es innecesario.

rmdir /mnt/loop1/lost+found/

Ahora crea un conjunto mínimo de directorios:

mkdir /mnt/loop1/{dev,proc,etc,sbin,bin,lib,mnt,usr,var}

Añade los ficheros de dispositivos necesarios a la imagen initrd. Si utilizas devfs, el siguiente comando funcionará bien, pues solo tendrás los dispositivos que utilizas.

cp -dpR /dev/* /mnt/loop1/dev

Si utilizaste MAKEDEV para crear los dispositivos de tu anfitrión, querrás utilizar algo parecido a este comando largo para minimizar el gasto de espacio con inodos innecesarios.

Debes modificar esto para ajustarlo a la configuración de tu imagen de rescate y otras necesidades. Por ejemplo, puede que necesites dispositivos SCSI y puede que no necesites dispositivos "frame buffer" o el directorio de pseudoterminales. Igualmente, el número de discos duros y particiones que incluyas debe ser el mínimo que necesites. No se ha hecho un estudio exaustivo de la siguiente lista, así que se puede ahorrar mas espacio e inodos mediante un "ajuste fino" de este conjunto.

mkdir /mnt/loop1/dev/pts
cp -a \
    /dev/null /dev/console \
    /dev/fb[0-7] /dev/fd /dev/fd0 /dev/fd0h1440 /dev/full \
    /dev/hda* /dev/hdb* /dev/hdc* /dev/hdd* /dev/initctl /dev/kmem \
    /dev/loop[0-3] /dev/lp0 /dev/mem /dev/port \
    /dev/psaux /dev/ram \
    /dev/ram0 /dev/ram1 /dev/ram2 /dev/ram3 /dev/random /dev/rtc \
    /dev/shm /dev/stderr /dev/stdin /dev/stdout /dev/tty \
    /dev/tty[0-9] /dev/ttyS0 /dev/ttyS1 /dev/urandom /dev/zero \
  /mnt/loop1/dev

Qué es necesario en el directorio /etc

Si lo eliges, puedes copiar todo o parte de tus ficheros /etc/passwd y /etc/group. Pero aunque cada uno tenga menos de 1024 bytes perderás dos bloques y dos inodos en tu disco de memoria inicial. Esto en realidad solo importa porque intentamos apretarlo todo en un disquete de 1,44MB. Cada pequeño bit ayuda. La estrategia aquí tomada es crear estos dos ficheros como parte de los procesos de arranque e inicialización del rescate. Los comandos que crean estos dos ficheros serán integrados dentro del guión rcS que linuxrc (en realidad busybox ) invoca tras la carga del initrd. De esta forma no se usan mas inodos o bloques para estos ficheros.

Alguien puede que quisiera copiar su directorio /etc/rc* dentro de la imagen de disco de memoria, pero esto puede no tener valor, aparte de usarlo como archivo en un grave caso de recuperación. Si quieres que el sistema se inicialice automáticamente tras repararlo, puede tener algún sentido. Pero poca gente necesita o quiere que esto suceda. Si el sistema de ficheros del disco duro está corrupto, ¿qué de bueno harán los guiones de montaje? Algunos guiones pueden ser útiles, como el acceso a una red para copiar datos de respaldo cuando el sistema de ficheros sea de nuevo utilizable. El punto es que deberías copiar solo las partes que puedas usar, pues el espacio es un premio en el disquete.

Aquí solo se incluirá fstab. Esto es práctico porque facilita el montaje de las particiones que puedan usarse y también puede ser examinado y usado como guia de lo que está disponible y de lo que puede necesitar reconstrucción. Debido a que puede ser mas largo que necesario, deberías editarlo, eliminar cualquier entrada innecesaria y minimizar los comentarios. No es necesario mas cambios, pues los guiones de arranque no se incluyen y no se hará un montaje automático usando fstab. Si decides incluir algunos guiones de arranque que intenten montar cosas, cambia las entradas de fstab a noauto en el campo de opciones, para que no provoque un intento de montar una partición potencialmente corrupta. Copialo a /tmp, editalo como desees y entonces:

cp -a /tmp/fstab /mnt/loop1/etc

Ahora se añadirá el guión de inicialización. Como se mencionó antes, linuxrc es un enlace simbólico a busybox . Tras la carga del núcleo y del disco de memoria inicial, el núcleo le pasa el control a linuxrc (busybox ). Este quiere ejecutar un guión /etc/init.d/rcS para hacer la configuración inicial.

Si usas devfsd necesitarás ajustar el guión rcS para manejar el inicio de devfsd. Pon los siguientes comandos en /mnt/loop1/etc/init.d/rcS. Puede que también quieras añadir alguno de los procesos mostrados en la versión sin devfs que le sigue.

#!/bin/sh
mount -t devfs devfs /dev
/sbin/devfsd /dev

Si no utilizas devfsd, si no que creaste un directorio /dev estático usando MAKEDEV o un proceso similar, el guión rcS hará cosas algo diferentes. Al mismo tiempo, no olvides que está creando los ficheros /etc/passwd y /etc/group para salvar espacio en el disquete.

El siguiente guión montará /proc, activará la partición de intercambio (no hay peligro si al hacerlo falla) creará los ficheros /etc/passwd y /etc/group, y creará un directorio de registro. Crea el guión con:

mkdir -p /mnt/loop1/etc/init.d
cat >/mnt/loop1/etc/init.d/rcS << EOD
#!/bin/sh
mount -t proc proc /proc
swapon -a

echo "root:x:0:0:root:/root:/bin/bash" > /etc/passwd

cat > /etc/group <<EOF
root:x:0:
bin:x:1:
sys:x:2:
kmem:x:3:
tty:x:4:
tape:x:5:
daemon:x:6:
floppy:x:7:
disk:x:8:
lp:x:9:
dialout:x:10:
audio:x:11:
EOF
chmod 644 /etc/passwd /etc/group

mkdir /var/log

EOD
chmod u+x /mnt/loop1/etc/init.d/rcS

A menos que le añadas muchas cosas a este guión, lo que es aconsejable, lo anterior debería estar razonablemente cerca de lo que necesitas.

Instalar paquetes

Hay dos paquetes que deben instalarse. El paquete busybox incorpora las funciones centrales que suministran un intérprete de comandos y muchas utilidades básicas. Un paquete de sistemas de ficheros, como e2fsprogs o un paquete para el sistema de ficheros que estés usando, proporcionará un conjunto mínimo de utilidades para la comprobación y reconstrucción del sistema de ficheros. No se instalará el paquete completo, solo ciertos componentes necesarios.

Si utilizas devfsd, también necesitarás instalar ese software.

Instala busybox dentro de la imagen del disco de memoria inicial. Busybox incorpora muchas de las funciones de los programas Unix dentro de un ejecutable pequeño.

make &&
make PREFIX=/mnt/loop1 install &&
> /mnt/loop1/var/utmp

Creamos var/utmp porque busybox lo necesita para que el comando reboot funcione correctamente. Si este fichero no existe cuando se inicia busybox, el comando reboot no funcionará. Esto puede ser malo para las personas que no disponen del botón reset.

Si utilizas devfs para crear dispositivos al vuelo y liberar preciosos inodos en el disquete, debes instalar también devfsd para facilitar los dispositivos que busybox espera encontrar. Usa los siguientes comandos para instalarlo.

mv GNUmakefile Makefile &&
make &&
make PREFIX=/mnt/loop1 install &&

Instalar parte de e2fsprogs

Si utilizas el sistema de ficheros ext2 o ext3 (con transaciones), puedes usar los siguientes comandos para instalar la funcionalidad mínima que debería permitirte hacer usables de nuevo tus discos duros. Si utilizas ext3, recuerda que es parte del paquete e2fsprogs y puedes conseguir los componentes, que mayormente son enlaces duros, de los mismos lugares mostrados a continuación. Si utilizas algún otro sistema de ficheros, como reiserfs, debes aplicar los principios que ves aquí para instalar parte del paquete en su lugar.

LDFLAGS='-s'
mkdir build &&
cd build &&
../configure --prefix=/mnt/loop1/usr --with-root-prefix="" \
    --disable-swapfs --disable-debugfs \
    --enable-dynamic-e2fsck --disable-nls --disable-evms \
    --disable-rpath &&
make LDFLAGS="$LDFLAGS" &&
strip -p --strip-unneeded --remove-section=.comment \
    -o /mnt/loop1/sbin/mke2fs misc/mke2fs &&
strip -p --strip-unneeded --remove-section=.comment \
    -o /mnt/loop1/sbin/e2fsck e2fsck/e2fsck &&
chmod 555 /mnt/loop1/sbin/{mke2fs,e2fsck}

Dos útiles utilidades

Hay dos utilidades muy útiles que cualquier disco de rescate debería tener para ayudar a una recuperación mas rápida y exacta. La primera es una utilidad de particionado. El programa sfdisk se usa aquí por su reducido tamaño y gran poder. Si embargo te aviso, no es lo que se considera "amigable". Pero los programas fdisk y cfdisk son sustancialmente mas grandes o requieren mas objetos compartidos, como ncurses.

La segunda utilidad es un editor. Muechos editores gráficos son demasiado grandes por naturaleza y también requieren objetos compartidos adicionales. Por esta razón, aquí se usa ed. Es pequeño, no necesita objetos compartidos adicionales y es un editor basado en expresiones regulares que es el antecesor de casi todos los editores posteriores que soportan edición basada en expresiones regulares, sean gráficos o no. Es un "editor de contexto" y ofrece características de edición poderosas, pero no gráficas. Hay otros muchos editores que pueden ser apropiados, eres libre de usar uno de ellos en su lugar.

Lee los ficheros INSTALL y README de busybox para ver cómo incluir un editor vi. Todavía no ha sido investigado aquí, por lo que puede que sea facil o no meterlo dentro de una única imagen de disquete, como hacemos aquí.

Sfdisk y ed se instalan, esencialmente, copiandolos desde tu anfitrión. Se usa strip solo para asegurar que no tienen "exceso de peso", aunque, en realidad, en la instalación del LFS base ya se debería haber depurado. Usa los siguientes comandos:

strip -p --strip-unneeded --remove-section=.comment \
    -o /mnt/loop1/sbin/sfdisk /sbin/sfdisk
strip -p --strip-unneeded --remove-section=.comment \
    -o /mnt/loop1/bin/ed /bin/ed
chmod 555 /mnt/loop1/sbin/sfdisk /mnt/loop1/bin/ed

Igualmente, recordando tu limitaciones de espacio, copia cualquier otro binario y librería que necesites a la imagen. Usa el comando ldd para ver qué librería necesitarás copiar para cualquier ejecutable. No olvides depurarlos también antes de copiarlos a la imagen o usar strip como antes para "copiarlos".

Ajustar el directorio de librerías

Una vez que tengas instaladas todas las utilidades anteriores y las adicionales que desees, utiliza el comando ldd, como se mencionó antes, sobre aquellos que no se han listado en este documento. Si se necesita alguna librería adicional, añadela a los comandos mostrados abajo.

Si instalaste solo aquellas cosas mostradas arriba, los objetos compartidos necesarios serán muy pocos. Puedes añadirlos a la imagen del disco de memoria con:

strip -p --strip-unneeded --remove-section=.comment \
    -o /mnt/loop1/lib/libc.so.6 /lib/libc-2.3.2.so &&
strip -p --strip-unneeded --remove-section=.comment \
    -o /mnt/loop1/lib/ld-linux.so.2 /lib/ld-2.3.2.so &&
strip -p --strip-unneeded --remove-section=.comment \
    -o /mnt/loop1/lib/libdl.so.2 /lib/libdl-2.3.2.so &&
chmod 555 /mnt/loop1/lib/{libc.so.6,ld-linux.so.2,libdl.so.2}

Advierte que los comandos anteriores cambian el nombre de las librerías, eliminando la necesidad de usar enlaces simbólicos. Si añades otros objetos compartidos adicionales, estate atento ante oportunidades similares y también ante los errores que puedan presentarse.

Crear el initrd comprimido

Desmonta el fichero de bucle. Si usaste la opción -o loop de mount, el "vínculo" entre el dispositivo de bucle y el fichero será eliminado cuando se haga el desmontaje. Simplemente omite losetup -d /dev/loop1 de la siguiente secuencia. El parámetro -9 se usa con gzip para crear la imagen comprimida lo mas pequeña posible. Para asegurar que cabrá en el disquete, lista el tamaño del fichero.

umount /mnt/loop1 &&
losetup -d /dev/loop1 &&  # Omit if mount's -o loop was used
gzip -9 < /tmp/rfloppy > /tmp/rootfs.gz
ls -l /tmp/rootfs.gz

Unir la imagen de rescate y el initrd dentro del disquete

Ahora la imagen de rescate y la imagen del disco de memoria inicial se escribirán al disquete de arranque. Antes de hacer esto, calcula el número de bloques necesario para la imagen de rescate y para el initrd, individualmente, mediante la división de cada tamaño por 1024 y la adición de uno si queda resto. Suma estos dos resultados. El total debe ser 1.440 bloques o menos. Si el total es mayor, no te preocupes demasiado. Mas adelante se muestran los cambios para crear un grupo de dos disquetes. Por supuesto, puedes reexaminar tus elecciones y tratar de reducir la imagen de rescate o la imagen del disco de memoria inicial.

Para crear un disquete único de rescate, usando devfs, utiliza los siguientes comandos. Si usas la configuración estática de /dev utiliza /dev/fd0 en lugar de /dev/floppy/0.

dd if=rescueimage of=/dev/floppy/0 bs=1k
rdev /dev/floppy/0 0,0
rdev -R /dev/floppy/0 0

Explicación de los comandos

rdev /dev/floppy/0 0,0: establece el sistema de ficheros raíz que el núcleo usará durante el arranque. Debido a que se carga como initrd, automáticamente será establecido como el dispositivo raíz, inicialmente. Por tanto, 0,0 le indica "sin valor", dicienlo al núcleo que no monte ningún otro dispositivo. Algunos le pasan /dev/fd0 o algo similar. Pero esto tiene efecto solo cuando linuxrc (en realidad busybox ) termina y se invoca al proceso init. Puesto que esto no se hará aquí, y el disquete no es un sistema de ficheros válido, sería algo inutil. Un disco duro sería mejor elección si estás buscando levantar el sistema automáticamente tras su reparación. Puesto que busybox suministra el comando reboot, la inicialización automática no es necesaria.

rdev -R /dev/floppy/0 0 establecerá a cero las "opciones de la raíz". No tienen uso en esta aplicación.

El dd mostrará algunos resultados, como

        480+1 records in
        480+1 records out

En este ejemplo, la imagen de rescate (el núcleo) tenía un tamaño de 480+1 bloques. Asegurate de que este número, que puede ser diferente para ti, coincide con el que calculaste antes. Ahora necesitas calcular un "número mágico" que será insertado dentro de la imagen de rescate. El valor consiste en tres partes significativas. Dos se exponen aquí. La tercera se toca un poco mas tarde.

Los bits 0 - 10 contendrán el tamaño de la imagen de rescate, en bloques, que calculaste anteriormente y que debe coincidir con el resultado del anterior dd. El bit 14 (el quinceavo bit, que es 2 a la catorceava potencia o 16.384) es una marca que, cuando se establece a 1, le indica al núcleo que debe cargar una imagen del disco de memoria inicial. Para el disquete de rescate único, los dos números 16.384 y 481 (o el número adecuado para el tamaño de tu imagen de rescate) se suman para generar un valor decimal, como 16865. Este valor se inserta en el lugar adecuado de la imagen de rescate mediante el comando rdev ejecutado a continuación.

Inserta el "número mágico" dentro de la imagen de rescate y entonces escribe el sistema de ficheros raíz en el disquete tras la imagen de rescate, ejecutando los siguientes comandos y poniendo el número adecuado. Advierte que el número del parámetro seek debe ser el tamaño, en bloques, de tu imagen de rescate. Si usaste la configuración estática de /dev, utiliza /dev/fd0 en el comando siguiente en lugar de /dev/floppy/0.

rdev -r /dev/floppy/0 16865
dd if=/tmp/rootfs.gz of=/dev/floppy/0 bs=1k seek=481

En este comando, seek se utiliza para posicionarse en el bloque siguiente al final de la imagen de rescate (480+1) y comenzar a escribir el sistema de ficheros raíz al disquete.

Una configuración de rescate de dos disquetes

Si no puedes vivir con un sistema de rescate de un único disquete, aquí está lo que hay que hacer para crear un sistema simple de dos disquetes. Ten en cuenta que las posibilidades finales presentes por la disponibilidad de linuxrc y otros componentes no se exponen aquí. Aquí solo usaremos la capacidad del núcleo para pedir un segundo disquete que contenga la imagen initrd y la carge.

Modifica las instrucciones anteriores como sigue. Primero se necesita un número mágico diferente. El quinceavo bit (bit 14) todavía debe establecerse, pero el tamaño de la imagen de rescate, en bloques, se sustituye con un cero. El tercer componente, que no se explicó arriba, es usado ahora. Este es el dieciseisavo bit (bit 15) del "número mágico". Cuando se establece, le indica al núcleo que le solicite al usuario la inserción del disquete "raíz". Entonces carga la imagen intrd de ese disquete. Debido a que el tamaño de la imagen de rescate se sustituyó por cero, el núcleo inicia la carga a partir del bloque cero (el primero) del segundo disquete.

El dieciseisavo bit (bit 15) representa 2 elevado a la quinceava potencia, o 32.768. Por tanto el nuevo número mágico es 32.768 + 16.384, que es 49.152. Este valor le indica al núcleo que pida, y después carge, una imagen del disco de memoria inicial a partir del primer bloque del disquete insertado. Así que tu primera modificación es en el comando para escribir el "numero mágico" en la imagen de rescate del disquete.

rdev -r /dev/floppy/0 49152

Ten en cuenta que la imagen initrd no se ha copiado todavía al disquete. Extrae el disquete de arranque e inserta otro disquete que almacenará tu sistema de ficheros raíz. Ejecuta estos comandos modificados (no olvides usar /dev/fd0 si no utilizas devfs). Advierte que no se usa un parámetro seek.

dd if=/tmp/rootfs.gz of=/dev/floppy/0 bs=1k

Esto es todo. A partir de aquí las posibilidades solo están limitadas por tu imaginación y tenacidad para añadir mejoras. Y tu voluntad para buscar la documentación disponible. Un buen punto de partida es el directorio "Documentation" del arbol de las fuentes de tu núcleo. Se puede obtener mas ayuda en LFS Hints (por favor, utiliza uno de los sitios réplica disponibles) y TLDP.