3. Contenido de initrd

Antes de comenzar con este apartado, veamos la estructura del sistema de archivos que se encuentra contenido en el archivo initrd. Aquí sólo se listarán los directorios de dicho sistema de ficheros (que se irán analizando a lo largo de esta sección):

$ mount -o loop -t ext2 initrd /mnt/initrd
$ cd /mnt/initrd
$ tree -d
.
|-- META
|-- cdrom
|-- dev
|   |-- ataraid
|   |-- cciss
|   |-- fd -> /proc/self/fd
|   |-- ida
|   |-- pts
|   `-- rd
|-- etc
|   `-- metadistros
|-- keymaps
|-- mnt
|-- modules
|   |-- ataraid
|   |-- firewire
|   |-- others
|   |-- pcmcia
|   |-- scsi
|   `-- usb
|-- proc
|-- static
`-- tmp -> /var/tmp

23 directories

3.1. El directorio “raíz” y el directorio META

En este apartado tratamos estos dos directorios debido a que en el “raíz” sólo nos falta por ver una serie de enlaces simbólicos que están relacionados con el directorio META. Veamos estos enlaces, para ello ejecutamos en el directorio “raíz” del sistema de archivos contenido en initrd lo siguiente:

[Note]Nota

En el directorio “raíz” está el script linuxrc pero este se tratará en la Sección 4.1, “linuxrc”, por lo que aquí no comentaremos nada acerca de él.

$ tree -L 1
.
|-- META
|-- bin -> /META/bin
|-- boot -> /META/boot
|-- cdrom
|-- dev
|-- etc
|-- keymaps
|-- lib -> /META/lib
|-- linuxrc
|-- mnt
|-- modules
|-- opt -> /META/opt
|-- proc
|-- sbin -> /META/sbin
|-- static
|-- tmp -> /var/tmp
`-- usr -> /META/usr

10 directories, 7 files

Como podemos observar en la captura anterior, casi todos los enlaces simbólicos[8] apuntan a distintos directorios del directorio META, excepto el enlace simbólico tmp que apunta al directorio /var/tmp. Esto se hace para unificar los directorios temporales, ya que han de tener permiso de escritura.

Veamos el contenido del directorio META antes de proceder a dar una breve explicación:

$ tree META
META/
|-- bin -> /cdrom/META/bin
|-- boot -> /cdrom/META/boot
|-- etc -> /cdrom/META/etc
|-- lib -> /cdrom/META/lib
|-- opt -> /cdrom/META/opt
|-- sbin -> /cdrom/META/sbin
|-- usr -> /cdrom/META/usr
`-- var -> /cdrom/META/var

0 directories, 8 files

Como se puede ver, el directorio META sólo contiene enlaces simbólicos al lugar donde se montará la imagen (ya sea cloop o loop) que posee la distribución a ejecutarse. Estos enlaces serán vitales cuando se establezca el PATH genérico de nuestro sistema.

3.2. El directorio modules

Bajo el directorio modules se encuentran los controladores[9] para dispositivos “raid IDE”, “firewire” (también conocido como “ieee1394”), “pcmcia”, “SCSI” y “USB”. Aunque actualmente no esté implementado

[Note]Nota

Sería interesante añadir los módulos necesarios para dar soporte a EVMS (Enterprise Volume Management System). De esta forma, se podría ampliar el número de dispositivos y sistemas de archivos sobre los cuales poder arrancar el sistema. Continuando con esta tónica, también podría analizarse si es interesante añadir soporte para RAID por software.

Se puede observar que el módulo “cloop” también está en este directorio, el cual es necesario para montar imágenes comprimidas en el loopback.

Por último, el directorio others se usa en aquellos casos en los que el usuario requiere cargar más módulos de los disponibles por defecto (esto es posible gracias al modo interactivo de arranque).

[Note]Nota

Como la imagen initrd.gz final es muy grande para que entre en un disquete de 1.44 Mbytes, se pueden eliminar los módulos[10] de esta e incorporarlos en el arranque gracias al modo interactivo. Esto puede ser útil para aquellos equipos que no puedan arrancar desde CDROM.

