You are on page 1of 12

Porque crear un CD de Arranque

Aunque no esté desde hace tiempo con LFS, ya leí


varios asuntos en lfs-discuss sobre gente que tiene
problemas compilando cierta parte de un sistema LFS
debido a la versión beta de gcc u otros paquetes
importantes incluidos en su distribución favorita.
Además no me gusta la idea de instalar una
distribución "comercial" sino instalar un sistema LFS
personalizado. No estaría bien ;-) Por tanto, creí que
seríamos capaces de crear un CD arrancable con alguna
clase de sistema Linux dentro que provea un entorno
apropiado para la instalación. ¿Y qué mejor que un LFS?
(Te dejaría uno a ti...)

Esto también da alguna pistas sobre arrancar


automáticamente la instalación, la cual es dada para
que tú la programes/configures. Pero probablemente
empezaríamos usando lfs (¿para dar a los probadores?).

Así que esto sería todo.

2. Personalización del núcleo (kernel)


Puesto que estamos involucrados en el arranque
desde cd y en el uso del cd imagen como una partición
root, necesitamos soporte para ISO9660 compilado en el
núcleo. ¡Esta parte es absolutamente vital!
Cuando intentamos montar la partición raíz el núcleo
no tiene ningún acceso a cualquier clase de módulos (ya
que están en la partición raíz que será montada y por
tanto nos hemos de fiar en el soporte ya compilado en el
núcleo. Después de que el sistema haya arrancado,
también querremos particionar nuestro disco duro. Por
consiguiente, deberías incluir todos los sistemas de
ficheros que podrías necesitar durante la instalación.
[Hasta ahora no he probado incluir los sistemas de
ficheros adicionales como módulos pero supongo que
funcionarían bien]

3. Preparación del sistema LFS


3.1 Introducción

El mayor problema que supone tener una partición


raíz sólo-lectura es que alguna parte del sistema puede
confiar en un acceso de escritura a
determinados directorios.

Echemos un vistazo al contenido de $LFS de un


sistema típico:

drwxr-xr-x 2 root root 1603 Oct 15 22:16


bin
drwxr-xr-x 4 root root 4096 Dec 5 00:12
boot
drwxr-xr-x 8 root root 44096 Feb 11 10:02
dev
drwxr-xr-x 45 root root 5334 Feb 11 11:02
etc
drwxr-xr-x 13 root root 250 Jan 9 00:39
home
drwxr-xr-x 5 root root 1869 Jan 4 23:58 lib
drwxr-xr-x 5 root root 95 Aug 27 22:12
mnt
dr-xr-xr-x 54 root root 0 Feb 11 11:02
proc
drwx--x--x 20 root root 679 Jan 30 17:27
root
drwxr-xr-x 5 root root 5068 Jan 4 23:58
sbin
drwxrwxrwt 5 root root 200 Feb 11 10:03
tmp
drwxr-xr-x 27 root root 663 Dec 13 17:34
usr
drwxr-xr-x 26 root root 541 Sep 5 23:53
var
Los siguientes directorios no deberían causar ningún
problema:
bin, boot, etc, lib, root, sbin, usr [¿Necesitas una
explicación del por qué no hay problema?].El contenido
de esos directorios debería ser estático y raramente
cambiado. Los puntos de montaje para otros sistemas
de ficheros no causarán problemas, porque puedes
montar un sistema de ficheros con permisos de escritura
en un punto de montaje de un sistema de ficheros en
modo sólo-lectura. Supongo que el núcleo guarda esos
mapas en la memoria y no en los inodos.
Eso significa que podemos anular los problemas
causados por: dev, home, mnt, proc.

Nos quedan tmp y var.

3.2 Enlazando /tmp y /var al disco duro

Hasta ahora hemos preferido esta versión ya que


intentamos construir un cd arrancable que sea útil en la
mayoría de los sistemas incluyendo aquellos con muy
poca memoria RAM.

3.2.1 Manejo de /tmp

Como dice su nombre /tmp es utilizado para


almacenar datos temporales. Desafortunadamente no
está bajo nuestro control cómo es usado este directorio
y, por tanto, necesita un manejo especial. Ya que hay
una estructura no estandarizada para esta ubicación
podemos
Simplemente enlazarlo al directorio tmp en la partición
que usaremos para la instalación. Por ejemplo, si
pretendes compilar tu sistema en /lfs (que entonces
será $LFS durante la instalación) necesitas incluir un
enlace simbólico para /tmp en el CD apuntando
a /lfs/tmp.
Si te decides por una versión de enlace simbólico para
la manipulación de /tmp, tendrás que decidir en qué
directorio instalarás ¡antes de tostar el CD!

3.2.2 Manejo de /var

/var normalmente contiene tiempos de ejecución o


tareas de estado y también pueden ser cambiados
[¿correcto? ¿Expresado un poco chapuzas?]. Ya que /var
puede contener directorios de colas de correo, ficheros
pid y tiene una estructura de directorio predefinida, no
podemos tan sólo enlazarlo a nuestra partición de
instalación, ya que puede provocar colisiones con
programas en ejecución en nuestro entorno chroot o
quizás incluso antes.

Así que podríamos comprimir /var y ponerlo en / lo


que se hará ejecutando el siguiente comando en el
directorio raíz de tu CD:

tar cfz var/ var.tar.gz

Después del arranque y después de montada nuestra


partición de instalación (digamos en /lfs), creamos un
directorio "el_que_sea" y descomprimiremos /var en
"el_que_sea". El /var original tendría un enlace a este
directorio, por ejemplo var -> /lfs/el_que_sea/var

3.3 Enlazando /tmp y /var al disco virtual


en memoria (ramdisk)
Antes de nada necesitamos crear el disco virtual en
memoria (ramdisk) que yo hago con los siguientes
comandos:

dd if=/dev/zero of=/dev/rd/0 bs=1k count=4096


mke2fs -m 0 /dev/rd/0
mount /dev/rd/0 /rd
Por favor, recuerda que tienes que cambiar el nombre
del dispositivo al nombre apropiado en tu sistema. ¡Este
fue creado usando devfs!

Los próximos dos sub-capítulos apenas han cambiado


ya que /tmp y /var simplemente están enlazados
a /rd/tmp y /rd/var

3.3.1 Manejo de /tmp


Crea un enlace en tu directorio raíz para que /tmp
apunte a /rd/tmp/.

Durante el arranque necesitas crear el


directorio /rd/tmp/ para que el
enlace desde /tmp no apunte a nirvana.

3.3.2 Manejo de /var

Crea un enlace en tu directorio raíz para que /var


apunte a /rd/var/.
Necesitarás también un tarball de tu /var original y
colocarlo en /
lo cual ha sido descrito en 3.2.2.

Durante el arranque necesitarás desempaquetar el


paquete tar
de /var en /rd.

3.4 Guiones de arranque

Despojé /etc/init.d y /etc/rc?.d de todo aquello que no


fuese absolutamente vital. La única tarea dejada es la
carga del mapa del teclado. Por favor, dirígete al listado
de directorio (capítulo 5) al final del documento.

4. Guión de Instalación
Esta parte depende absolutamente de ti. Podrías
querer incluir un LFS o algún sistema compilado que
hayas escrito tú mismo. Quizá incluso abandones esta
parte e instales manualmente los paquetes.
Pero de todos modos tendrás que poner los paquetes
en el CD y tenerlos a mano para cuando los necesites.

Hazte una idea de lo que mi CD hace: Pongo un guión


en /etc/init.d/install que será lanzado desde inittab
durante el arranque. Esto preguntará al usuario alguna
cosa importante, es decir, cual será la partición a
instalar. Entonces arrancará la compilación.

Incluso podrías querer arrancar una bash y dejar


fuera toda clase de instalación automática. Esto
sucederá si pasas un parámetro adicional al núcleo
desde el cargador del arranque "init=/bin/bash".

5. Creando un disquete de arranque


Aunque algunos de vosotros podríais tener la
tentación de preguntar el por qué no empiece a
argumentar; de todas formas, describiré ahora el
proceso para crear un disquete de arranque utilizando
grub. Es una cuestión de fe ;-). Primero necesitas
conseguir grub http://www.gnu.org e instalarlo en tu
sistema con los siguientes comandos:

