mailto:jcuenca@patan.eleinf.uv.es
PUF: Preguntas Usualmente Formuladas. Las FAQ ;)y los documentos relacionados como el ``Linux Installation HOWTO'' y el ``Linux Install Guide'', no debería intentar la creación de discos de arranque.
Los discos de arranque para Linux pueden ser útiles en muchas situaciones, como por ejemplo:
Hay varias formas de conseguir discos de arranque:
Originalmente escogí la última opción - comprender el funcionamiento de todo para poder creármelo yo mismo. De esta forma, si algo falla, siempre se puede saber que es lo que hay que cambiar para poder arreglarlo.
Los usuarios experimentados de Linux puede que no vean este documento de mucha utilidad, pero los novatos en la administración de un sistema Linux que deseen protegerse de un fallo del disco raíz, o de cualquier otro problema, puede que lo encuentren de más utilidad.
Una nota con respecto a las versiones que aparecen en el documento - este texto ha sido actualizado para dar información sobre los siguientes paquetes en la versión que a continuación se indica:
Copyright © Tom Fawcett y Graham Chapman 1995, 1996, 1997.
Se da permiso para que este material sea utilizado y distribuido libremente, siempre que se cite la fuente original. Se ha tratado que las condiciones del copyright no sean más restrictivas que la versión 2 de la GNU General Public License tal y como la publica la Free Software Foundation.
No se proporciona garantía de ningún tipo. Utilice este material bajo su responsabilidad.
A continuación se incluye la nota de copyright original. Ante cualquier incongruencia la fuente autorizada será la nota original.
Copyright © Tom Fawcett and Graham Chapman 1995, 1996, 1997.
Permission is granted for this material to be freely used and distributed, provided the source is acknowledged. The copyright conditions are intended to be no more restrictive than version 2 of the GNU General Public License as published by the Free Software Foundation.
No warranty of any kind is provided. You use this material at your own risk.
Agradecemos cualquier tipo de comentario, sea bueno o malo, respecto al
contenido de este documento. Por favor, haganos saber de cualquier
error u omisión que encuentre. Envie sus comentarios, correcciones y
preguntas a Tom Fawcett (fawcett@nynexst.com
) o a Graham
Chapman (grahamc@zeta.org.au
).
Queremos agradecer a las siguientes personas por haber corregido algunos errores, así como por proporcionar útiles sugerencias para la mejora de este documento:
Randolph Bentson
Grant R. Bowman
Scott Burkett
Cameron Davidson
Bruce Elliot
Javier Ros Ganuza
HARIGUCHI Youichi
Duncan Hill
Bjxrn-Helge Mevik
Lincoln S. Peck
Dwight Spencer
Cameron Spitzer
Johannes Stille
v.2.3, 4 de Abril de 1997. Cambios en esta versión:
v2.2, 1 de Septiembre de 1996. Cambios en esta versión:
/dev/fd0
en vez de en zImage
.v2.1, 18 de Agosto de 1996. Cambios en esta versión:
Sumario: Hay una limpieza general para reflejar los cambios entre las versiones del núcleo 1.2 y 2.0. Los cambios específicos son:
mkfs -i
debería haber sido mke2fs -i
.dd
para
el dispositivo del disco raíz cero.mke2fs
para crear el sistema de ficheros rootdisk.cpio
como una forma alternativa de
copiar ficheros.v2.0, 12 de Junio de 1996. Cambios en esta versión:
disco RAM
en los
núcleos 1.3.48+/lib
.Memoria de versiones:
Yo clasifico los discos relacionados con el arranque en cuatro tipos. Cuando utilice (aquí y a lo largo de todo el documento) el término ``disco'', lo haré para referirme a discos flexibles, a no ser que explícitamente se diga lo contrario. La mayor parte de lo que aquí se diga será también se podrá aplicar a los discos duros.
A continuación presentamos un sumario con los distintos tipos de discos y sus usos:
Un disco que contiene un núcleo y que puede arrancarse. El disco puede contener un sistema de ficheros y utilizar un programa lector de arranque para arrancar, o puede simplemente contener el núcleo al comienzo del disco. El disco puede ser utilizado para arrancar el núcleo utilizando un sistema de ficheros raíz, que podría ser de utilidad si pierde su programa lector de arranque debido a, por ejemplo, un intento de instalación fallido.
Un disco con un sistema de ficheros conteniendo todo lo necesario para ejecutar un sistema Linux. No tiene necesariamente que contener un núcleo o un programa lector de arranque.
Este disco puede ser utilizado para ejecutar el sistema independientemente de cualquier otro disco, una vez se haya cargado el núcleo. Una característica especial del núcleo permite que se monte otro disco raíz después de cargarse el núcleo, copiando automáticamente el disco raíz a un disco RAM.
Puede utilizar este tipo de discos para comprobar si algún otro disco está corrupto, sin necesidad de montarlo, o para restaurar un disco después de un fallo o de una perdida de ficheros.
Un disco idéntico a un disco raíz, pero que contiene un núcleo y un programa lector de arranque. Puede utilizarse para arrancar desde él, y ejecutar el sistema. La ventaja de este tipo de discos es que lo tiene todo más compacto - todo lo necesario está en un sólo disco. Sin embargo, el incremento gradual del tamaño de todos los programas implica que no siempre será posible meterlo todo en sólo un disco, aun teniendo en cuenta la compresión.
Un disco que contiene un sistema de ficheros, pero que no está pensado para ser montado como el sistema de ficheros raíz. Es un disco de datos adicional. Puede utilizar este tipo de disco para almacenar utilidades adicionales que ocupen demasiado para meterlas en su disco raíz.
El término ``utilidades'' realmente sólo se aplica a disquetes, si en estos disquetes almacena utilidades para la recuperación del sistema.
Probablemente, la aproximación más flexible a la creación de discos rescate sea utilizar un disco para el arranque y otro para el raíz, y uno o más discos para las utilidades necesarias para poder controlar las cosas cuando todo se desmadre.
Todos los sistemas PC comienzan el proceso de arranque ejecutando código contenido en la ROM para leer los sectores comprendidos entre el sector 0, cilindro 0 del disco de arranque y tratar de ejecutarlo. En la mayoría de los discos de arranque, el sector 0, cilindro 0 contiene a una de estas dos opciones:
Si el núcleo de Linux ha sido escrito en un disco como dispositivo puro (raw device), entonces el primer sector será el primer sector del núcleo de Linux, y este sector continuará el proceso de arranque leyendo el resto del núcleo y ejecutando Linux. Para una descripción más detallada de los contenidos del sector de arranque, vea la documentación en lilo-0.15 o superior.
Un método alternativo de almacenar un núcleo en un disco de arranque es crear un sistema de ficheros, no para crear un sistema de ficheros raíz, sino simplemente con el objetivo de instalar LILO y permitir especificar opciones en la línea de órdenes durante el arranque. Por ejemplo, el mismo núcleo puede utilizarse para arrancar utilizando el sistema de ficheros raíz contenido en un disco duro, o contenido en un disco raíz. Ésto podría ser útil si está tratando de reconstruir el sistema de ficheros de un disco duro, y quiere hacer varias pruebas para comprobar los resultados.
El núcleo debe obtener de alguna manera un puntero a la unidad y partición que va a montarse como raíz. Éste puede proporcionarse de distintas formas:
ROOT_DEV = nombre_de_dispositivo
en el fichero
makefile
del núcleo de Linux y reconstruyendo el núcleo (para
obtener información sobre cómo reconstruir el núcleo, lea el PUF de
Linux y mire en /usr/src/linux
). Los comentarios contenidos
en el fichero makefile
de Linux describen los valores válidos
para nombre_de_dispositivo
.rdev
:
rdev nombre_de_fichero nombre_de_dispositivo
Ésto hará que el dispositivo raíz del núcleo contenido en
nombre_de_fichero
sea nombre_de_dispositivo
. Por ejemplo:
rdev zImage /dev/sda1
Hace que el dispositivo raíz del núcleo contenido en zImage
sea
la primera partición de la primera unidad SCSI.Hay algunas formas alternativas de ejecutar la orden rdev
. La
orden:
rdev -h
le mostrará las distintas opciones de este programa.
Normalmente no es necesario configurar el dispositivo raíz para la
utilización de un disco de arranque, ya que el núcleo que utilice
actualmente para arrancar probablemente ya apunte al manejador de
dispositivos raíz. Puede que le haga falta configurarlo si obtiene el
núcleo de otra máquina, o por ejemplo, de una distribución, o si
quiere utilizar el núcleo para arrancar un disco raíz,
etc. Probablemente sea una buena idea comprobar cual es el dispositivo
raíz actual, por si es el adecuado. Para hacer que rdev
compruebe
el dispositivo raíz actual en el núcleo, teclee la orden
rdev <nombre_de_fichero>
Es posible cambiar el dispositivo raíz al que apunta el núcleo por
otros medios distintos de rdev
. Para obtener más detalles, vea el
PUF que hay al final de este documento.
Una vez el núcleo ha sido configurado debería copiarlo al disco de arranque.
Las órdenes descritas un poco más adelante (y a lo largo de este CÓMO)
asumen que los discos han sido formateados. De no ser así, utilice
fdformat
para formatear los discos antes de continuar.
Si el disco no va a contener un sistema de ficheros, entonces podemos
copiar el núcleo utilizando la orden dd
, como sigue:
dd if=fichero_entrada of=nombre_dispositivo
donde fichero_entrada es el nombre del núcleo
y nombre_dispositivo es el nombre del dispositivo puro
del disco, normalmente /dev/fd0
También puede utilizar la orden cp
:
cp nombre_fichero nombre_dispositivo
Por ejemplo:
dd if=zImage of=/dev/fd0
o
cp zImage /dev/fd0
El parámetro seek
de la orden dd
NO debe utilizarse. El
fichero tiene que copiarse al principio del sector de arranque (sector
0, cilindro 0), y será ésto lo que se haga si se omite el parámetro
seek
.
El nombre del dispositivo de salida a utilizar será normalmente
/dev/fd0
para la unidad de disquete principal (i.e. unidad
``A:'' en DOS), y /dev/fd1
para la secundaria. Si utiliza
estos nombres de dispositivos, el núcleo detectará automáticamente los
atributos de las unidades. Los atributos de las unidades se le pueden
pasar al núcleo utilizando otros nombres de dispositivos: por ejemplo
/dev/fd0H1440
especifica una unidad de alta densidad (1.44
Mb). Es muy raro tener que utilizar estos nombres específicos de
dispositivos.
Si el núcleo debe copiarse a un disco de arranque que contiene un
sistema de ficheros, entonces deberemos montar el disco (en un sistema
de ficheros ya existente), y utilizar la orden cp
. Por ejemplo:
mount -t ext2 /dev/fd0 /mnt
cp zImage /mnt
umount /mnt
Observe que para realizar la mayoría de las operaciones contenidas en
este CÓMO, el usuario deberá ser superusuario.
Un disco raíz contiene un sistema Linux completamente operativo, pero sin tener que incluir necesariamente un núcleo. En otras palabras, el disco puede no ser autoarrancable, pero una vez se esté ejecutando el núcleo, el disco raíz contendrá todo los necesario para tener un completo sistema Linux. Para que ésto sea posible, el disco deberá incluir los requerimientos mínimos de un sistema Linux:
Por supuesto, un sistema sólo se vuelve útil cuando puede ejecutar algo, y un disco raíz normalmente sólo es útil cuando puede hacer algo como:
fsck
en su unidad raíz original, siempre que no esté
montada.cpio
, tar
, gzip
y ftape
.Un disco de arranque/raíz es, esencialmente, lo mismo que un disco raíz, con el añadido de un núcleo y un programa lector de arranque como LILO.
Con esta configuración, tendremos que copiar el núcleo al sistema de ficheros raíz, y deberemos, en ese momento, ejecutar LILO para que se instale así la configuración que indique que núcleo arrancar. En el momento de arrancar, será LILO quien ejecute el núcleo contenido en el disco.
Se deberán copiar varios ficheros al disco para que este método funcione. Para obtener más detalles acerca de que ficheros hay que copiar y de la configuración necesaria para que LILO funcione, incluyendo un ejemplo, vea la sección que encontrará más adelante titulada ``LILO''.
Para que un sistema de ficheros raíz en un disco sea eficiente, necesita poder ejecutarse en un disco RAM, i.e. tener una emulación de un manejador de discos en la memoria principal. Ésto evitará tener que ejecutar el sistema a paso de tortuga, que vendría impuesto por la utilización de un disquete. El Ftape HOWTO indica que es obligatorio utilizar un disco RAM cuando se usa Ftape, ya que Ftape requiere una utilización exclusiva del controlador de disco.
Hay una ventaja adicional proveniente de la utilización de un disco RAM - el núcleo de Linux incluye automáticamente la posibilidad de utilizar el disco RAM, por lo que bajo ciertas circunstancias, se copiarán automáticamente los contenidos del disco raíz a un disco RAM, y se cambiará la unidad raíz al disco RAM en vez seguir utilizando el disquete. Ésto conlleva principalmente tres ventajas:
El código correspondiente al disco RAM fue reescrito en su mayor parte cuando se alcanzó la versión 1.3.48. Ahora tiene algunas opciones más y han cambiado algunas de las ordenes que hay para utilizarlo. En la sección Creación Avanzada del Disco de Arranque, más adelante, se discute cómo aprovechar todas estas ventajas.
Debe configurar su núcleo para tener soporte de discos RAM, pero no
hace falta que especifique el tamaño del mismo, ya que se puede
expandir dinámicamente. rdev -r
ya no se usa para especificar el
tamaño del disco RAM, sino para establecer adecuadamente el word
del núcleo relativo al disco RAM. En la sección
Creación Avanzada del Disco de Arranque se discute todo ésto
con más detalle.
Si tiene un núcleo anterior al 1.3.48, le hará falta lo siguiente. Pero no se fie demasiado, ya que ésto se aplica SÓLO si tiene un núcleo anterior al 1.3.48.
minix
o ext2
. Generalmente, el sistema de ficheros preferido
es ext2
. Si tiene un núcleo de Linux anterior al 1.1.73, debería
echarle un vistazo a la sección titulada ``Sistemas de Ficheros'' para
comprobar si su núcleo puede utilizar ext2
. Si su núcleo es viejo
puede que tenga que utilizar minix
. Pero no se preocupe, tampoco
tendrá ningún problema en especial. Puede configurar un disco RAM en el núcleo de varias maneras:
RAMDISK = -DRAMDISK=1440
para definir un disco RAM de 1440 bloques de 1K, el tamaño de un disco de
alta densidad.rdev
, disponible en muchos sistemas
Linux. Esta utilidad muestra o establece los valores de varias cosas
contenidas en el núcleo, incluyendo el tamaño que debe tener el disco
RAM. Para configurar un disco RAM de 1440 bloques en un núcleo que se
encuentre en el fichero zImage
, teclee:
rdev -r zImage 1440
ésto, por supuesto, podría cambiar en el futuro. Para ver que es lo
que hace su versión de rdev
, ejecute la orden:
rdev -h
que debería mostrarle cuales son sus opciones.
ramdisk = 1440
que pide un disco RAM de 1440 bloques de 1K en el momento del
arraque.ramdisk=1440
en la línea de ordenes. Por ejemplo, se podría
introducir la cadena:
zImage ramdisk=1440
Vea la sección ``LILO'' para obtener más detalles.De estos métodos, el más sencillo es configurar LILO, ya que de todas formas va a tener un fichero de configuración LILO, así que ¿por qué no aprovechar, e incluir aquí el tamaño del disco RAM?
En la sección titulada ``LILO'', un poco más adelante, se trata brevemente la configuración del mismo. Pero naturalmente, siempre será aconsejable conseguir la última versión estable y leer la documentación que acompaña al programa.
Los discos RAM pueden hacerse más grandes que el tamaño de un disquete, y hacer que contengan un sistema de ficheros tan grande como el disco RAM. Ésto puede ser de utilidad para cargar todos los programas necesarios para el trabajo de rescate en un solo disco RAM de alto rendimiento. El método para hacerlo está descrito en el PUF bajo la pregunta ``¿Cómo puedo crear un gran sistema de ficheros en un disco RAM?''
Normalmente en un disco no hay suficiente espacio para almacenar todos
los programas que necesitará para ser capaz de realizar las funciones
de rescate típicas, como el análisis, la reparación y la restauración
de unidades de disco corruptas. Con el tiempo incluirá tar
,
gzip
, e2fsck
, fdisk
, Ftape
y demás, con lo que
tendrá bastante para un nuevo disquete, y posiblemente más si quiere
añadir muchas utilidades.
Ésto significa que un paquete de discos de rescate normalmente
necesita de un disco de utilidades, con un sistema de ficheros
conteniendo cualquier fichero extra necesario. Este sistema de
ficheros puede montarse en cualquier punto, como /usr
, en el
sistema de arranque/raíz.
Crear un sistema de ficheros es muy fácil, y está descrito en la sección titulada ``Sistemas de Ficheros''.
El núcleo Linux ahora admite dos tipos de sistemas de ficheros para
los discos raíz que van a ser automáticamente copiados a un disco
RAM. Éstos son minix
y ext2
, de los que ext2
es el
sistema de ficheros preferido. El soporte para ext2
se añadio en
algún lugar entre el 1.1.17 y 1.1.57, no estoy seguro de donde
exactamente. Si tiene un núcleo comprendido en este rango, edite
/usr/src/linux/drivers/block/ramdisk.c
y busque la palabra
``ext2''. Si no la encuentra, entonces tendrá que utilizar el sistema
de ficheros minix
, y además el programa mkfs
para
crearlo. Si utiliza ext2
, puede que encuentre útil la opción
-i
para especificar más inodos de los que vienen por defecto; le
sugiero -i 2000
para que no le falten. Además, puede ahorrar
inodos eliminando muchos ficheros /dev
innecesarios. mke2fs
por defecto creará 360 inodos en un disco de
1.44Mb. En mi disco raíz de rescate actual, con 120 inodos tengo más
que suficiente, pero si incluye todos los dispositivos en el
directorio /dev
entonces puede pasar fácilmente de los
360. Utilizar un sistema de ficheros raíz comprimido permite un
sistema de ficheros mayor, y por tanto más inodos por defecto, pero
puede que todavía necesite reducir el número de ficheros o incrementar
de nuevo el número de inodos.
Para crear un sistema de ficheros ext2
en un disquete en mi
sistema, utilizo la siguiente orden:
mke2fs -m 0 /dev/fd0
La orden mke2fs
automáticamente detecta el espacio disponible y se
configura a si misma de acuerdo con este dato. Si se desea, se puede
especificar el tamaño del disco en bloques de 1Kb para acelerar la
ejecución de mke2fs
. El parámetro -m 0
hace que no reserve
espacio para el root
, y así se deja más espacio libre en disco.
Una forma sencilla de comprobar el resultado es crear un sistema
utilizando la orden anterior (o similar), e intentar el montaje del
disquete resultante. Si es un sistema ext2
, la orden:
mount -t ext2 /dev/fd0 /<mount point>
debería funcionar.
En muchos casos sería posible copiar su núcleo actual y arrancar el disco con él. Sin embargo pueden haber casos en los que sea necesario construir un nuevo núcleo.
Una razón es el tamaño. El núcleo es uno de los ficheros más grandes que hay en un sistema mínimo, por lo que si su objetivo es construir un disco arranque/raíz, tendrá que reducir el tamaño del núcleo tanto como sea posible. En estos momentos el núcleo admite el cambio de disco después del arranque y antes de montar la raíz, por lo que ya no es necesario estrujar el núcleo junto con las demás utilidades en el mismo disco, así que estos comentarios sólo son necesarios si escoge la opción de construir un disco de arranque/raíz.
Hay dos formas de reducir el tamaño del núcleo:
make zImage
Consulte la documentación incluida con las fuentes del núcleo para
encontrar información actualizada sobre la construcción de núcleos
comprimidos. Observe que las fuentes del núcleo están normalmente en
/usr/src/linux
.Habiendo incluido un conjunto mínimo de características en el núcleo, necesitará dar un paso atrás y ver que es lo que debe añadir de nuevo. Probablemente el uso más común de un disco de arranque/raíz sea examinar y restaurar un sistema de ficheros raíz corrupto, y para hacerlo tal vez necesite la ayuda del núcleo.
Por ejemplo, si sus copias de seguridad están almacenadas en una cinta y utiliza Ftape para acceder a su unidad de cinta, si el núcleo no puede acceder a sus unidades de cinta ni a los manejadores que contiene Ftape, no será capaz de restaurar su sistema desde sus cintas de seguridad. Tendrá que reinstalar Linux, obtener y reinstalar Ftape, y entonces tratar de leer sus copias.
Probablemente sea algo deseable mantener una copia de la misma versión de las utilidades de copia utilizadas para crear las copias de seguridad, para de esta forma evitar una perdida de tiempo intentando instalar versiones que puede que no sean capaces de leer sus copias de seguridad.
Lo importante aquí, es que cualquier tipo de soporte de E/S que haya añadido a su núcleo para poder realizar copias de seguridad debería añadirlo a su núcleo de arranque/raíz.
El procedimiento que hay actualmente para construir el núcleo está
descrito en la documentación que viene con éste. Es bastante sencillo
de seguir, así que empiece mirando en /usr/src/linux
. Observe
que si tiene problemas construyendo el núcleo, probablemente no
debería intentar la construcción de un sistema de arranque/raíz.
Tener un directorio /dev
conteniendo un fichero especial para
cada uno de los dispositivos que serán utilizados por el sistema es
obligatorio en Linux. En sí, no es más que un directorio normal, y
puede crearse con la orden mkdir
como cualquier otro
directorio. Los ficheros especiales de dispositivo, sin embargo, deben
crearse de una forma especial, utilizando la orden mknod
.
Aunque existe un atajo --- copie el contenido de su directorio
/dev
, y borre aquellos ficheros que no quiera. El único
requisito es que copie los ficheros especiales de dispositivo con la
opción -R
.
Cuidado: Se ha informado de que la ordenDe esta forma copiará el directorio sin tratar de copiar los contenidos de los ficheros. Lleve cuidado, ya que la diferencia entre utilizar mayúsculas o minúsculas (de la formacp
proporcionada con las versiones más recientes defileutils (3.13)
no respeta la opción-R
.
-r
) es enorme,
porque probablemente acabe intentando copiar el contenido de todos sus
discos duros - ¡o al menos de todo aquello que quepa en un disquete!.
Vaya con cuidado, y utilice la orden:
cp -dpR /dev /mnt
Suponiendo que el disquete está montado en /mnt
. Las opciones
dp
están para asegurarnos de que los enlaces simbólicos se copien
como enlaces (en vez de copiar el fichero al que apuntan) y de que se
respeten los atributos originales de los ficheros, guardando la
información acerca del propietario.
También puede utilizar la opción -p
de cpio
, ya que
cpio
puede manejar correctamente los ficheros especiales de
dispositivo, y no tratará de copiar los contenidos.
Por ejemplo:
cd /dev
find . -print | cpio -pmd /mnt/dev
copiará todos los ficheros especiales de dispositivo de
/dev
en /mnt/dev
. De hecho copiará todos los
ficheros contenidos en el árbol de directorios comenzando en
/dev
, y creará todos los subdirectorios que sean necesarios
en el árbol de directorios destino.
Si desea hacerlo de la forma dificil, utilice ls -l
para mostrar
los números mayor y menor de los dispositivos que desee utilizar, y
creelos en el disquete utilizando mknod
.
Muchas distribuciones incluyen un script llamado MAKEDEV en el
directorio /dev
. Este script puede utilizarse para crear
los dispositivos, pero probablemente sea más sencillo copiar los ya
existentes, especialmente si tenemos en cuenta el propósito de crear
un disco de rescate.
Independientemente de la forma en la que copie el directorio con los dispositivos, merece la pena comprobar que cualquier dispositivo especial que necesite haya sido colocado en el disco de rescate. Por ejemplo, Ftape utiliza los dispositivos de cinta, por lo que necesitará copiar todos los de este tipo.
Observe que se necesita un inodo por cada fichero especial de
dispositivo, y que a veces los inodos pueden ser un recurso muy
escaso, especialmente en los sistemas de ficheros de disquete. Por
tanto se hace especialmente necesario eliminar cualquier fichero
especial de dispositivo que no necesite del directorio /dev
del disquete. Muchos dispositivos son innecesarios en algún sistema
específico. Por ejemplo, si no tiene discos SCSI, puede eliminar sin
ningún problema todos los ficheros de dispositivos que comiencen por
sd
. Igualmente, si no va a tratar de utilizar su puerto serie,
puede quitar todos los ficheros de dispositivos que comiencen por cua
.
¿Sería posible seguir adelante sólo con /dev
, /proc
y /etc
y ejecutar un sistema Linux?. No lo se - nunca lo he
probado. Pero seguro que sería dificil, ya que sin las bibliotecas
compartidas todos sus ejecutables deberían estar enlazados
estáticamente. Un conjunto razonablemente mínimo de directorios
consistirían en los siguientes:
Necesario para realizar E/S con los dispositivos
Necesario para la orden ps
Ficheros de configuración del sistema
Utilidades consideradas como parte del sistema
Bibliotecas compartidas para proporcionar la posibilidad de ejecución
Un punto de montaje para el mantenimiento de otros discos
Utilidades y aplicaciones extras
Observe que el árbol de directorio que hemos presentado aquí es sólo para el disco raíz. En el ``Linux File System Standard'' encontrará mucha más (y mejor) información sobre cómo deben estructurarse los sistemas de ficheros en los sistemas Linux ``estándar''.
Hay cuatro de estos directorios que se pueden crear muy fácilmente:
/dev
ya ha sido descrito arriba en la sección titulada
DISPOSITIVOS./proc
sólo necesita existir. Una vez se ha creado el
directorio con mkdir
no se necesita nada más./mnt
y /usr
se incluyen en la
lista sólo como puntos de montaje para su uso después de que se esté
ejecutando el sistema arranque/raíz. Nuevamente, estos directorios
sólo necesitan crearse.Los tres directorios restantes serán descritos en las secciones siguientes.
Este directorio debe contener ficheros de configuración. En muchos sistemas, éstos pueden dividirse en tres grupos:
Los ficheros que no son esenciales se pueden identificar con la orden:
ls -ltru
Los ficheros se mostrarán en orden inverso a la última fecha de acceso, por
lo que cualquier fichero al que no se haya accedido, puede omitirse en un
disquete de arranque.
En mis discos de arranque, tengo el número de ficheros de configuración por debajo de 15. Gracias a ésto mi trabajo se reduce a tratar con tres tipos de ficheros:
rc.d/* comienzo del sistema y scripts de cambio
del nivel de ejecución
fstab lista de los sistemas de ficheros a montar
inittab parámetros para el proceso de inicio - el
primer proceso que empieza cuando el arranque
passwd lista de entradas (logins)
shadow contiene claves
Estos últimos deberían recortarse en los sistemas seguros para evitar
la copia fuera del sistema de las claves de los usuarios, y para que
cuando arranque desde disquete, se rechacen las entradas indeseadas.
Observe que hay una razón para no recortarpasswd
yshadow
. Tar (y probablemente otros empaquetadores) almacena los nombres del grupo y del usuario con los ficheros. Si restaura los ficheros desde la cinta hasta su disco duro, estos ficheros se restaurarán con sus nombres originales. Si estos nombres de usuario y grupo no existen cuando los ficheros se restauren, el UID/GID no será correcto.
Aparte de ésto, realmente sólo hemos de configurar dos ficheros, y lo que deben contener es sorprendentemente pequeño.
#!/bin/sh
/etc/mount -av
/bin/hostname boot_root
realmente no necesito ejecutar hostname
- pero quedaría mejor si
lo hiciese. En estos momentos mount
sólo es necesario para montar
/proc
para soportar la orden ps
- Linux se podría
ejecutar sin él, pero las operaciones de rescate quedarían muy
limitadas.
/dev/ram / ext2 defaults
/dev/fd0 / ext2 defaults
/proc /proc proc defaults
No creo que la primera entrada sea realmente necesaria, pero me he
encontrado con que si la quito, mount no monta /proc
.Inittab
debería funcionar tal cual, a menos que desee asegurarse
de que los usuarios no pueden entrar por el puerto serie. Para
evitarlo, descomente todas las entradas en /etc/getty
que
incluyan un dispositivo ttys
o ttyS
al final de la
línea. Deje sólo los puertos tty
para poder entrar desde la
consola.
Inittab
define lo que el sistema ejecutará o reejecutará cuando
se encuentre en algunas fases, como el arranque, el cambio al modo
multi-usuario, un corte de energía, y otros. Debe llevar cuidado y
comprobar cuidadosamente que las ordenes introducidas en inittab se
referieren a programas presentes y en el directorio correcto. Si
coloca los programas que necesita en su disco de rescate utilizando la
lista de directorios que se ha dado como muestra en este CÓMO como
guía, y copia su inittab
a su disco de rescate sin comprobarlo,
la probabilidad de un fallo será bastante alta, ya que la mitad de las
entradas en inittab
se referirán a programas que no se encuentran
en el disco o que se encuentran en un directorio distinto.
También hay que hacer notar que hay algunos programas que no se pueden
cambiar de un directorio a otro o fallará el arranque, ya que algunos
programas tienen codificado con una dirección absoluta el nombre de
otro programa que intenta ejecutar. Por ejemplo, en mi sistema
/etc/shutdown
tiene codificada como una dirección absoluta
/etc/reboot
. Si moviese reboot
a /bin/reboot
, y
tratase de ejecutar shutdown
, fallaría ya que no podría encontrar
el fichero reboot
.
Para el resto, sólo ha de copiar todos los ficheros de texto en su
directorio /etc
, así como todos aquellos ejecutables que
encuentre en /etc
y que no esté seguro de no necesitar. Como
guía, consulte el ejemplo de ls
dato en ``Ejemplo de un Listado
de un Directorio ls-lR Arranque/Raíz'' - ésto es lo que yo tengo, y
probablemente sea suficiente para usted copiar sólo estos ficheros -
pero observe que distintos sistemas pueden diferir mucho, por lo que
no se puede asegurar que el mismo conjunto de ficheros en su sistema
sea equivalente a los ficheros en el mio. El único método seguro es
coger inittab
y ver que es necesario y que no.
Ahora muchos sistemas utilizan un directorio /etc/rc.d
conteniendo scripts para distintos niveles de ejecución. El
mínimo absoluto es un sólo script rc, pero probablemente sea
mucho más simple en la práctica copiar el inittab
y el directorio
/etc/rc.d
de su sistema, y cortar los scripts del
directorio rc.d para eliminar el procesamiento de cosas que no sean
relevantes en un sistema contenido en disquete.
Este es un lugar conveniente para colocar las utilidades extras que
necesita para realizar las operaciones básicas, utilidades como
ls
, mv
, cat
, dd
, etc...
Vea la sección titulada ``Ejemplo de un Listado de un Directorio ls-lR
Arranque/Raíz'' para ver la lista de ficheros que tengo en mi
directorio /bin
en mi disco de arranque/raíz. Podrá observar
que no se incluyen ninguna de las utilidades necesarias para recuperar
una copia de seguridad, como cpio
, tar
, gzip
,
etc... Ésto es debido a que las he colocado en un disco de utilidades
separado, para ahorrar espacio en el disquete de arranque/raíz. Una
vez he arrancado desde mi disco de arranque/raíz, entonces se copia a
si mismo al disco RAM dejando la unidad de disquete libre para montar
otro disco, el disco de utilidades. Normalmente lo monto en
/usr
.
La creación de un disquete de utilidades viene descrita más adelante en la sección titulada ``Añadiendo Discos de Utilidades''.
En /lib
puede colocar las bibliotecas compartidas y los
cargadores necesarios. Si las bibliotecas necesarias no se encuentran
en su directorio /lib
entonces será incapaz de arrancar su
sistema. Si es afortunado podrá ver un mensaje de error indicándole el
motivo.
Casi todos los programas necesitan al menos la biblioteca libc:
libc.so.X
Donde X es la actual versión principal. Compruebe su directorio
/lib
. Lleve cuidado con libc.so.4
ya que podría ser un
enlace simbólico a una librería libc
con el número de versión en
el nombre del fichero. Si utiliza la orden:
ls -l /lib
verá algo como:
libc.so.4 -> libc.so.4.5.21
En este caso, la biblioteca libc que tiene es
libc.so.4.5.21
. Ésto es sólo un ejemplo - la biblioteca ELF libc
actualmente es libc.so.5.xxxx
N.T.: Número, naturalmente ;), obsoleto. La biblioteca actual va por la versión libc.so.6.xxxx.
Para encontrar otras librerias debería mirar por los ejecutables que
desee incluir y comprobar sus dependencias. Puede hacer ésto mediante
la orden ldd
. Por ejemplo, en mi sistema la orden:
ldd /bin/mount
produce la salida:
/bin/mount:
libc.so.5 => /lib/libc.so.5.2.18
indicando que /bin/mount
necesita la biblioteca
libc.so.5
, que es un enlace simbólico a libc.so.5.2.18
.
En /lib
debería incluir uno o más cargadores para leer las
bibliotecas. El fichero cargador será o ld.so
(para las librerías
a.out) o ld-linux.so
(para las bibliotas ELF). Si no está seguro
de cual es el que necesita, ejecute la orden file
en la
biblioteca. Por ejemplo, en mi sistema:
file /lib/libc.so.5.2.18
me dice:
/lib/libc.so.5.2.18: ELF 32-bit LSB shared object ...
por lo que necesito un cargador ELF. Si tiene un biblioteca a.out verá
en su lugar algo como:
/lib/libc.so.4.7.2: Linux/i386 demand-paged executable (QMAGIC) ...
Copie el(los) cargador(es) especifico(s) que necesite.
Las bibliotecas y los cargadores deberían comprobarse cuidadosamente con los ejecutables incluidos. Si el núcleo no puede cargar una biblioteca necesaria, lo más normal será que se cuelgue sin ningún mensaje de error.
Para que el disco de arranque/raíz sea útil, se debe poder arrancar. Para conseguirlo, la forma más fácil es instalar un programa de arranque, que es un ejecutable cuyo código se almacena a partir del sector 0, cilindro 0 del disquete. Vea la sección anterior titulada ``DISCO DE ARRANQUE'' para obtener más información acerca del proceso de arranque.
LILO es programa de arranque probado y fiable disponible en cualquier espejo Linux. Permite configurar el arranque, incluyendo:
LILO proporciona un lugar muy conveniente para especificar cómo debe arrancarse el núcleo. Mi fichero de configuración de LILO de mi disco de arranque/raíz, utilizado por LILO 0.15, es:
boot = /dev/fd0
install = ./mnt/boot.b
map = ./mnt/lilo.map
delay = 50
message = ./mnt/lilo.msg
timeout = 150
compact
image = ./mnt/zImage
ramdisk = 1440
root = /dev/fd0
Lleve cuidado porque el fichero de configuración no lo he comprobado recientemente, ya que ahora no utilizo discos de arranque/raíz basados en LILO. No hay ninguna razón para suponer que ya no funcione, pero si lo intenta y falla, deberá leer la documentación de LILO para saber que es lo que ha pasado.
Observe que los sistema de arranque/raíz ya no utilizan LILO, ya que desde 1.3.48, el núcleo admite leer un sistema de ficheros comprimido contenido en el mismo disco que el núcleo. Vea la sección Creación Avanzada del Disco de Arranque para ver más detalles.
Si tiene un núcleo posterior al 1.3.48, la línea ``ramdisk = 1440'' ya no es necesaria y debe ser eliminada.
Observe que boot.b
, lilo.msg
y el núcleo deberán haber sido
copiados primero al disquete utilizando una orden parecida a:
cp /boot/boot.b ./mnt
Si no ha hecho ésto, LILO no se ejecutará correctamente durante el arranque si el disco duro no está disponible, y hay una pequeña incongruepncia en eso de utilizar un disco de rescate que requiere un disco duro para arrancar.
Yo ejecuto lilo utilizando la orden:
/sbin/lilo -C <configfile>
Ejecutándolo desde el directorio que contiene el directorio mnt donde
he montado el disquete. Ésto significa que le estoy diciendo a LILO
que instale el lector de arranque en el dispositivo de arranque
(/dev/fd0
en este caso), para arrancar un núcleo contenido en
el directorio raíz del disquete.
También he especificado que quiero que el dispositivo raíz sea el
disquete, y que quiero que se cree un disco RAM de 1440 bloques de 1K
cada uno, el mismo tamaño que el disquete. Desde el momento en que
haya creado un sistema de ficheros ext2
en el disquete, tendremos
completas todas las condiciones necesarias para que Linux
automáticamente cambie el dispositivo raíz al disco RAM, y copie ahí
el contenido del disquete.
Las características del disco RAM de Linux están descritas arriba, en la sección titulada ``Discos RAM y Sistemas de Arranque/Raíz''.
Puede ser de utilidad la utilización del parámetro single
para
hacer que Linux arranque en el modo de un solo usuario. Serviriá para
evitar que los usuarios se conecten mediante el puerto serie.
También utilizo las opciones ``DELAY'', ``MESSAGE'' y ``TIMEOUT'', para que cuando arranque el disco LILO me de la oportunidad de introducir opciones en la línea de órdenes si así lo deseo. No las necesito por ahora, pero nunca se sabe cuando podría hacerme falta cambiar el dispositivo raíz o montar un sistema de ficheros de sólo lectura.
El fichero que utilizo como mensaje contiene:
Disquete de Arranque/Raíz de Linux
==================================
Introduzca una orden de la forma:
zImage [opciones de la línea de órdenes]
Si no introduce nada, linux se cargará con las
opciones por defecto en 15 segundos.
Sólo es un recordatorio de las opciones que tengo.
Sugerimos a los lectores que lean la documentación de LILO cuidadosamente antes de intentar la instalación de nada. Es relativamente fácil destruir las particiones si utiliza un parámetro ``boot = '' equivocado. Si no tiene experiencia, NO ejecute LILO hasta que esté seguro de haberlo comprendido todo y de haber comprobado todos los parámetros por triplicado.
Observe que debe volver a ejecutar LILO cada vez que cambia el núcleo, para que LILO puede hacer que su fichero mapa describa correctamente el nuevo núcleo. En la práctica es posible reemplazar el núcleo con otro que sea idéntico sin volver a ejecutar LILO, pero es mucho mejor no jugársela - si cambia el núcleo, vuelva a ejecutar LILO.
Otra cosa que creo que podría añadir aquí, ya que se trata de un tema relacionado con LILO, es que si tiene lilo en una unidad que contenga DOS, siempre puede reemplazar el sector de arranque con el lector de arranque de DOS, utilizando la orden de DOS:
FDISK /MBR
donde MBR viene de ``Master Boot Record''. A algunos puristas no les agrada este método, y probablemente tengan razón, pero funciona.
LILO tiene varias opciones que deben ser tenidas en cuenta cuando construimos discos de arranque:
DELAY = nn
en su fichero de configuración de LILO, entonces LILO
parará para permitirle seleccionar que imagen del núcleo desea
arrancar, y para introducir, en la misma línea, cualquier opción.
Por ejemplo:
zImage aha152x=0x340,11,3,1 ro
pasará los parámetros aha152x
al manejador de discos scsi
aha152x
(siempre que este manejador haya sido incluido cuando
construyó el núcleo) y preguntará por el sistema de ficheros raíz que
debe montarse como sólo lectura.
zImage aha152x=0x340,11,3,1 root=/dev/sda8 ro lock
APPEND = "aha152x=0x340,11,3,1"
Las secciones previas de este documento cubren el aspecto básico de la creación de los discos de arranque/raíz, y son aplicables a prácticamente todos los núcleos hasta el presente (2.0, el último núcleo estable).
Los núcleos 1.3.48+ involucraron una reescritura sustancial del código del disco RAM, añadiendo nuevas posibilidades. Estos núcleos pueden detectar automáticamente sistemas de ficheros comprimidos, descomprimirlo y cargarlos en el disco RAM en el arranque. Los sistemas de ficheros raíz podrían colocarse en un segundo disco, y desde el núcleo 1.3.98 (más o menos), los discos RAM pasarón a ser dinámicamente expandibles.
De nuevo, estas nuevas características significaban que los discos de arranque pueden tener una capacidad superior a la que tenían antes. Con compresión, un disco de 1722K podría contener cerca de 3.5 megas en ficheros. Cualquiera que haya creado discos de arranque sabe la cantidad de tiempo que se pierde decidiendo que ficheros eliminar del disco y buscando versión recortadas de aquellos ficheros que se busca incluir para que quepan en un pequeño sistema de ficheros. Con las nuevas posibilidades que se nos abren ya no nos tenemos que preocupar de este problema.
Desafortunadamente, la creación de discos de arranque que exploten estas características es algo un poco más dificil. Para crear un sistema de ficheros comprimido en un disquete, el sistema de ficheros ha de construirse en otro dispositivo, ser comprimido, y ser transferido al disquete. Todo ésto implica una mayor cantidad de pasos.
La estrategia básica es crear un sistema de ficheros raíz comprimido, copiar el núcleo al disquete, decirle al núcleo donde puede encontrar el sistema de ficheros raíz, y copiar el sistema de ficheros raíz comprimido al disquete.
Aquí tenemos un sencillo dibujo ASCII sobre el disquete del que estamos hablando:
|<--- zImage --->|<--- sistema de ficheros raíz comprimido --->|
|________________|_____________________________________________|
espacio en el disquete
Aquí estan los pasos que hay que seguir para crear el disquete de arranque:
El sistema de ficheros raíz lo crearemos más o menos como se esbozó en la sección 2.3 de este documento. La principal diferencia es que ya no se puede crear el sistema de ficheros en un disquete -- debe crearse en un dispositivo aparte, con más capacidad de la que contará cuando pase al disquete.
Para construir un sistema de ficheros raíz, necesita un dispositivo de sobra que sea lo bastante grande. Tiene varias opciones:
mount
y un
umount
especialmente modificados
N.T.: Probablemente los programas. Podrá encontrarlos en:mount
yumount
con que cuente en su sistema sean válidos, siempre que esté relativamente actualizado
ftp://ftp.win.tue.nl:/pub/linux/util/mount-2.5X.tar.gz
donde X es la letra de la última modificación.
Si no tiene dispositivos loop (/dev/loop0
,
/dev/loop1
, etc) en su sistema, tendrá que crearlos
primero. Las ordenes:
mknod /dev/loop0 b 7 0
mknod /dev/loop1 b 7 1
mknod /dev/loop2 b 7 2
...
lo harán. Probablemente sólo necesite loop0
.
Una vez haya instalado los ejecutables mount/umount
especiales, cree un fichero temporal en un disco duro con capacidad
suficiente (p.e., /tmp/fsfile
). Puede utilizar una orden así
dd if=/dev/zero of=/tmp/fsfile bs=1k count=nnn
para crear un fichero con nnn
bloques.
Utilice el nombre de fichero en lugar de DEVICE, más abajo. Cuando
utilice la orden mount
debe incluir la opción ``-o loop'' para
decirle a mount
que utilice un dispositivo loopback. Por
ejemplo:
mount -o loop -t ext2 /tmp/fsfile /mnt
montará /tmp/fsfile
(mediante un dispositivo loopback)
en /mnt
. Con un df
podremos confirmarlo.
/etc/lilo.conf
) una línea
como:
RAMDISK_SIZE = nnn
que determina cuanta memoria tendrá el disco RAM. Por defecto es
4096K.Después de haber escogido una de estas opciones, prepare el dispositivo con:
dd if=/dev/zero of=DEVICE bs=1k count=3000
Esta orden llena de ceros el dispositivo. Este es un paso importante porque el sistema de ficheros contenido en el dispositivo será comprimido más tarde, por lo que todas las partes que no se utilicen deberán llenarse con ceros, para conseguir la máxima compresión.
Sigamos, cree el sistema de ficheros con:
mke2fs -m 0 DEVICE
(Si está utilizando un dispositivo loopback, debería utilizar el
nombre del fichero en vez de este DEVICE. En este caso, mke2fs
le
preguntará si realmente quiere hacer ésto; diga sí.)
Monte el dispositivo:
mount -t ext2 DEVICE /mnt
Proceda como antes, copiando los ficheros en /mnt
, como se
especificó en la sección 2.3.
Después de que haya copiado los ficheros al sistema de ficheros raíz, tendrá que copiar éste a un fichero y comprimirlo. Primero, desmonte el dispositivo:
umount /mnt
(Técnicamente puede copiar el sistema de ficheros sin desmontarlo primero, pero es algo peligroso, y es un mal hábito.)
A continuación, copie los datos del dispositivo a un fichero. Llame al
fichero rootfs
:
dd if=DEVICE of=rootfs bs=1k
Comprímalo. Utilice la opción de `-9' de gzip
para conseguir una
compresión máxima:
gzip -9 rootfs
Puede llevar varios minutos. Cuando acabe, tendrá un fichero
rootfs.gz
, que será su sistema de ficheros raíz comprimido.
Si va apurado de espacio en disco puede combinar dd
y gzip
:
dd if=DEVICE bs=1k | gzip -9 > rootfs.gz
En este punto, debe comprobar el espacio que ocupa el sistema de
ficheros para asegurarse de que tanto éste como el núcleo caben en el
disquete. Un ls -l
le mostrará cuantos bytes ocupan cada
uno; divida por 1024 para determinar cuantos bloques necesitará. Si
obtiene decimales, asegúrese de redondear por arriba.
Por ejemplo, si el tamaño del núcleo es de 453281 bytes, necesitará
ceil(453281 / 1024) = 443
bloques, por lo que ocupará los bloques 0-442 del disquete. El sistema
de ficheros raíz comprimido comenzará en el bloque 443. Recuerde este
número de bloque para utilizarlo en las órdenes que siguen; llámele
COMIENZORAIZ.
Debe decirle al núcleo en que lugar del disquete encontrará el sistema
de ficheros raíz. Dentro de la imagen del núcleo hay un word (2
bytes) relativo al disco RAM que especifica donde se encuentra el
sistema de ficheros, junto con otras opciones. El word viene
definido en /usr/src/linux/arch/i386/kernel/setup.c
y se
interpreta como sigue:
bits 0-10: Desplazamiento en bloques de 1024 bytes del
comienzo del disco RAM (o sea,
COMIENZORAIZ, calculado arriba)
bits 11-13: no utilizado
bit 14: Bandera indicando que debemos cargar el disco RAM
bit 15: Bandera que hará que se pregunte por el
disquete raíz
(Si el bit 15 está activo, durante el arranque se nos pedirá que coloquemos un nuevo disquete en la unidad. Ésto es necesario por si tenemos un sistema de arranque basado en dos discos, sobre el que discutiremos más adelante, en la sección ``Construyendo un arranque con dos discos''. Por ahora, será cero.)
Si el sistema de ficheros raíz comienza en el bloque 443, el word relativo al disco RAM será
1BB (hex) 443 (decimal) (bits 0-10)
+ 4000 (hex) bandera de carga del disco RAM (bit 14)
----------
= 41BB (hex)
=16827 (decimal)
El word relativo al disco RAM debe ponerse en la imagen del
núcleo utilizando la orden rdev -r
, como se explica en la sección
siguiente.
En estos momentos está listo para crear un disquete de arranque. Primero copie el núcleo:
dd if=zImage of=/dev/fd0
A continuación, dígale al núcleo que busque su sistema de ficheros raíz en el disquete:
rdev /dev/fd0 /dev/fd0
Siguiente, tiene que establecer el word relativo al disco RAM en
la imagen del núcleo que ahora reside en el disquete. El word
relativo al disco RAM se puede establecer utilizando la orden rdev
-r
. Utilizando el valor calculado arriba en la sección titulada
``Calculando el espacio'':
rdev -r /dev/fd0 16827
Finalmente, coloque el sistema de ficheros raíz en el disquete, a
continuación del núcleo. La orden dd
tiene la opción seek
que le permite especificar cuantos bloques debe saltarse:
dd if=rootfs.gz of=/dev/fd0 bs=1k seek=443
(El valor 443 es COMIENZORAIZ, de la sección ``Calculando el espacio'', arriba.)
Espere a que la unidad de disco acabe la escritura y habrá terminado.
Si quiere más espacio, puede crear un conjunto de dos discos de arranque. En este caso, el primer disco contendrá solamente el núcleo, y el segundo contendrá el sistema de ficheros comprimido. Con esta configuración podrá utilizar un sistema de ficheros comprimido superior a 1440K.
El conjunto de dos discos lo puede crear utilizando una sencilla variación de las instrucciones dadas anteriormente. Primero, debe establecer la bandera que hace que se pregunte por un disco raíz a 1. El sistema de ficheros debe comenzar en el byte 0 del segundo disquete.
De la sección ``Calculando el espacio'' (arriba), la bandera que preguntará por otro disco RAM (bit 15) debe ser 1, y el desplazamiento del disco RAM debe ser cero. En nuestro ejemplo los nuevos calculos serán:
4000 (hex) Bandera de carga de disco RAM (bit 14)
+ 8000 (hex) Bandera de petición de disco RAM (bit 15)
------------
= C000 (hex)
=49152 (decimal)
que puede utilizarse en con la orden rdev -r
como antes.
Siguiendo las instrucciones de ``Copiando ficheros al disquete''
(arriba), pero utilizando después la orden rdev -r
, ponga un
disquete nuevo en la unidad y ejecute la orden:
dd if=rootfs.gz of=/dev/fd0
La opción seek
ya no es necesaria ya que el sistema de fichero
comienza en el bloque cero.
Cuando construimos discos de rescate, no es raro que las primeras veces que tratemos de arrancar no lo consigamos. El método utilizado generalmente para construir un disco raíz es recoger componentes existentes en su sistema, y tratar de alcanzar el momento en que el sistema contenido en disquetes muestra mensajes en la consola. Una vez comience a hablarle, habrá ganado la mitad de la batalla, ya que a partir de ahora podrá ver que es lo que ocurre, y podrá arreglar los problemas que vayan surgiendo hasta que el sistema funcione suave como la seda. Si el sistema se cuelga sin ninguna explicación, puede ser dificil buscar la causa. Para conseguir que un sistema arranque hasta el estado en que comienza a hablarle requiere que se encuentren presentes y correctamente configurados varios componentes. El procedimiento recomendado para investigar el motivo por el que su sistema no le habla es el siguiente:
/disco_raiz/bin
en vez de
/bin
en su disco raíz.
/lib/libc.so
y
/lib/libtermcap.so
, con los mismos enlaces que tienen en su
directorio /lib
en su disco duro. /dev
de su sistema también existe en su sistema de ficheros
del disquete, donde estos enlaces son dispositivos que ha incluido en
su disquete raíz. En particular, los enlaces /dev/console
son
esenciales en la mayoría de los casos.
/dev/tty1
en su disco raíz.
/dev/null
,
/dev/zero
, /dev/mem
, /dev/ram
y
/dev/kmem
.
Una vez se hayan cubierto estos aspectos generales, hay unos cuantos ficheros que deben comprobarse:
init
como /sbin/init
o
/bin/init
. Asegúrese de que es ejecutable.
ldd init
para comprobar las bibliotecas de
init
. Normalmente sólo es libc.so
, pero compruébelo de todas
formas. Asegúrese de haber incluido todas las bibliotecas necesarias.
file
en la(s) biblioteca(s) indicadas por
ldd
para ver de que tipo son. Asegúrese de tener el cargador de
ficheros adecuado en el disco raíz. El cargador de ficheros es o
ld.so
(para las bibliotecas a.out) o ld-linux.so
(para las
bibliotecas ELF).
/etc/inittab
de su sistema de ficheros
de arranque llama a *getty*
Utilizamos la notación *getty* para indicar programas como getty, p.e. getty, agetty, mgetty, o getty_ps.. Vuelva a comprobarlo en el
inittab
de su
disco duro. Compruebe las páginas man del programa que utilice, para
asegurarse de que hace lo que debe hacer. Inittab
es posiblemente
la parte que puede dar más problemas, ya que su sintaxis y su
contenido depende del programa init
que se utilice y de la
naturaleza del sistema. La única forma de acabar con el problema es
leer las páginas man de init
y de inittab
y averiguar que
es, exactamente, lo que hace su sistema al arrancar. Compruebe, para
asegurarse, que /etc/inittab
tiene una entrada para
inicializar el sistema. Debería contener una orden de la forma
/etc/rc.x
, para ejecutar uno de los scripts de
/etc/rc
. El script específico al que llama inittab
debe existir.
init
, ejecute ldd
o getty
(o
agetty
) para ver que necesita, asegúrese de tener las bibliotecas
y los cargadores necesarios incluidos en su sistema de ficheros raíz.
/etc/ld.so.cache
en su disco de
rescate, vuélvalo a repasarlo todo.
Si init
empieza, pero obtiene un mensaje como:
Id xxx respawning too fast: disabled for n minutes
normalmente será un indicativo de que su *getty* o login está muriendo
tan pronto como comienza. Compruebe los ejecutables *getty* y
login, y las librerías de que dependen. Asegúrese de que la forma de
invocarlos desde /etc/inittab
es correcta. Si obtiene mensajes
extraños de *getty*, puede significar que la forma de llamarlo desde
/etc/inittab
es incorrecta. Las opciones de los programas
*getty* son variables; incluso diferentes versiones de agetty
tienen distintas formas de invocación, formas incompatibles entre
si. Vuelva a comprobar la llamada *getty* si utiliza una versión o un
programa diferente del que utiliza en su disco duro.
Si intenta ejecutar algún programa, como df
, que está en su disco
de rescate, pero obtiene un mensaje como: df: not found
,
compruebe dos cosas:
ldd fichero
para ver que bibliotecas
necesita, y asegúrese de que estas bibliotecas existen. Vea la sección
anterior sobre /lib
.Esta respuesta se ha trasladado a la sección Problemas, arriba.
La forma más fácil es obteniendo un núcleo Slackware de su espejo de Slackware más cercano. Los núcleos de Slackware son núcleos generales que tratan de incluir manejadores para tantos dispositivos como sea posible, por lo que si tiene una controladora SCSI o IDE, tendrá un manejador para ella incluido en el núcleo de Slackware.
Vaya al directorio a1
y seleccione un núcleo IDE o SCSI,
dependiendo del tipo de controladora que tenga. Compruebe el fichero
xxxxkern.cfg
en el núcleo seleccionado para ver los manejadores
que han sido incluidos en el mismo. Si el dispositivo que quiere
instalar está en la lista, entonces el núcleo correspondiente debería
arrancar su ordenador. Recoja el fichero xxxxkern.tgz
y cópielo a
su disquete de arranque, tal y cómo se describe en la sección anterior
sobre cómo hacer discos de arranque.
Debería comprobar el dispositivo raíz del núcleo, utilizando la orden
rdev
:
rdev zImage
rdev
mostrará el actual dispositivo raíz en el núcleo. Si no es el
dispositivo raíz que usted quiere, utilice nuevamente rdev
para
cambiarlo. Por ejemplo, el núcleo que yo probé, tenía como dispositivo
raíz /dev/sda2
, pero mi partición raíz scsi es
/dev/sda8
. Para utilizar un disquete raíz, debe utilizar la
orden:
rdev zImage /dev/fd0
Si quiere saber también cómo configurar un disco raíz Slackware, que va más allá del objetivo de este CÓMO, le sugiero que compruebe el ``Linux Install Guide'' o que obtenga la distribución Slackware. Vea la sección en este CÓMO titulada ``Referencias''.
Si tiene un disquete de arranque sin ningún sistema de ficheros, sólo
tiene que copiar el núcleo a su disquete raíz utilizando la orden
dd
, o utilizando la orden cp
si tiene un disco de
arranque/raíz. Vea la sección titulada ``Arranque'' en este CÓMO para
obtener más detalles acerca de la creación de un disquete de
arranque. En esa sección también encontrará información acerca de cómo
actualizar el núcleo en un disquete de arranque.
Ésta no es realmente una pregunta sobre discos de arranque, pero es tan común, que: la respuesta es, utilice la orden de DOS:
FDISK /MBR
MBR viene de Master Boot Record, y reemplaza el sector de arranque con uno de DOS, sin afectar a la tabla de particiones. Algunos puristas estan en contra de este método, pero incluso el autor de LILO, Werner Almesberger, lo sugiere. Es sencillo, y funciona.
También puede utilizar la orden dd
para copiar la copia de
seguridad que LILO hace del sector de arranque - vea la documentación
de LILO si desea saber cómo hacerlo.
Si no tiene ningún disco de arranque por ahí, probablemente el método más sencillo sea obtener un núcleo Slackware para su tipo de controladora (IDE o SCSI) tal y como se describe arriba en ¿Cómo hago un disco de arranque con un dispositivo XXX?. Podrá arrancar su ordenador utilizando este núcleo, y reparar el problema que sea.
El núcleo que consiga puede que no tenga el dispositivo raíz puesto en
el tipo y partición de disco que usted quiera. Por ejemplo, el núcleo
SCSI general de Slackware tiene el dispositivo raíz puesto en
/dev/sda2
, cuando mi partición raíz de Linux es
/dev/sda8
. En este caso el dispositivo raíz en el núcleo debe
cambiarse.
Todavía puede cambiar las especificaciones del dispositivo raíz y del disco RAM aunque todo lo que tenga sea el núcleo, y algún otro sistema operativo, como DOS.
rdev
cambia las especificaciones del núcleo cambiando los valores
contenidos en el núcleo en lugares específicos, por lo que puede hacer
lo mismo si tiene un editor hexadecimal en el sistema que esté
ejecutando - por ejemplo, el Editor de Disco de las Utilidades Norton
para DOS. Necesitará comprobar y si es necesario cambiar el valor en
el núcleo en los siguientes lugares:
0x01F8 Byte bajo del tamaño de RAMDISK
0x01F9 Byte alto del tamaño de RAMDISK
0x01FC Número menor de dispositivo raíz - ver debajo
0X01FD Número mayor de dispositivo raíz - ver debajo
El tamaño del disco RAM es el número de bloques necesarios para contenerlo. Si quiere arrancar desde un disquete raíz, ponga este valor a 1440, que es 0x05A0, o sea, ponga en el lugar 0x01F8 el valor 0xA0, y en el lugar 0x01F9 el valor 0x05. Ésto dejará suficiente espacio para un disquete de 1.44Mb.
Observe que el significado del word que describe el tamaño del disco RAM en el núcleo ha cambiado en el núcleo 1.3.48. El nuevo significado se describe en la sección Creación Avanzada del Disco de Arranque.
Los números mayor y menor de dispositivo deben ponerse en el dispositivo sobre el que desea montar el sistema de ficheros raíz. Algunos valores útiles que puede seleccionar son:
device major minor
/dev/fd0 2 0 1a. unidad de disquete
/dev/hda1 3 1 partición 1 de la 1a. unidad IDE
/dev/sda1 8 1 partitión 1 de la 1a. unidad SCSI
/dev/sda8 8 8 partitión 8 de la 1a. unidad SCSI
Una vez haya puesto estos valores, podrá grabar el fichero en un
disquete utilizando el Editor de Disco de las Utilidades Norton, o un
programa llamado rawrite.exe
. Este programa viene con varias
distribuciones, incluyendo las distribuciones SLS y Slackware. En un
programa DOS que escribe un fichero ``en crudo'', a un disco,
comenzando en el sector de arranque, en vez de escribirlo en el
sistema de ficheros. Si utiliza las Utilidades Norton, deberá escribir
el fichero en un disquete comenzando en el principio del mismo.
No es en absoluto deseable tener sólo un grupo de discos de rescate - debería tener al menos 2 o 3 por si uno de ellos se estropea.
La forma más sencilla de hacer copias de cualquier disquete,
incluyendo los discos arrancables y de utilidades, es utilizando la
orden dd
para copiar los contenidos del disquete original a un
fichero en su disco duro, y utilizar la misma orden para copiar de
nuevo el fichero a un nuevo disquete. Observe que no necesita, ni
debe, montar los disquetes, ya que dd
utiliza un interfaz de
dispositivo puro.
Para copiar el disquete original, introduzca la orden:
dd if=nombredispositivo of=nombrefichero
donde nombredispositivo es el nombre del dispositivo
de la unidad de disquete
and nombrefichero es el nombre del fichero donde
desea grabar
Por ejemplo, para copiar de /dev/fd0
a un fichero temporal
llamado /tmp/disquete.copia
, yo utilizaría la orden:
dd if=/dev/fd0 of=/tmp/disquete.copia
Omitiendo el parámetro ``count'', como acabamos de hacer, significa que se copiará el disquete entero, de 1440 bloques (si el disquete es de alta densidad).
Para copiar el fichero resultante a un nuevo disquete, utilice la orden inversa:
dd if=nombrefichero of=nombredispositivo
Observe que la afirmación anterior supone que sólo tiene una unidad de disquete. Si tiene dos del mismo tipo, puede copiar los disquetes utilizando una orden como:
dd if=/dev/fd0 of=/dev/fd1
Cuando un dispositivo (de disco) no puede autodetectarse es necesario proporcionarle al núcleo una cadena de parámetros acerca del dispositivo, como:
aha152x=0x340,11,3,1
Esta cadena de parámetros puede proporcionarse de varias formas
utilizando LILO:
Por ejemplo, una cadena de parámetros de ejemplo sería:
zImage aha152x=0x340,11,3,1 root=/dev/sda1 lock
Pasaría la cadena de parámetros del dispositivo, y le preguntaría para
establecer el dispositivo raíz del núcleo en /dev/sda1
y
guardar la orden completa y reutilizarla en todos los arranques
futuros.
Una orden APPEND de ejemplo es:
APPEND = "aha152x=0x340,11,3,1"
Observe que la cadena de parámetros NO debe encerrarse entre comillas en la línea de órdenes, pero DEBE encerrarce en la orden APPEND.
Observe también que para que la cadena de parámetros que hemos
utilizado funcione, el núcleo debe contener el manejador para este
tipo de discos. De no ser así, no hay nada que hacer en la línea de
ordenes, tendrá que reconstruir el núcleo para incluir el manejador
necesario. Para más detalles sobre cómo reconstruir el núcleo, haga un
cd
a /usr/src/linux
y lea el fichero README, lea el PUF
de Linux, y el ``Linux Installation HOWTO''. De forma alternativa puede
obtener un núcleo general para ese tipo de disco e instalarlo.
Se recomienda encarecidamente a los lectores que lean la documentación de LILO antes de experimentar con la instalación del mismo. Una utilización temeraria de la orden ``BOOT'' podría dañar alguna partición.
Para los núcleos 1.3.48+, es mejor crear un sistema de ficheros comprimido tal y cómo se describe en la sección Creación Avanzada de Discos de Arranque. Si su núcleo es anterior al citado, puede actualizarse a la versión 2.0 o mirar más adelante en este CÓMO.
A: cannot
execute B. ¿Por qué?Hay varias casos de nombres de programas que son introducidos
literalmente (con su directorio) en el código de varias
utilidades. Estos casos no se dan en todas partes, pero podría
explicar porqué un ejecutable aparentemente no se puede encontrar en
su sistema, a pesar de que puede ver que sí está ahí. Puede utilizar
la orden strings
y pasar la salida a través de grep
.
Ejemplos conocidos de nombres introducidos literalmente son:
/etc/reboot
literalmente, por lo que reboot
deberá colocarse en el
directorio /etc
.
Para arreglar estos problemas, o movemos los programas al directorio
correcto, o cambiamos los ficheros de configuración
(p.e. inittab
) para que apunten al directorio correcto. En caso
de duda, ponga los programas en los mismos directorios en los que se
encuentran en su disco duro, y utilice el mismo inittab y los mismos
ficheros /etc/rc.d
que aparecen en su disco duro.
Cuando ocurre una cosa así, aparece un mensaje del núcleo parecido a:
Ramdisk driver initialized : 16 ramdisks of 0K size
en el arranque. El tamaño debería ser el tamaño por defecto (de
4096K), o el tamaño especificado en los parámetros del núcleo
ramdisk_size
o ramdisk
. Si el tamaño es de 0K, es
probablemente debido a que se ha establecido el tamaño a 0 por los
parámetros del núcleo en el arranque. Podría estar causado por un
parámetro dominante del fichero de configuración de LILO:
ramdisk 0
Este parámetro se incluyó en los ficheros de configuración de LILO que
venía con algunas distribuciones antiguas, y se puso ahí para
sobreescribir cualquier opción previa del núcleo. Desde 1.3.48 ya no
es relevante, ya que el parámetro del núcleo ramdisk_size
establece el tamaño máximo del disco RAM, no el tamaño que se consigue
en el momento del arranque. No se consigue memoria para el disco RAM
en el momento del arranque.
La solución es eliminar el parámetro del disco RAM de LILO.
Observe que si intenta utilizar un disco RAM de 0K, el resultado puede ser impredecible, y puede que obtenga mensajes de pánico del núcleo (kernel panics).
En esta sección, utilizaremos vvv
en el nombre de los paquetes en
el lugar donde vaya la versión, para evitar referirnos a versiones
específicas. Cuando consiga un fichero, obtenga siempre la última
versión a menos que tenga buenas razones para no hacerlo.
Estas son las fuentes principales de las distribuciones de discos de arranque.
Por favor, utilice un espejo para reducir la carga de estas máquinas.
Escrito por Werner Almesberger. Es un programa lector de arranque excelente, y la documentación incluye información acerca de los contenidos del sector de arranque y de las etapas más tempranas del proceso de arranque.
Haga un ftp de:
tsx-11.mit.edu:/pub/linux/packages/lilo/lilo.vvv.tar.gz
o de sunsite o de algún espejo.
Están disponibles en muchos formatos. Mire en los grupos de noticias
news.answers
y en comp.os.linux.announce
.
Haga un ftp de: sunsite.unc.edu:/pub/Linux/docs
/pub/linux/docs/faqs/linux-faq
/pub/Linux/docs/HOWTO
Si tiene WWW, comience en la página hogar de la documentación de Linux:
http://sunsite.unc.edu/mdw/linux.html
Si está desesperado, envie un mensaje a:
mail-server@rtfm.mit.edu
con la palabra ``help'' en el mensaje, y siga las instrucciones que recibirá por mail.
Nota: si no ha leído el PUF de Linux y los documentos relacionados como el ``Linux Installation HOWTO'' y el ``Linux Install Guide'', no debería tratar de construir disquetes de arranque.
Una descripción excelente de cómo funciona el nuevo código del disco
RAM puede encontrarse con la documentación suministrada con el núcleo
de Linux. Vea
/usr/src/linux/Documentation/ramdisk.txt
. Escrito por Paul
Gortmaker incluye una sección sobre cómo crear un disco RAM
comprimido, parecida a la sección
Creación Avanzada de un Disco de Arranque, en este CÓMO.
Escrito por Scott Burkett. Bootkit proporciona una estructura dirigida por un flexible sistema de menús que controla la creación y los contenidos de un disco de rescate. Utiliza el paquete Dialog para proporcionar bonitos menús, y un sencillo árbol de directorios que contiene definiciones de los contenidos del disco de rescate. El paquete incluye muestras de los ficheros principales necesarios. El objetivo del paquete sólo es proporcionar el sistema de menús; es cosa del usuario arreglar lo que pone en los discos y lo que pone en los ficheros de configuración. Será una buena elección para aquellos usuarios a los que este problema no les preocupe.
Haga un ftp de:
sunsite.unc.edu:/pub/Linux/system/Recovery/Bootkit-vvv.tar.gz
Escrito por Oleg Kibirev. Este paquete se concentra en ahorrar espacio en los discos de rescate haciendo un uso extensivo de la compresión, e implementando los ejecutables mediante scripts. La documentación incluye algunos trucos sobre lo que hacer en varias situaciones de desastre.
Haga un ftp de:
gd.cs.csufresno.edu/pub/sun4bin/src/CatRescue100.tgz
Escrito por Thomas Heiling. Contiene scripts para crear los disquetes de arranque y de arranque/raíz. Depende de versiones específicas de algunas versiones de otros programas, como LILO, y podría necesitar algo de esfuerzo para hacer que los scripts funciones en su sistema, pero podría ser útil como un punto de inicio si quiere scripts más comprensibles que los que se proporcionan en este documento.
Haga un ftp de:
sunsite.unc.edu:/pub/Linux/system/Recovery/rescue.tgz
Escrito por Karel Kubat. SAR crea un disquete de rescate, utilizando varias técnicas para minimizar el espacio necesario en el disquete. El manual incluye una descripción del proceso de arranque/entrada en Linux.
Haga un ftp de: ftp.icce.rug.nl:/pub/unix/SAR-vvv.tar.gz
El manual está disponible mediante WWW en:
http://www.icce.rug.nl/karel/programs/SAR.html
Escrito por Tom Fawcett. Yard crea discos de rescate personalizados
utilizando la opción del disco RAM comprimido de los núcleos más
recientes (1.3.48+). Yard fue diseñado para automatizar la mayoría de
las instrucciones dadas en la sección
Creación Avanzada de Discos de Arranque, más arriba. Además,
Yard comprueba su selección de ficheros (bibliotecas, cargadores,
/etc/fstab
, rc
, y /etc/passwd
) para asegurarse
de que ha incluido todo lo que necesita para hacer un disco de rescate
arrancable. Yard necesita Perl 5 y una versión del núcleo 1.3.48 o
posterior.
La página raíz de Yard está en http://www.cs.umass.edu/~fawcett/yard.html, que siempre debería tener la última versión, además de noticias y fallos recientes. Yard también puede recogerse de http://sunsite.unc.edu/pub/Linux/system/Recovery/
Esta lista muestra los contenidos de los directorios de mis discos raíz y de utilidades. Estas listas se proporcionan sólo como un ejemplo de los ficheros incluidos para crear un sistema que funcione. He añadido algunas notas aclaratorias donde he creído que eran útiles.
total 18
drwxr-xr-x 2 root root 1024 Jul 29 21:16 bin/
drwxr-xr-x 2 root root 9216 Jul 28 16:21 dev/
drwxr-xr-x 3 root root 1024 Jul 29 20:25 etc/
drwxr-xr-x 2 root root 1024 Jul 28 19:53 lib/
drwxr-xr-x 2 root root 1024 Jul 24 22:47 mnt/
drwxr-xr-x 2 root root 1024 Jul 24 22:47 proc/
drwxr-xr-x 2 root root 1024 Jul 28 19:07 sbin/
drwxr-xr-x 2 root root 1024 Jul 29 20:57 tmp/
drwxr-xr-x 4 root root 1024 Jul 29 21:35 usr/
drwxr-xr-x 3 root root 1024 Jul 28 19:52 var/
bin:
total 713
-rwxr-xr-x 1 root bin 7737 Jul 24 22:16 cat*
-rwxr-xr-x 1 root bin 9232 Jul 24 22:48 chmod*
-rwxr-xr-x 1 root bin 8156 Jul 24 22:48 chown*
-rwxr-xr-x 1 root bin 19652 Jul 24 22:48 cp*
-rwxr-xr-x 1 root root 8313 Jul 29 21:16 cut*
-rwxr-xr-x 1 root bin 12136 Jul 24 22:48 dd*
-rwxr-xr-x 1 root bin 9308 Jul 24 22:48 df*
-rwxr-xr-x 1 root root 9036 Jul 29 20:24 dircolors*
-rwxr-xr-x 1 root bin 9064 Jul 24 22:48 du*
-rwxr-x--- 1 root bin 69252 Jul 24 22:51 e2fsck*
-rwxr-xr-x 1 root bin 5361 Jul 24 22:48 echo*
-rwxr-xr-x 1 root bin 5696 Jul 24 22:16 hostname*
-rwxr-xr-x 1 root bin 6596 Jul 24 22:49 kill*
-rwxr-xr-x 1 root bin 10644 Jul 24 22:17 ln*
-rwxr-xr-x 1 root bin 13508 Jul 24 22:17 login*
-rwxr-xr-x 1 root bin 26976 Jul 24 22:17 ls*
-rwxr-xr-x 1 root bin 7416 Jul 24 22:49 mkdir*
-rwxr-x--- 1 root bin 34596 Jul 24 22:51 mke2fs*
-rwxr-xr-x 1 root bin 6712 Jul 24 22:49 mknod*
-rwxr-xr-x 1 root bin 20304 Jul 24 22:17 more*
-rwxr-xr-x 1 root bin 24704 Jul 24 22:17 mount*
-rwxr-xr-x 1 root bin 12464 Jul 24 22:17 mv*
-rwxr-xr-x 1 root bin 20829 Jul 24 22:50 ps*
-rwxr-xr-x 1 root bin 9424 Jul 24 22:50 rm*
-rwxr-xr-x 1 root bin 4344 Jul 24 22:50 rmdir*
-rwxr-xr-x 1 root root 299649 Jul 27 14:12 sh*
-rwxr-xr-x 1 root bin 9853 Jul 24 22:17 su*
-rwxr-xr-x 1 root bin 380 Jul 27 14:12 sync*
-rwxr-xr-x 1 root bin 13620 Jul 24 22:17 umount*
-rwxr-xr-x 1 root root 5013 Jul 29 20:03 uname*
dev:
total 0
lrwxrwxrwx 1 root root 10 Jul 24 22:34 cdrom -> /dev/sbpcd
crw--w--w- 1 root tty 4, 0 Jul 24 21:49 console
brw-rw---- 1 root floppy 2, 0 Apr 28 1995 fd0
lrwxrwxrwx 1 root root 4 Jul 24 22:34 ftape -> rft0
crw-rw-rw- 1 root sys 10, 2 Jul 18 1994 inportbm
crw-rw---- 1 root kmem 1, 2 Jul 28 16:21 kmem
crw-rw---- 1 root kmem 1, 1 Jul 18 1994 mem
lrwxrwxrwx 1 root root 4 Jul 24 22:34 modem -> cua0
lrwxrwxrwx 1 root root 4 Jul 24 22:34 mouse -> cua1
crw-rw-rw- 1 root sys 1, 3 Jul 18 1994 null
brw-rw---- 1 root disk 1, 1 Jul 18 1994 ram
crw-rw---- 1 root disk 27, 0 Jul 18 1994 rft0
brw-rw---- 1 root disk 25, 0 Jul 19 1994 sbpcd
*** Sólo he incluido los dispositivos para las particiones SCSI que uso
*** Si utiliza IDE, tendrá que usar /dev/hdxx en su lugar.
brw-rw---- 1 root disk 8, 0 Apr 29 1995 sda
brw-rw---- 1 root disk 8, 6 Apr 29 1995 sda6
brw-rw---- 1 root disk 8, 7 Apr 29 1995 sda7
brw-rw---- 1 root disk 8, 8 Apr 29 1995 sda8
lrwxrwxrwx 1 root root 7 Jul 28 12:56 systty -> console
*** este enlace de systty a la consola es necesario
crw-rw-rw- 1 root tty 5, 0 Jul 18 1994 tty
crw--w--w- 1 root tty 4, 0 Jul 18 1994 tty0
crw--w---- 1 root tty 4, 1 Jul 24 22:33 tty1
crw--w---- 1 root tty 4, 2 Jul 24 22:34 tty2
crw--w--w- 1 root root 4, 3 Jul 24 21:49 tty3
crw--w--w- 1 root root 4, 4 Jul 24 21:49 tty4
crw--w--w- 1 root root 4, 5 Jul 24 21:49 tty5
crw--w--w- 1 root root 4, 6 Jul 24 21:49 tty6
crw-rw-rw- 1 root tty 4, 7 Jul 18 1994 tty7
crw-rw-rw- 1 root tty 4, 8 Jul 18 1994 tty8
crw-rw-rw- 1 root tty 4, 9 Jul 19 1994 tty9
crw-rw-rw- 1 root sys 1, 5 Jul 18 1994 zero
etc:
total 20
-rw-r--r-- 1 root root 2167 Jul 29 20:25 DIR_COLORS
-rw-r--r-- 1 root root 20 Jul 28 12:37 HOSTNAME
-rw-r--r-- 1 root root 109 Jul 24 22:57 fstab
-rw-r--r-- 1 root root 271 Jul 24 22:21 group
-rw-r--r-- 1 root root 2353 Jul 24 22:27 inittab
-rw-r--r-- 1 root root 0 Jul 29 21:02 issue
-rw-r--r-- 1 root root 2881 Jul 28 19:38 ld.so.cache
*** Muchas cosas quedarán confundidas si en el momento del arranque
*** no está ld.so.cache, pero asegúrese de que incluye ldconfig y de
*** que se ejecuta desde rc.x para actualizarlo
-rw-r--r-- 1 root root 12 Jul 24 22:22 motd
-rw-r--r-- 1 root root 606 Jul 28 19:25 passwd
-rw-r--r-- 1 root root 1065 Jul 24 22:21 profile
drwxr-xr-x 2 root root 1024 Jul 29 21:01 rc.d/
-rw-r--r-- 1 root root 18 Jul 24 22:21 shells
-rw-r--r-- 1 root root 774 Jul 28 13:43 termcap
-rw-r--r-- 1 root root 126 Jul 28 13:44 ttys
-rw-r--r-- 1 root root 0 Jul 24 22:47 utmp
etc/rc.d:
total 5
*** No daré la lata con los scripts de apagado - todo se ejecuta en un
*** disco RAM, por lo que no hay mucho que apagar o desmontar.
-rwxr-xr-x 1 root root 1158 Jul 24 22:23 rc.K*
-rwxr-xr-x 1 root root 1151 Jul 28 19:08 rc.M*
-rwxr-xr-x 1 root root 507 Jul 29 20:25 rc.S*
lib:
total 588
*** Tengo un sistema ELF, así que incluyo el cargador ELF
*** ld-linux.so. Si todavía utiliza a.out, necesitará ld.so. Utilice
*** la orden file para ver que bibliotecas debe incluir.
lrwxrwxrwx 1 root root 17 Jul 24 23:36 ld-linux.so.1 -> ld-linux.so.1.7.3*
-rwxr-xr-x 1 root root 20722 Aug 15 1995 ld-linux.so.1.7.3*
lrwxrwxrwx 1 root root 13 Jul 24 23:36 libc.so.5 -> libc.so.5.0.9*
-rwxr-xr-x 1 root root 562683 May 19 1995 libc.so.5.0.9*
*** Debemos incluir libtermcap
lrwxrwxrwx 1 root root 19 Jul 28 19:53 libtermcap.so.2 -> libtermcap.so.2.0.0*
-rwxr-xr-x 1 root root 11360 May 19 1995 libtermcap.so.2.0.0*
mnt:
total 0
proc:
total 0
sbin:
total 191
*** Utilizo Slackware, que usa agetty. Muchos sistemas utilizan getty.
*** Compruebe su /etc/inittab para ver que programa utiliza. Observe
*** que necesita (a)getty y login para poder empezar.
-rwxr-xr-x 1 root bin 11309 Jul 24 22:54 agetty*
-rwxr-xr-x 1 root bin 5204 Jul 24 22:19 halt*
*** Debe tener éste para arrancar
-rwxr-xr-x 1 root bin 20592 Jul 24 22:19 init*
-rwxr-xr-x 1 root root 86020 Jul 28 19:07 ldconfig*
-rwxr-xr-x 1 root bin 5329 Jul 27 14:10 mkswap*
-rwxr-xr-x 1 root root 5204 Jul 24 22:20 reboot*
-rwxr-xr-x 1 root bin 12340 Jul 24 22:20 shutdown*
-rwxr-xr-x 1 root root 5029 Jul 24 22:20 swapoff*
-rwxr-xr-x 1 root bin 5029 Jul 24 22:20 swapon*
-rwxr-xr-x 1 root root 20592 Jul 27 18:18 telinit*
-rwxr-xr-x 1 root root 7077 Jul 24 22:20 update*
tmp:
total 0
usr:
total 2
drwxr-xr-x 2 root root 1024 Jul 29 21:00 adm/
drwxr-xr-x 2 root root 1024 Jul 29 21:16 lib/
usr/adm:
total 0
usr/lib:
total 0
var:
total 1
*** Varias cosas se quejaban hasta que incluí este fichero
*** y el código /etc/rc.S para inicializar /var/run/utmp, pero
*** no tiene necesariamente que ser así en su sistema.
drwxr-xr-x 2 root root 1024 Jul 28 19:52 run/
var/run:
total 0
total 579
-rwxr-xr-x 1 root root 42333 Jul 28 19:05 cpio*
-rwxr-xr-x 1 root root 103560 Jul 29 21:31 elvis*
-rwxr-xr-x 1 root root 56401 Jul 28 19:06 find*
-rw-r--r-- 1 root root 128254 Jul 28 19:03 ftape.o
-rwxr-xr-x 1 root root 64161 Jul 29 20:47 grep*
-rwxr-xr-x 1 root root 45309 Jul 29 20:48 gzip*
-rwxr-xr-x 1 root root 23560 Jul 28 19:04 insmod*
-rwxr-xr-x 1 root root 118 Jul 28 19:04 lsmod*
lrwxrwxrwx 1 root root 5 Jul 28 19:04 mt -> mt-st*
-rwxr-xr-x 1 root root 9573 Jul 28 19:03 mt-st*
lrwxrwxrwx 1 root root 6 Jul 28 19:05 rmmod -> insmod*
-rwxr-xr-x 1 root root 104085 Jul 28 19:05 tar*
lrwxrwxrwx 1 root root 5 Jul 29 21:35 vi -> elvis*
Estos scripts se proporcionan sólo como ejemplos. Yo los utilizo en mi sistema para crear discos de rescate. Puede encontrar conveniente utilizarlos, pero si es así, lea las instrucciones cuidadosamente - por ejemplo, si especifica un dispositivo de intercambio equivocado, puede encontrarse con que su sistema de ficheros raíz ha sido completa y definitivamente borrado... así que ¡asegúrese de haberlo configurado correctamente antes de utilizarlo!
La parte positiva de los scripts es que proporcionan una forma rápida de obtener un grupo de discos de rescate, haciendo lo siguiente:
rdev
para
configurarlo, tal y como se explicó anteriormente.mkroot
a su sistema y construya un disco
raíz. Utilice la lista de directorios dada anteriormente como guía
acerca de lo que incluir.mkutil
para meter sus utilidades favoritas en uno o más
discos de utilidades.Hay dos scripts:
Ambos están actualmente configurados para ejecutarse en el directorio que contiene a boot_disk y util_disk, cada uno de los cuales contiene todo lo que será copiado a los disquetes. Observe que estos scripts NO configuran y copian automáticamente todos los ficheros por usted - deberá arreglar los ficheros que necesite, crear los directorios y copiar los ficheros a estos directorios. Los scripts son ejemplos que copiarán los contenidos de estos directorios. Observe que son scripts muy primitivos y no están pensados para el usuario novato.
Ambos scripts contienen al principio variables de configuración, que le permitirá configurarlo fácilmente para ejecutarlo en cualquier lugar. Primero, cree el modelo de directorios y copie todos los ficheros necesarios, eche un vistazo a la lista de directorios de ejemplo en la sección previa.
Compruebe las variables de configuración en el script y cámbielas si es necesario antes de ejecutar los scripts.
# mkroot: make a root disk - creates a root diskette
# by building a file system on it, then mounting it and
# copying required files from a model.
# Note: the model to copy from from must dirst be set up,
# then change the configuration variables below to suit
# your system.
#
# usage: mkroot [ -d swap | ram ]
# where swap means use $SWAPDEV swap device
# and ram means use $RAMDISKDEV ramdisk device
# Copyright (c) Graham Chapman 1996. All rights reserved.
# Permission is granted for this material to be freely
# used and distributed, provided the source is acknowledged.
# No warranty of any kind is provided. You use this material
# at your own risk.
# Configuration variables - set these to suit your system
#
#### set the device to use to build the root filesystem on.
#### ramdisk is safer - swap is ok only if you have plenty of
#### free memory. If linux can't swap then things get nasty.
USEDEVICE="ramdisk" # set to either "ramdisk" or "swap"
RAMDISKDEV="/dev/ram" # ramdisk device <==== CHANGE if using ramdisk
SWAPDEV="/dev/sda7" # swap device <==== CHANGE if using swap
FSBLOCKS=3072 # desired filesystem size in blocks
#
#### set name or directory where you have set up your rootdisk
#### model
ROOTDISKDIR="./root_disk" # name of root disk directory
MOUNTPOINT="/mnt" # temporary mount point for diskette
DISKETTEDEV="/dev/fd0" # device name of diskette drive
LOGFL="`pwd`/mkroot.log" # log filename
TEMPROOTFS="/tmp/mkrootfs.gz" # temp file for compressed filesystem
# End of Configuration variables
# Internal variables
ROOTDISKDEV=
case $USEDEVICE in
swap|ramdisk) :;;
*) echo "Invalid setting for USEDEVICE variable"
exit;;
esac
clear
echo " ***************** W A R N I N G ******************
Use this script with care. If you don't understand it, then
exit NOW!"
if [ "$USEDEVICE" = "swap" ]
then
ROOTDISKDEV=$SWAPDEV
echo -e "\nThis script will temporarily remove the swap file $SWAPDEV"
echo "and use the space to build a compressed root filesystem from"
echo "the files in the directory tree below $ROOTDISKDIR. To do this"
echo "safely you must have 8Mb or more of memory, and you should"
echo "switch to single user mode via 'init 1'."
echo -e "\nIf you have used a ramdisk since the last reboot, then"
echo "reboot NOW before using this script."
echo -e "\nIf the script fails, you may not have a swap partition. Run 'free'"
echo "and check the total size to see if it is correct. If the swap"
echo "partition $SWAPDEV is missing, do the following:"
echo " umount $MOUNTPOINT"
echo " mkswap $SWAPDEV"
echo " swapon $SWAPDEV"
echo "to restore the swap partition $SWAPDEV."
else
ROOTDISKDEV=$RAMDISKDEV
echo -e "\nThis script will use a ramdisk of $FSBLOCKS Kb. To do this safely"
echo "you must have at least 8Mb of memory. If you have only 8Mb you should"
echo "ensure nothing else is running on the machine."
echo -e "\nWhen the script is complete, the ramdisk will still be present, so"
echo "you should reboot to reclaim the memory allocated to the ramdisk."
fi
echo -e "
Do you want to continue (y/n)? \c"
read ans
if [ "$ans" != "Y" -a $ans != "y" ]
then
echo "not confirmed - aborting"
exit
fi
echo "Starting mkroot at `date`" > $LOGFL
if [ "$USEDEVICE" = "swap" ]
then
echo "Unmounting swap device $SWAPDEV" | tee -a $LOGFL
swapoff $SWAPDEV >> $LOGFL 2>&1
fi
echo "Zeroing device $ROOTDISKDEV" | tee -a $LOGFL
dd if=/dev/zero of=$ROOTDISKDEV bs=1024 count=$FSBLOCKS >> $LOGFL 2>&1
if [ $? -ne 0 ]
then
echo "dd zeroing $ROOTDISKDEV failed" | tee -a $LOGFL
exit 1
fi
echo "Creating filesystem on device $ROOTDISKDEV" | tee -a $LOGFL
mke2fs -m0 $ROOTDISKDEV $FSBLOCKS >> $LOGFL 2>&1
echo "Mounting $ROOTDISKDEV filesystem at $MOUNTPOINT" | tee -a $LOGFL
mount -t ext2 $ROOTDISKDEV $MOUNTPOINT >> $LOGFL 2>&1
if [ $? -ne 0 ]
then
echo "mount failed"
exit 1
fi
# copy the directories containing files
echo "Copying files from $ROOTDISKDIR to $MOUNTPOINT" | tee -a $LOGFL
currdir=`pwd`
cd $ROOTDISKDIR
find . -print | cpio -dpumv $MOUNTPOINT >> $LOGFL 2>&1
if [ $? -ne 0 ]
then
echo "cpio step failed."
cd $currdir
exit 1
fi
cd $currdir
fssize=`du -sk $MOUNTPOINT|cut -d" " -f1`
echo "Uncompressed root filesystem size is $fssize Kb" | tee -a $LOGFL
echo "Unmounting filesystem from $ROOTDISKDEV" | tee -a $LOGFL
umount $MOUNTPOINT >> $LOGFL 2>&1
echo "Compressing filesystem from $ROOTDISKDEV into $TEMPROOTFS
This may take a few minutes..." | tee -a $LOGFL
# We don't bother with gzip -9 here - takes more than twice as long
# and saves less than 1% in space on my root disk...
dd if=$ROOTDISKDEV bs=1024 count=$FSBLOCKS 2>>$LOGFL | gzip -c > $TEMPROOTFS
fssize=`du -k $TEMPROOTFS|cut -d" " -f1`
echo "Compressed root filesystem size is $fssize Kb" | tee -a $LOGFL
echo -e "Insert diskette in $DISKETTEDEV and press any key
*** Warning: data on diskette will be overwritten!\c"
read ans
echo "Copying compressed filesystem from $TEMPROOTFS to $DISKETTEDEV" | tee -a $LOGFL
dd if=$TEMPROOTFS of=$DISKETTEDEV >>$LOGFL 2>&1
if [ $? -ne 0 ]
then
echo "copy step failed."
exit 1
fi
if [ "$USEDEVICE" = "swap" ]
then
echo "Reinitialising swap device $SWAPDEV" | tee -a $LOGFL
mkswap $SWAPDEV >> $LOGFL 2>&1
echo "Starting swapping to swap device $SWAPDEV" | tee -a $LOGFL
swapon $SWAPDEV >> $LOGFL 2>&1
fi
echo "Deleting $TEMPROOTFS" | tee -a $LOGFL
rm $TEMPROOTFS
echo "mkroot completed at `date`" >> $LOGFL
echo "Root diskette creation complete - please read log file $LOGFL"
# mkutil: make a utility diskette - creates a utility diskette
# by building a file system on it, then mounting it and
# copying required files from a model.
# Note: the model to copy from from must first be set up,
# then change the configuration variables below to suit
# your system.
# Copyright (c) Graham Chapman 1996. All rights reserved.
# Permission is granted for this material to be freely
# used and distributed, provided the source is acknowledged.
# No warranty of any kind is provided. You use this material
# at your own risk.
# Configuration variables...
UTILDISKDIR=./util_disk # name of directory containing model
MOUNTPOINT=/mnt # temporary mount point for diskette
DISKETTEDEV=/dev/fd0 # device name of diskette drive
echo $0: create utility diskette
echo Warning: data on diskette will be overwritten!
echo Insert diskette in $DISKETTEDEV and and press any key...
read anything
mke2fs $DISKETTEDEV
if [ $? -ne 0 ]
then
echo mke2fs failed
exit
fi
# Any file system type would do here
mount -t ext2 $DISKETTEDEV $MOUNTPOINT
if [ $? -ne 0 ]
then
echo mount failed
exit
fi
# copy the directories containing files
cp -dpr $UTILDISKDIR/* $MOUNTPOINT
umount $MOUNTPOINT
echo Utility diskette complete