$ tree modules
modules/
|-- ataraid
|   |-- ataraid.o
|   |-- hptraid.o
|   `-- pdcraid.o
|-- cloop.o
|-- firewire
|   |-- eth1394.o
|   |-- ieee1394.o
|   |-- ohci1394.o
|   `-- sbp2.o
|-- others
|-- pcmcia
|   |-- ds.o
|   |-- i82365.o
|   |-- ide-cs.o
|   `-- pcmcia_core.o
|-- scsi
|   |-- 3w-xxxx.o
|   |-- BusLogic.o
|   |-- NCR53c406a.o
|   |-- a100u2w.o
|   |-- advansys.o
|   |-- aha152x.o
|   |-- aha1542.o
|   |-- aha1740.o
|   |-- aic7xxx.o
|   |-- atp870u.o
|   |-- dtc.o
|   |-- eata.o
|   |-- fdomain.o
|   |-- gdth.o
|   |-- initio.o
|   |-- megaraid.o
|   |-- ncr53c8xx.o
|   |-- pas16.o
|   |-- pci2000.o
|   |-- pci2220i.o
|   |-- psi240i.o
|   |-- qlogicfas.o
|   |-- qlogicfc.o
|   |-- qlogicisp.o
|   |-- seagate.o
|   |-- t128.o
|   |-- tmscsim.o
|   |-- u14-34f.o
|   |-- ultrastor.o
|   `-- wd7000.o
`-- usb
    |-- ehci-hcd.o
    |-- hid.o
    |-- uhci.o
    |-- usb-ohci.o
    |-- usb-storage.o
    `-- usbcore.o

6 directories, 48 files

3.3. El directorio keymaps

Directorio que posee mapas de teclados de distintos países. El mapa de teclado se cargará en aquellos momentos en los que el usuario ha de teclear algo, bien sea por arrancar en modo interactivo bien por no haber encontrado el directorio META o la imagen con el sistema a cargar. En este último caso se cargará una shell reducida, que se detallará en la Sección 3.6, “El directorio static y la herramienta BusyBox”, desde la cual el usuario podrá hacer uso de distintas herramientas.

[Note]Nota

Estos mapas de teclado no serán necesario una vez tengamos cargado el sistema de la imagen (c)loop, ya que dicho sistema ya traerá distintos mapas de teclados. La utilidad de este directorio es proporcionar comodidad al usuario final en determinadas ocasiones. Si no poseemos mucho espacio[11] para la imagen de arranque, por tener que arrancar desde disquete, por ejemplo, podremos eliminarlo sin problemas.

$ tree keymaps
keymaps/
|-- 1.map
|-- 10.map
|-- 11.map
|-- 12.map
|-- 13.map
|-- 14.map
|-- 15.map
|-- 16.map
|-- 17.map
|-- 18.map
|-- 19.map
|-- 2.map
|-- 20.map
|-- 21.map
|-- 22.map
|-- 23.map
|-- 24.map
|-- 25.map
|-- 26.map
|-- 27.map
|-- 28.map
|-- 29.map
|-- 3.map
|-- 30.map
|-- 31.map
|-- 32.map
|-- 33.map
|-- 34.map
|-- 35.map
|-- 36.map
|-- 37.map
|-- 38.map
|-- 39.map
|-- 4.map
|-- 40.map
|-- 41.map
|-- 42.map
|-- 5.map
|-- 6.map
|-- 7.map
|-- 8.map
|-- 9.map
|-- azerty.map
|-- be.map
|-- bg.map
|-- br-a.map
|-- br-l.map
|-- by.map
|-- cf.map
|-- croat.map
|-- cz.map
|-- de.map
|-- dk.map
|-- dvorak.map
|-- es.map
|-- et.map
|-- fi.map
|-- fr.map
|-- gr.map
|-- hu.map
|-- il.map
|-- is.map
|-- it.map
|-- jp.map
|-- key.lst
|-- la.map
|-- lt.map
|-- mk.map
|-- nl.map
|-- no.map
|-- pl.map
|-- pt.map
|-- ro.map
|-- ru.map
|-- se.map
|-- sg.map
|-- sk-y.map
|-- sk-z.map
|-- slovene.map
|-- trf.map
|-- trq.map
|-- ua.map
|-- uk.map
|-- us.map
`-- wangbe.map

0 directories, 85 files

3.4. El directorio dev

Directorio que contiene los distintos dispositivos del sistema. Como el listado de archivos es muy grande, sólo dejaremos el número de archivos (como curiosidad) y el tamaño de este directorio:

$ tree dev
dev/
|-- ataraid
|   |-- d0
|   |-- d0p1
|   |-- d0p10

[...]

|-- xdb5
|-- xdb6
|-- xdb7
|-- xdb8
`-- zero

6 directories, 4812 files
$ du -h dev
49K     dev/rd
19K     dev/ida
512     dev/pts
19K     dev/cciss
1,5K    dev/ataraid
130K    dev
[Note]Nota

