Página siguiente Página anterior Índice general

4. Construcion de un sistema de ficheros raiz.

Crear un sistema de ficheros raiz involucra selecionar los ficheros necesarios para que el sistema fucione. En esta secion describiremos como construir un sistema de ficheros raiz comprimido. Una opcion menos comun es construir un sistema de ficheros dsin comprimir en un disquete que puede ser directamente montado como raiz; esta alternativa es descrita en la seccion Sistema de ficheros Raiz sin disco Ram.

4.1 Prologo.

Un sistema de ficheros raiz debe contener todo lo necesario para soportar un completo sistema Linux. Para permitir esto, el disco debe incluir lo minimo requerido por un sistema Linux.

Por supuesto, un sistema solo llega a ser util cuando puedes ejecutar algo en el, y un disco root, normalmente solo es util cuando puedes hacer algo de esto:

Describiremos como construir un sistema de ficheros comprimido, llamado asi por que esta comprimido en el disco, y cuando arranca, es descomprimido en un disco-ram. Con un sistema de ficheros comprimido puede meter muchos ficheros ( aproximadamente seis megabytes) en un disco standard 1440K. Debido a que el sistema de ficheros es mucho mas grande que el disco, no puede ser construido sobre el disco. Tenemos que construirlo en otro sitio, comprimirlo y copiarlo despues al disco.

4.2 Crear un sistema de ficheros.

Para construir dicho sistema de ficheros raiz, necesita un dispositivo de almacenamiento con sitio suficiente para tener todos los ficheros antes de comprimirlos. Deberia necesitar un dispositivo con capacidad para al menos cuatro megabytes. Hay algunas eleciones:

Una vez ha elegido una de estas opciones, prepare el DISPOSITIVO con:

        dd if=/dev/zero of=DEVICE bs=1k count=3000

Este comando rellena de ceros el dispositivo. Este paso es importante porque el sistema de ficheros en el dispositivo sera comprimido despues, por lo que toda la parte no utilizada deberia ser rellenada con zeros para asegurar la maxima compresion.

Siguiente, creee el sistema de ficheros. El kernel de liux reconoce dos tipos de sistemas de ficheros pra discos raiz que son automaticamente copiados a disco-ram. esto son minix y ext2, aunque es preferible usar ext2 como sistema de ficheros. si usa ext2, podria encontrar util usar la opcion -i para especificar mas inodos que los dados por defecto; -i 2000 es una sugerencia para no acabar sin inodos. Alternativamente, puede salvar una gran cantidad de inodos eliminando un monton de ficheros /dev innecesarios. mke2fs crear por defecto 360 inodos en un disco 1.44Mb. Yo encuentro que 120 inodos es suficiente para mi actual disco root de rescate, pero si incluye todos los dispositivos del directorio /dev entonces facilmente escedera de 360. Usando un disco raiz comprimido le permite sistemas de ficheros mayores, y mas inodos por defecto, pero puede serguir necesitando reducir el numero de ficheros para incrementar el numero de inodos.

Entonces el comando que usara deberia ser similar a:

mke2fs -m 0 -i 2000 DEVICE

(Si va a utilizar el dispositivo loopback, debera utilizar el fichero de disco en lugar de DEVICE. en este caso, mke2fs le preguntara si realmente desea hacer esto; diga que si.)

The mke2fscommand will automatically detect the space available and configure itself accordingly. The -m 0 parameter prevents it from reserving space for root, and hence provides more usable space on the disk.

el comando mke2fs detectara automaticamente el espacio disponible y se configurara en funcioin de esto. el parametro -m 0 le previene de reservar espacio para el root, y asi proporciona mas espacio utilizable en el disco.

Despues, monte el dispositivo.

        mount -t ext2 DEVICE /mnt

(debe crear el punto de montaje /mnt si este no existe todabia.) En las siguiente secciones, en todos los nombre de directorios de destino se asume que son relativos a /mnt.

4.3 Rellenar el sistema de ficheros.

He aqui el minimo conjunto razonable de directorios de un sistema de ficheros raiz:

(La estructura de directorios presente aqui es solo para discos root. Los sistemas Linux reales tiene una estructura mas compleja y rigida sugeta a una politica, llamada Sistema de Ficheros Standar (File System Standard) que determina donde debe de ir cada directorio.)