./Configure --prefix=/usr &&


make &&
make install

a) Puedes crear un sistema de ficheros ext2 en un


disquete.
(Por favor usa un disquete vacío o estate seguro
de comprender que perderás todos los datos del
disquete. Demasiado para renunciar a hacerlo)

b) Monta este disquete en tu directorio de montaje


de disquete favorito (llamémoslo $FLOPPY)
c) Crea /boot y /boot/grub en tu disquete mkdir -p
$FLOPPY/boot/grub

d) Copia el cargador de arranque de grub al


disquete: cp /usr/share/grub/i386-pc/stage*
$FLOPPY/boot/grub

e) Pon tu núcleo en $FLOPPY/boot y llámalo "Linux"

f) Arranca el intérprete de comandos de grub


ejecutando "grub"

g) Instala grub en tu disquete de arranque (todavía


en el intérprete de comandos de grub): install
(fd0)/boot/grub/stage1 (fd0) (fd0)/boot/grub/stage2

h) Ahora necesitas crear el archivo


$FLOPPY/boot/grub/menu.lst con los siguientes
contenidos:

default 0
timeout 2

title template
root (fd0)
kernel (fd0)/boot/linux devfs=mount
root=/dev/cdroms/cdrom0

Si no usas devfs, por favor borra "devfs=mount"