Se podría ganar algo de espacio utilizando el sistema de archivos “devfs” (the Linux Device Filesystem). El único problema, es que habría que adaptar todos los scripts para que funcionasen con el mismo.

3.5. El directorio etc

A continuación se mostrará el contenido de los archivos existentes en el directorio etc, excepto los que están bajo el directorio metadistros, ya que se verán en la Sección 4, “Scripts de arranque - linuxrc”.

El listado de archivos bajo etc es:

$ tree etc
etc/
|-- auto.mnt
|-- exports
|-- filesystems
|-- fstab
|-- group
|-- ld.so.conf -> /META/etc/ld.so.conf
|-- metadistros
|   |-- functions
|   |-- i18n.conf
|   `-- var.conf
|-- mtab
|-- passwd
|-- resolv.conf
`-- shadow

1 directory, 13 files

Veamos pues el contenido de estos archivos:

3.5.1. El archivo /etc/fstab

/dev/ram0  /           cramfs defaults
proc       /proc       proc   defaults                   0 0
pts        /dev/pts    devpts mode=0622                  0 0
/dev/fd0   /mnt/floppy auto   user,noauto,exec,umask=000 0 0
/dev/cdrom /mnt/cdrom  auto   user,noauto,exec,ro        0 0

3.5.2. El archivo /etc/group

root::0:root
slocate::21:root
nobody::-1:nobody

3.5.3. El archivo /etc/mtab

/dev/root / ext2 rw 0 0
/dev/cdrom /cdrom iso9660 ro 0 0
/dev/cloop /META iso9660 ro 0 0

3.5.4. El archivo /etc/passwd

root:*:0:0:Metadistros Administrator:/root:/bin/bash
nobody:*:-1:-1:Nobody:/:/bin/true

3.5.5. El archivo /etc/resolv.conf

# Insert nameservers here
# nameserver 127.0.0.1

3.5.6. El archivo /etc/shadow

root:*:11312:0:99999:7:::
nobody:*:11312:0:99999:7:::

3.6. El directorio static y la herramienta BusyBox

Busybox es una herramienta que provee distintos comandos UNIX en un único ejecutable. Los comandos que han sido compilados para el initrd de metadistros se muestran a continuación:

[Note]Nota

Busybox se ha alojado en el directorio static del initrd, y es a ese directorio donde apunta el PATH inicial de los scripts.

$ ./static/busybox
BusyBox v0.60.5 (2003.05.11-12:22+0000) multi-call binary

Usage: busybox [function] [arguments]...
   or: [function] [arguments]...

        BusyBox is a multi-call binary that combines many common Unix
        utilities into a single executable.  Most people will create a
        link to busybox for each function they wish to use, and BusyBox
        will act like whatever it was invoked as.