Hay tres directorios que estaran vacios en el sistema de ficheros raiz, por lo que solo necesita crearlos con mkdir. el directorio /proc es basicamente el lugar donde el sistema de ficheros proc es oclocado. los directorios /mnt y /usr son solo puntos de montaje para utilizar despues de que el sistema boot/root este funcionando. Una vez mas estos directorios solo necesitan ser creados.

Los siguientes cuatro directorios seran descritos en las siguentes seciones.

/dev

El directorio /dev contiene ficheros especiales para todos los dispositivos que son usados por el sistema y son necesarios en todos los sistemas linux. El directorio en si mismo en un directorio normal, y puede ser creado con mkdir del modo normal. Los ficheros especiales de dispositivos, no obstante, deben ser creados de una manera especia, utilizando el comando mknod.

Hay un metodo abreviado, -- copie el contenido de su directorio /dev esistente, y borre lo que no necesita. El unico requisito es que copie los dispositivos especiales utilizando la opcion -R. Esto copara el directorio si preocuparse de copiar el contenido de los ficheros. Asegurese de usar la letra mayuscula R. si usase la minuscula -r, probablemente acabaria copiando el contenido completo de todos sus discos duros -- ˇ o al menos lo que entrase en el disco! no obstante, tenga cuidado, y use el comando:

        cp -dpR /dev /mnt

suponiendo que el disco este montado en mnt. el parametro dp se asegura que los enlaces simbolicos sean copiados como enlaces, en lugar de copiar el fichero objetivo, y que los atributos originales son preservados, asi como la informacion del posedor.

Alternativamente, puede usar el programa cpio con el parametro -p porque cpio maneja los dispositivos especiales correctamente, y no trata de copiar su contenido. Por ejemplo los comandos:

 
cd /dev
find . -print | cpio -pmd /mnt/dev 

Copiara todos los fichero especiales de dispositivo de dev a /mnt/dev. De echo esto copiara todos los dicheros en el arbol de directorios comenzando por /dev, y creara los subdirectorios necesarios en el arbol de directorios destino.

Si quiere hacerlo de la manera dificil, use ls -l para ver los numeros mayor y menor de los dispositivos que desee, y creelos en el disco usando mknod.

Una vez los dispositivos son copiadodos, no es mala idea comprobar que cualquier dispositivo especial que necesite ha sido colocado en el disco rescate. Por ejemplo, ftape usa dispositivos de cinta, por lo que es necesario copiar todos esos su intenta aceder a su unidad de cintas ddesde el disco de arranque.

Note que es necesita un inodo para cada fichero especial de dispositivo, y con el tiempo los inodes pueden ser un recurso escaso, especialmente en systemas de fichero en disco. Hay que hacer especial incapie en borrar cualquier dispositivo especial que no necesite del directorio /dev del disco. Muchos dispositivos son obiamente inecesarios para un sistema especifico. Por ejemplo si no tiene discos SCSI puede eliminar sin problemas todo slos dispositivos que comienzen con sd. De manera similar, si no tiene intencion de utilizar el puerto serie entonces todos los dispositivos que comienzan con cua pueden borrarse.

Asegurese de incluir los siguientes ficheros en este directorio: console, kmem, mem, null, ram, tty1.

/etc