de la última línea
de menu.lst y reemplaza "/dev/cdroms/cdrom0"
con el nombre de tu dispositivo de cdrom. Si
quisieras mantener el cd arrancable tan genérico como
fuera posible no necesitas preocuparte del nombre del
dispositivo cdrom ya que serás capaz de editar las
entradas de menú del grub en tiempo de arranque para
que refleje el sistema subyacente.

Ahora ya estás preparado para tostar la instalación de


tu LFS en un CD que sea capaz de arrancar.

6. Tostando:
Después de crear un apropiado disquete de arraque
con tu núcleo personalizado (mira 2) pon la imagen
en /boot. Para hacerlo ejecuta este comando en el
directorio raíz de tu sistema lfs:

dd if=/dev/floppy/0 of=boot/image bs=1024

Los que no uséis devfs tendréis que sustituir


/dev/floppy/0 por /dev/fd0.

Para tostar todo el conjunto en el CD yo utilizo el


siguiente comando:

mkisofs -rlDJLV "LFS" /lfscd -b boot/image -c


boot/catalog \
| cdrecord -v -eject dev=/dev/cdroms/cdrom0
speed=4 -data -

Cosas a verificar:

a) No uses -f. Provoca que los enlaces del sistema


sean ignorados.

b) Sustituye dev=... por tu dispositivo cdrom.

7. Listados
7.1 /

drwxr-xr-x 2 root root 35 Feb 9 21:10 alfs


drwxr-xr-x 2 root root 1250 Feb 9 20:10 bin
drwxr-xr-x 3 root root 295 Feb 10 14:05 boot
drwxr-xr-x 3 root root 54 Feb 9 17:33 dev
drwxr-xr-x 12 root root 795 Feb 12 13:48 etc
drwxr-xr-x 2 root root 35 Feb 9 17:33 home
drwxr-xr-x 3 root root 2494 Feb 9 20:52 lib
drwxr-xr-x 2 root root 35 Feb 9 17:33 mnt
drwxr-xr-x 2 root root 35 Feb 9 17:33 proc
drwxr-x--- 2 root root 64 Feb 9 18:13 root
drwxr-xr-x 2 root root 1272 Feb 9 20:10 sbin
lrwxrwxrwx 1 root root 8 Feb 10 21:57 tmp ->
alfs/tmp
drwxr-xr-x 14 root root 346 Feb 9 20:10 usr
lrwxrwxrwx 1 root root 14 Feb 10 21:57 var ->
alfs/00-rw/var
-rw-r--r-- 1 root root 1043 Feb 10 21:56 var.tar.gz

7.2 /etc/init.d
Este directorio contiene un nuevo guión "install" que
sigue a través del proceso de instalación y sería
específico para tu configuración.

-rwxr-xr-- 1 root root 1734 Jan 26 02:05 checkfs