Currently defined functions:
        [, ar, ash, basename, busybox, cat, chgrp, chmod, chown, chroot,
        chvt, clear, cmp, cp, cpio, cut, date, dc, dd, deallocvt, df,
        dirname, dmesg, dos2unix, dpkg, dpkg-deb, du, dumpkmap, dutmp,
        echo, egrep, env, expr, false, fbset, fdflush, find, free, freeramdisk,
        fsck.minix, getopt, grep, gunzip, gzip, halt, head, hostid, hostname,
        id, ifconfig, init, insmod, kill, killall, klogd, length, linuxrc,
        ln, loadacm, loadfont, loadkmap, logger, logname, losetup, ls,
        lsmod, makedevs, md5sum, mkdir, mkfifo, mkfs.minix, mknod, mkswap,
        mktemp, modprobe, more, mount, mt, mv, nc, nslookup, pidof, ping,
        pivot_root, poweroff, printf, ps, pwd, rdate, readlink, reboot,
        renice, reset, rm, rmdir, rmmod, route, rpm2cpio, sed, setkeycodes,
        sh, sleep, sort, stty, swapoff, swapon, sync, syslogd, tail, tar,
        tee, telnet, test, tftp, time, top, touch, tr, traceroute, true,
        tty, umount, uname, uniq, unix2dos, update, uptime, usleep, uudecode,
        uuencode, vi, watchdog, wc, wget, which, whoami, xargs, yes, zcat

Estos comandos son necesarios para la ejecución de los scripts de arranque, ya que proveen, entre otras cosas, la shell desde donde se ejecutan. Los comandos compilados en la shell son:

$ ./static/busybox ash
$ help

Built-in commands:
-------------------
        . : alias break builtin cd chdir continue eval exec exit export
        false fc hash help jobs let local pwd read readonly return set
        setvar shift times trap true type ulimit umask unalias unset
        wait

Hay dos formas de utilizar los comandos que provee busybox, una es pasando como parámetro al ejecutable busybox el comando que se quiere ejecutar:

$ ./static/busybox ls
META     boot     dev      keymaps  linuxrc  modules  proc     static   usr
bin      cdrom    etc      lib      mnt      opt      sbin     tmp

Otra es haciendo un enlace duro (o físico) desde busybox al nombre de los distintos comandos que esta aplicación provee. De esta forma, si queremos tener el comando ls como tal, crearemos el enlace duro conveniente de la siguiente forma:

$ cd static
$ tree
.
`-- busybox

0 directories, 1 file
$ ln busybox ls
$ tree
.
|-- busybox
`-- ls

0 directories, 2 files

Una vez tenemos el enlace duro ls, al llamarlo, actuará como si hubiésemos pasado el parámetro “ls” a busybox.

$ cd static
$ ./ls
busybox  ls

Si ahora creamos un enlace duro por cada comando que provee busybox, el directorio static nos quedará:

$ tree static
static/
|-- [
|-- ash
|-- basename
|-- busybox
|-- cat
|-- chgrp
|-- chmod
|-- chown
|-- chroot
|-- chvt
|-- clear
|-- cmp
|-- cp
|-- cpio
|-- cut
|-- date
|-- dc
|-- dd
|-- deallocvt
|-- df
|-- dirname
|-- dmesg
|-- dos2unix
|-- du
|-- echo
|-- egrep
|-- env
|-- expr
|-- false
|-- fbset
|-- fdflush
|-- find
|-- free
|-- freeramdisk
|-- getopt
|-- grep
|-- gunzip
|-- gzip
|-- halt
|-- head
|-- hostid
|-- hostname
|-- id
|-- ifconfig
|-- init
|-- insmod
|-- kill
|-- killall
|-- klogd
|-- length
|-- linuxrc
|-- ln
|-- loadacm
|-- loadfont
|-- loadkmap
|-- logger
|-- logname
|-- losetup
|-- ls
|-- lsmod
|-- makedevs
|-- md5sum
|-- mkdir
|-- mkfifo
|-- mkfs.minix
|-- mknod
|-- mkswap
|-- mktemp
|-- modprobe
|-- more
|-- mount
|-- mt
|-- mv
|-- nc
|-- nslookup
|-- pidof
|-- ping
|-- pivot_root
|-- poweroff
|-- printf
|-- ps
|-- pwd
|-- rdate
|-- readlink
|-- reboot
|-- renice
|-- reset
|-- rm
|-- rmdir
|-- rmmod
|-- route
|-- rpm2cpio
|-- sed
|-- setkeycodes
|-- sh
|-- sleep
|-- sort
|-- stty
|-- swapoff
|-- swapon
|-- sync
|-- syslogd
|-- tail
|-- tar
|-- tee
|-- telnet
|-- test
|-- tftp
|-- time
|-- top
|-- touch
|-- tr
|-- traceroute
|-- true
|-- tty
|-- umount
|-- uname
|-- uniq
|-- unix2dos
|-- update
|-- uptime
|-- usleep
|-- uudecode
|-- uuencode
|-- vi
|-- watchdog
|-- wc
|-- wget
|-- which
|-- whoami
|-- xargs
|-- yes
`-- zcat

0 directories, 133 files

En la Apéndice E, Config.h-static se encuentra el archivo de configuración utilizado en metadistros para compilar el ejecutable busybox de modo estático.

3.7. Otros directorios: cdrom, mnt y proc

  • cdrom: directorio donde se montará el CDROM (de todas formas, el CDROM en un futuro se puede corresponder con un “stick USB” o un disco duro externo conectado a través del puerto firewire de nuestro ordenador.

  • mnt: directorio en el cual se pueden montar distintos medios.

  • proc: directorio donde se montará el pseudo-sistema de ficheros de información de procesos.



[8] Puede identificar los enlaces simbólicos por las líneas que poseen el símbolo “->”. El nombre del enlace simbólico es el nombre de la izquierda del símbolo mencionado y la ruta a la que apunta está a la derecha.

[9] Sólo se han incluido los módulos que al cargarse no producen problemas.

[10] El espacio ocupado actualmente por los módulos es de 1,7 Megabytes.

[11] El directorio keymaps tiene un tamaño de 179 Kilobytes