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 |
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:
![]() | 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.
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
![]() | 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).
![]() | 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 |
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.
![]() | 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 |
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 |
![]() | 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. |
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:
/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 |
/dev/root / ext2 rw 0 0 /dev/cdrom /cdrom iso9660 ro 0 0 /dev/cloop /META iso9660 ro 0 0 |
root:*:0:0:Metadistros Administrator:/root:/bin/bash nobody:*:-1:-1:Nobody:/:/bin/true |
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:
![]() | 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.
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