Este directorio contiene varios ficheros de configuracion. En muchos sitemas , pueden ser divididos en tres grupos:

  1. Requeridos todo el tiempo, e.g. rc, fstab, passwd.
  2. Se pueden necesitar, pero no siempre.
  3. No se necesitan (Junk that crept in, en el original cuernos lo que significa :-( ).

Los ficheros que no son esenciales pueden ser identificados con el comando:

        ls -ltru

Esto muestra en orden inverso segun la ultima fecha de acesso, los ficheros, por lo que si algun fichero no ha sido acedido, este puede omitirse del disco root.

En mi disco root, El numero de ficheros de configuracion que tengo baja hasta 15. Esto reduce mi trabajo de manejar los tres tipos de ficheros:

  1. Los que he configurado para el disco boot/root:
    1. rc.d/* -- arranque del sistema, y scripts de cambio de nivel de ejecucion(run-level).
    2. fstab -- lista de sistema de ficheros montados por el sistema.
    3. inittab -- parametros para el proceso init, el primer proceso ejecutado al arrancar el sistema.
  2. Los que modifique para el disco boot/root:
    1. passwd -- Lista de usuarios, directorios home,, etc.
    2. group -- grupos de usuarios.
    3. shadow -- passwords de los usuarios. Puede no necesitarlo.
    Si la seguiridad es importante, passwd y shadow deberian ser reducidos para evitar la copia de password fuera del sistema, y para que cuando arranque desde disco, sean rechazados los login no deseados. No obstante, hay una razon para no reducir passed y group. tar ( y problablemente otras utilidades de archivo) almacenan los nombre de usuario y grupo con los ficheros. Si restaura ficheros al disco duro desde cinta, los ficheros seran recuperados con sus nombre originales. Si estos nombre no existen en passwd/group cuando son recuperados, los UIDs/GIDs no seran correctos. Asegurese que passwd contiene al menos root. Si quiere que otros usuarios hagan login, asegurese que sus directorios home y shells existen.
  3. El resto deberia funcinar por el momento, asi que lo dejaremos por ahora.

Aparte de esto, Solo necesito configurar dos ficheros, y estos contiene poca cosa.

Su inittab deberia ser cambiado para que la linea sysinit ejecutase rc o cualquier otro script basico de configuracion que utilice. Ademas, si desea aseguirarse que los usuarios por puerto serie no puedan hacer login, comente todas las entradas para getty que incluyan dispositivos ttys o ttyS al final de la linea. Deje las que ponen tty para que pueda hacer loguin en la consola.

Un fichero inittab minimo se pareceria a este:

        id:2:initdefault:
        si::sysinit:/etc/rc
        1:2345:respawn:/sbin/getty 9600 tty1
        2:23:respawn:/sbin/getty 9600 tty2

The fichero inittab define que ejecutara el sistema en los estados diferentes por los que para al arrancar, moverse a modo multi-usuario , etc. Un punto a tener en cuenta es comprobar que los comandos introducidos en inittab se refieren a programas que estan presentes y en el directorio correcto . Si situa sus ficheros de commandos en el isco utilizando la seccion Ejemplo de Listado de directorios del disco root como guia, y despues copia su inittab al disco de rescate sin comprobarlo , la probabilidad de fallo es bastante alta debido a que la mitad de las entradas de inittab se refieren a programas omitidos o en el directorio equivocado.

Note que algunos programas no puede moverse a otro sitio porque otros programas tiene su situacion grabada. Por ejemplo en mi sistema, /etc/shutdown esta fijado desde /etc/reboot/. Si yo muevo reboot a /bin/reboot, he intento ejecutar el comando shutdown, este fallara porque no podra encontrar el fichero reboot.

Para el resto, solo copie todos los ficheros de texto de su directorio /etc, mas todos los ejecutables en su directorio etc que no pueda asegurar que no va ha necesitar. Como guia, consulte el ejemplo de listados en la secion Ejemplos de listados de direcotorios del disco root. Probablemente sea suficiente con copiar solo estos ficheros, pero los sistemas difieren entre si en gran medida, por lo que no puedo asegurarle que el mismo conjunto de ficheros en su sistema se equivalente a los de la lista. El unico metodo seguro es empezar con ztt/inittab/ y solucionar lo que pida.

Muchos sistemas ahora usan un direcotorio /etc/rc.d/A conteniendo los shellscripst para los diferentes niveles de ejecucion. lo minimo es un simple script rc, pero puede ser tan sencillo como copiar inittab y el directorio /etc/rc.d de sus sistema existente, y recortarr el shellscript en el directorio rc.d para eliminar todos los procesos no relevantes al ambiente del disco del sistema.

/bin y /sbin

El directorio /bin es un lugar conveniente para colocar las utilidades extra que necesite para realizar las operaciones basicas, coo son ls, mv, cat y dd. mire el apendice Ejemplo de listado de directorios del disco root para un ejemplo de la lista de ficheros que pueden ir en los directorios /bin /sbin. Esto no incluye ninguna de las utilidades necesarias para recuperar un backup, como son cpio, tar y gzip. Esto es asi porque al colocar estas utilidades en un disco por separado, se salva espacio en el disco boot/root. Una vez el disco boot/root haya sido arrancado, es copiado al disco ram dejando la unidad de disco libre para montar otros discos, como el de utilidade, Normalmente lo monto bajo usr.

La creacion de un disco de utilidades se describe mas abajo en la secion Construcion de un disco de utilidades. Es probablemente una buena idea mantener una copia de la misma version de las utilidades utilizadas para guardar la copia de seguiridad para no gastar tiempo intentando instalar version que no pueden leer sus cintas de copias de seguiridad.

Asegurese de incluir los siguientes programas: init, getty o equivalente, login, mount, y algun shell capaz de ejecutar los rc scrips, muchos shells son capaces de ejecutarlos si tiene un link de sh al shell.

/lib

En /lib colocara los cargadores y librerias de enlace dinamico necesarias. Si las librerias necesarias no se encuentran en su directorio /lib el sistema sera incapaz de arrancar. Si tiene suerte, podra ver un mensaje de error indicandole por que.

Practicamente todos los programas necesitan al menos la libreria libc, libc.so.N, dondeN es el numero de version actual. Compruebe su directorio /lib. libc.so.5 es normalmente un enlace simbolico a un fichero con el nombre de version completo:

% ls -l /lib/libc.so*
lrwxrwxrwx  1 root root      14 Nov  1 20:34 /lib/libc.so.5 -> libc.so.5.4.33*
-rwxr-xr-x  1 root root  573176 Jun 12 02:05 /lib/libc.so.5.4.33*

En este caso, necesita libc.so.5.4.33. Para encontrar otras librerias que debera ir por todos los binarios que desee incluir y comprobar sus dependencias con el comando ldd. Por ejemplo:

        % ldd /sbin/mke2fs
                libext2fs.so.2 => /lib/libext2fs.so.2
                libcom_err.so.2 => /lib/libcom_err.so.2
                libuuid.so.1 => /lib/libuuid.so.1
                libc.so.5 => /lib/libc.so.5    

Se necesita cada fichero de la parte derecha. Tenga en cuenta que las librerias mostradas pueden ser enlaces simbolicos.

In /lib/ debe ademas incluir el cargados de las librerias. El cargador puede ser ld.so (para librerias a.out) o ld-linux.so ( para librerias ELF). Si no esta seguro de cual necesita, ejecute el comando file sobre la libreria. Por ejemplo:

        % file /lib/libc.so.5.4.33 /lib/libc.so.4.7.2
        /lib/libc.so.4.7.2: Linux/i386 demand-paged executable (QMAGIC), stripped
        /lib/libc.so.5.4.33: ELF 32-bit LSB shared object, Intel 386, version 1, stripped

QMAGIC indicaca que 4.7.2 es una libreria a.out, y ELF indica que 5.4.33 es ELF.

Copie los cargadores que necesite al sistema de ficheros raiz que esta construyendo. Las librerias y cargadores deberian comprobarse concienzudamente contra los binarios incluidos. Si el kernel no puede cargar la libreria necesario, normalmente se colgara si nigun mensaje de error.

4.4 Particularidades para PAM y NSS.

Su sistema puede requerir cargar librerias de enlace dinamico que no son visible para ldd.

PAM (Pluggable Authentication Modules).

Si su sistema usa PAM ( (Pluggable Authentication Modules)(Modulos de Autentificacion Encajables) debe realizar algunas previsiones en el disco de arranque para poder hacer login. PAM, brevemente, es un sofisticado y modular metodo de autentificar a los ususario y controlar su acesso a servicios. Una manera facil de determinar si su sistema tiliza PAM es comprobar en su disco duro el directorio /etc la existencia de del fichero pam.conf o el direcotorio pam.d ; si cualquiera existe, debe proporcionar un soporte PAM minimo. (alternativamente, ejecute ldd en su ejecutable login; si la salida incluye libpam.so, necesita PAM.)

Afortunadamente, la seguridad no es algo muy importante cuando hablamos de discos de arranque, ya que cualquiera que tenga acceso fisico a la maquina puede normalmente hacer lo que quiera con ella. No obstante es importante anular PAM creando un simple /etc/pam.conf en su sistema de ficheros raiz que se parezca al siguiente:


OTHER   auth       optional     /lib/security/pam_permit.so
OTHER   account    optional     /lib/security/pam_permit.so
OTHER   password   optional     /lib/security/pam_permit.so
OTHER   session    optional     /lib/security/pam_permit.so

Tambien copie el fichero /lib/security/pam_permit.so a su sistema de ficherso, esta libreria es de solo 8K por lo que impone una sobrecarga minima.

Note que esta configuracion permite a cualquiera acceso completo a sus ficheros y servicios en la maquina. Si desea una mayor seguridad en su disco de arranque por alguna razon, deberia copiar parte o toda la configuracion PAM de su disco duro al sistema de ficheros raiz. Asegurese de leer la documentacion PAM con precaucion, y copie cualquier libreria necesaria en /lib/securyty en su sistema de ficheros raiz.

You must also include /lib/libpam.so on your bootdisk. But you already know this since you ran ldd on /bin/login, which showed this dependency. Necesita ademas incluir /lib/libpam.so en su disco de arranque. Pero ya deberia seber esto desde que ejecuto ldd en /bin/login, que le muestra las dependencias.

NSS (Name Service Switch).

Si usa glibc (aka libc6), probablemente tenga que hacer previsiones para ellos servicios de nombre, o no sera capaz de hacer login. el fichero /etc/msswitch.conf controla la base de datos de bloqueos de varios servicios. Si no tiene planeado aceder a servicios de una red (ej, busquedas de DNS o NIS), solo necesitara preparar un simple fichero nsswitch.conf que sea como esto:


     passwd:     files 
     shadow:     files 
     group:      files 
     hosts:      files
     services:   files
     networks:   files
     protocols:  files
     rpc:        files
     ethers:     files
     netmasks:   files     
     bootparams: files
     automount:  files 
     aliases:    files
     netgroup:   files
     publickey:  files

Esto espeficica que todos los servicios son proporcionados por ficheros locales. Probablemente necesite incluir /lib/libnss_files.so.1, que se cargara dinamicamente para manejar la busqueda de ficheros.

Si tiene pensado aceder a una red desde el disco de arranque, necesitara crera un fichero nsswitch.conf mas elaborado. Mire la pagina man de nsswitch para mas detalles. Tenga presente que debe uncluir un fichero /lib/libnss_servicio.so.1 por cada servicio que espeficique.

4.5 Modulos.

Si tien un kernel modular, debe evaluar que modulos necesita cargar desde el disco de arranque tras el arranque. Si va a realizar copias de seguirdad desde una unidad de cinta, deberia incuir los modulos ftape y zftape, modulos para los dispositivos SCSI que tenga, y posiblemente los modulos del soporte PPP o SLIP si quiere tener aceso a la red en una emergencia.

Estos modulos pueden ser colocados en /lib/modules. Deberia ademas añadir insmod, rmmod y lsmod. Si ademas desea que los modulos se cargen automaticamente, debira incluir modprobe, depmod y swapout. Si usa kerneld, incluya con el el /etc/conf.modules.

No obstante, la principal ventaja de utilizar modulos es que puede mover partes no criticas al disco de utilidades y cargarlas cuando sean necesarias, utilizando menos espacio en el disco root. Si tiene que aceder a muchos dispositivos, esta aproximacion es preferible a contruir un kernel inmenso con todos los drivers en el.

Note que para poder arrancar desde un sistema de ficheros ext2 comprimido, el soporte de discos-ram y ext2 debe estar incluido en el kernel. No se pueden suministrar como modulos.

4.6 Algunos detalles finales.

Algunos programas, como es login, fallan si el fichero /var/run/utmp y el directorio /var/log no existen. utmp Por lo que:

        mkdir -p /mnt/var/{log,run}
        touch /mnt/var/run/utmp

Finalmente, despues de haber preparado todas las librerias que necesite, ejecute ldconfig para rehacer /etc/ld.so.cache en el sistemad de ficheros raiz. El cache indica al cargador donde encontrar la librerias. Para rehacer ld.so.cache, haga los siguiente comandos:

        chdir /mnt; chroot /mnt /sbin/ldconfig

El chroot es necesario por que ldconfig siempre rehace el cache desde el sistema de ficheros raiz.

4.7 Wrapping it up.(Juntadolo todo)

Una vez ha finalizado la construcion del sistema de ficheros, desmontelo, copielo a un fichero y comprimalo:

        umount /mnt
        dd if=DEVICE bs=1k | gzip -v9 > rootfs.gz

Cuando acabe tendra un fichero rootfs.gz que es su sistema de ficheros comprimido. Deberia comprobar el tamaño para asegurarse de que entra en el disco; si no entra, vuelva atras y elimine algunos ficheros. La seccion Reducir el tamaño del sistema de ficheros raiz tiene algunas ideas para hacer esto.


Página siguiente Página anterior Índice general