-rwxr-xr-- 1 root root 1118 Jan 26 02:05 ethnet
-rwxr-xr-- 1 root root 867 Feb 2 02:46 fcron
-rwxr-xr-- 1 root root 4940 Jan 26 02:05 functions
-rwxr-xr-- 1 root root 83 Jan 26 02:05 halt
-rwxr-xr-x 1 root root 988 Feb 12 13:51 install
-rwxr-xr-- 1 root root 200 Jan 26 02:05 loadkeys
-rwxr-xr-- 1 root root 725 Jan 26 02:05 localnet
-rwxr-xr-- 1 root root 355 Jan 26 02:05 mountfs
-rwxr-xr-- 1 root root 4219 Jan 26 02:05 rc
-rwxr-xr-- 1 root root 235 Jan 26 02:05 rcS
-rwxr-xr-- 1 root root 123 Jan 26 02:05 reboot
-rwxr-xr-- 1 root root 276 Jan 26 02:05
sendsignals
-rwxr-xr-- 1 root root 338 Jan 26 02:05 setclock
-rwxr-xr-- 1 root root 1062 Jan 26 02:05 sysklogd
-rwxr-xr-- 1 root root 696 Jan 26 02:05 template
-rwxr-xr-- 1 root root 234 Jan 26 02:05 umountfs

7.3 /etc/rc0.d
lrwxrwxrwx 1 root root 21 Feb 12 13:44
S80sendsignals
-> ../init.d/sendsignals
lrwxrwxrwx 1 root root 14 Feb 12 13:44 S99halt
->.../init.d/halt

h.
7.4 /etc/rc1.d
[empty]

7.5 /etc/rc2.d

[empty]

7.6 /etc/rc3.d

[empty]

7.7 /etc/rc4.d
[empty]

7.8 /etc/rc5.d
[empty]

7.9 /etc/rc6.d

lrwxrwxrwx 1 root root 21 Feb 12 13:44


S80sendsignals
-> ../init.d/sendsignals
lrwxrwxrwx 1 root root 16 Feb 12 13:44 S99reboot
->../init.d/reboot

7.10 /etc/rcS.d
lrwxrwxrwx 1 root root 18 Jan 26 02:11 S30loadkeys
-> ../init.d/loadkeys
7.11 /etc/inittab
Por favor, ten presente que reemplacé la definición para
una 'agetty' (terminal) en vc/1 con el guión de instalación
/etc/init.d/install que sólo se ejecutará una vez (atento: "una
vez"). También he borrado 4 de las 5 definiciones de 'agetty'
restantes ya que la instalación lo hará automáticamente.

# Comienza /etc/inittab

id: 3: initdefault:

si::sysinit:/etc/init.d/rcS

l0:0:wait:/etc/init.d/rc 0
l1:S1:wait:/etc/init.d/rc 1
l2:2:wait:/etc/init.d/rc 2
l3:3:wait:/etc/init.d/rc 3
l4:4:wait:/etc/init.d/rc 4
l5:5:wait:/etc/init.d/rc 5
l6:6:wait:/etc/init.d/rc 6

ft:06:respawn:/sbin/sulogin

ca:12345:ctrlaltdel:/sbin/shutdown -t1 -a -r now

su:S1:respawn:/sbin/sulogin
1:2345:respawn:/sbin/agetty vc/1 9600
2:2345:respawn:/sbin/agetty vc/2 9600

# Fin de /etc/inittab

8. Historia

2001-07-25 liberada la versión 1.4. De acuerdo con una


sugerencia de Gerard añadí unas pocas líneas describiendo
cómo logar una imagen de arranque para disquete y colorarla
en el árbol de lfs para el cd de arranque. Correcciones: - Lo
más importante era fijar la instrucción de crear disquete de
arranque en donde había olvidado el comando para instalar
grub en el disquete.
- Borré/cambié algunas instrucciones
olvidadas de mi CD
Original en 4 y 7.11.
Adiciones: - Añadidas algunas descripciones más a
3.2.1, 3.2.2

2001-06-22 liberada la versión 1.3: Añadí instrucciones


para crear un disquete de arranque basado en grub.

2001-03-10 liberada la versión 1.2: Después de tener


varios correos de gente preguntando por una nueva versión
de este Como con algunas recetas para crear el cd con
soporte de memoria en disco (ramdisk).

2001-02-12 liberada la versión 1.0

You might also like