TÍTULO: Instalar LFS en la misma partición que un sistema existente (v2)
VERSIÓN LFS: 3.0 (pero debería funcionar también en versiones posteriores)
AUTOR: Matthias S. Benkmann <m.s.b@gmx.net>
TRADUCTOR: Proyecto LFS-ES
SINOPSIS:
Esta receta explica cómo puedes instalar tu nuevo sistema LFS en una partición
(normalmente la partición /) que se encuentre ocupada por otro sistema Linux.
Comparado con el one-partition-hint.txt, este receta tiene las siguientes ventajas:
-no necesita el uso de un sistema de ficheros montado en memoria (loopback).
Esto significa que nunca tendrás que recompilar el núcleo de tu sistema anfitrión
para esta receta.
-no requiere destruir o modificar es sistema anfitrión.
-tanto el sistema anfitrión como el nuevo sistema LFS serán "ambos" arrancables
sin perdida de prestaciones.
-puede usarse para instalar varios sistemas LFS en paralelo en la misma partición.
Advierte que esta receta "NO" requiere la instalación de un gestor de arranque
especial para realizar esto.
RECETA:
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
ADVERTENCIA: ¡NO ME HAGO RESPONSABLE DE NINGÚN DAÑO CAUSADO POR
ESTAS INSTRUCCIONES! TODO LO QUE GARANTIZO ES QUE LAS HE ESCRITO
CON MIS MEJORES INTENCIONES.
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
######################################################################
HISTORIAL DE CAMBIOS
######################################################################
2002-02-18 -mover el arreglo de los puntos de montaje a antes de reiniciar, para
prevenir (inofensivos) fallos en mountfs cuando reiniciamos para hacer
a LFS el sistema primario.
-cambiadas las instrucciones de construcción para el mount estático a algo
menos propenso a fallos tipográficos.
-cambios de texto menores.
-suministrada la v2
######################################################################
REQUISITOS
######################################################################
Esta receta necesita, al menos, un núcleo 2.4.x en el sistema LFS que quieres
construir (el núcleo del sistema anfitrión puede ser cualquiera).
Desde el LFS 3.0, el libro usa un núcleo 2.4.x, por lo que si estás construyendo a
partir de una versión reciente del libro, este requisito está cumplido.
Esta receta asume que instalas tu sistema LFS en el directorio de nivel superior de
la partición que quieres usar, como /lfs o /mnt/lfs (asumiendo que tengas una partición
diferente montada en /mnt, de otra forma este no sería el directorio de nivel superior).
Otros directorios son posibles pero pueden causar problemas (p.e. instalarlo en
/bin/lfs es una idea estúpida). No debes usar un subdirectorio hasta que hayas usado
esta receta al menos una vez y comprendas lo que debes cambiar.
#####################################################################
CONSTRUYENDO EL SISTEMA LFS
#####################################################################
Construye el sistema LFS como se describe en el libro (bien, por supuesto debes
saltarte la creación su una neva partición y del sistema de ficheros). Después de
instalar bash en el capítulo 5, haz una copia de respaldo del bash estático:
cp $LFS/bin/bash $LFS/bin/static-bash
Después de instalar sh-utils en el capítulo 5, haz una copia de respaldo del chroot
estático:
cp $LFS/usr/bin/chroot $LFS/usr/bin/static-chroot
No es necesario tomar precauciones especiales cundo construyas el resto de los
capítulos 5 y 6.
Después de instalar todos los paquetes del capítulo 6 haz lo siguiente (fuera del
entorno chroot):
1. Compila una versión estática de la utilidad mount mediante las siguientes
instrucciones:
cd util-linux-* &&
./configure &&
cp defines.h defines.h.old &&
sed /ENABLE_NLS/d defines.h.old >defines.h &&
make -C lib &&
make -C mount LDFLAGS=-static &&
cp mount/mount $LFS/bin/static-mount
2. Crea el directorio vacio $LFS/old-distro.
3. Crea el siguiente guión como $LFS/sbin/init2
Debes sustituir "<LFS directorio>" con el directorio donde se encuentra tu sistema
LFS EN RELACIÓN A LA PARTICIÓN EN LA QUE ESTÁ. Si lo instalas en "/lfs"
(es decir, sobre la partición /), este es "/lfs" también, de acuerdo.
Ten en cuenta que "NO" puedes usar la variable "$LFS" pues no está disponible
cuando se inicia init2.
------------------- $LFS/sbin/init2 ------------------------------------------
#!<LFS directorio>/bin/static-bash
export PATH=<LFS directorio>/sbin:<LFS directorio>/bin:<LFS directorio>/usr/sbin
export PATH=$PATH:<LFS directorio>/usr/bin
static-mount -n --bind / <LFS directorio>/old-distro
exec static-chroot <LFS directorio> /usr/bin/env -i /sbin/init "$@"
--------------------------------------------------------------------------
Asegurate de que env se encuentra en $LFS/usr/bin (normalmente lo está, pero puedes
haberla movido a /bin por alguna razón).
Haz init2 ejecutable con el comando `chmod +x $LFS/sbin/init2'
#####################################################################
CREANDO LOS GUIONES DE ARRANQUE DEL SISTEMA
#####################################################################
Debes hacer los siguiente cambios en los guiones de arranque checkfs y mountfs
cuando los crees:
- en ambos cambia las secciones start) y stop)
/bin/mount -? -o remount,r? /
a
/bin/mount -? -o remount,r? /old-distro
es decir, reemplaza / con /old-distro
- en la sección stop) de mountfs añade la línea
/bin/mount -o remount,ro /old-distro
antes de la línea
/bin/umount -a -r
¡Asegurate de que no olvidas cambiar también el guión checkfs!
#####################################################################
HACIENDO INICIABLE EL SISTEMA LFS
#####################################################################
Ejecuta las instrucciones que se indican en "Haciendo el sistema LFS arrancable" con
los siguientes cambios:
1. Cuando crees el fichero /etc/fstab, sustituye "/" con "/old-distro"
EN LA ENTRADA PARA EL SISTEMA RAÍZ (¡no en todas partes!), por lo que
/etc/fstab no tendrá una entrada /, sólo una entrada /old-distro.
¡IMPORTANTE! Ponle a esta entrada la opción "noauto".
2. Cuando prepares el gestor de arranque haz los siguientes cambios:
Su usas LILO (como en el libro):
- <partición>es la partición donde se encuentra tu nuevo sistema LFS, es decir, la / de
tu sistema anfitrión si lo instalas en /lfs, o la partición montada en /mnt si lo instalas
en /mnt/lfs.
Esto no es realmente un cambio de las instrucciones estándar de LFS. Es sólo
repetirlas en caso de que te preguntes si todavía son válidas.
- "image=/boot/lfskernel" debes cambiarlo a
"image=<LFS directorio>/boot/lfskernel"
<LFS directorio> debes reemplazarlo con el directorio adecuado como en la
anterior creación del guión init2.
- haz que LILO le pase "init=<LFS directorio>/sbin/init2" al núcleo. Puedes hacerlo
añadiendo la línea
append="init=<LFS directorio>/sbin/init2"
a la entrada del arranque de tu nuevo LFS en lilo.conf.
Si usas GRUB:
- cambia la línea para el núcleo en menu.cfg en la entrada que crees para tu nuevo
sistema LFS para que use <LFS directorio>/boot/lfskernel como el núcleo, y que le
pase "init=<LFS directorio>/sbin/init2". La línea se parecerá a la siguiente:
kernel /lfs/boot/lfskernel root=/dev/hda1 ro init=/lfs/sbin/init2
Reemplaza /lfs con el valor adecuado para <LFS directorio> como en la anterior
creación del guión init2. Sustituye /dev/hda1 con la partición correcta (es decir, la / de
tu sistema anfitrión si lo instalas en /lfs, o la partición montada en /mnt si lo instalas
en /mnt/lfs).
ADVERTENCIA: A menos que reinstales GRUB, debes añadir la entrada para el
sistema LFS en el menu.ls DE TU SISTEMA ANFITRIÓN. La simple creación de
un menu.lst en $LFS/boot/grub no soluciona nada. Es mejor sincronizar el menu.lst
de tu sistema anfitrión con el del sistema LFS.
3. En el improbable caso de que la partición de tu nuevo sistema LFS no tenga aún
un directorio /dev (por ejemplo si lo has instalado en la partición /usr de tu sistema
anfitrión), debes crear uno.
La forma más fácil es copiar el de tu LFS
cp -a $LFS/dev $LFS/..
4. Ahora continúa con el libro. Todo debería funcionar como se indica, y si lo haces
todo correctamente deberías ser capaz de iniciar tu sistema LFS sin problemas.
A través del directorio /old-distro tendrás acceso al / real de la partición y a los
ficheros de tu sistema anfitrión. Ten en cuenta que los ficheros en /old-distro pueden
pertenecer a usuarios que no existen en el sistema LFS, por lo que sólo se mostrarán
los UIDs y GIDs numéricos.
#####################
PARTICULARIDADES
#####################
1. Puede, o puede que no, veas errores de umount del tipo "/dev/root: not found" y/o
"/: not mounted" durante el cierre del sistema. Son inofensivos.
2. Su quieres remontar la partición /, en realidad debes remontar /old-distro.
NUNCA desmontes /old-distro. Si lo haces, no serás capaz de remontar / en solo
lectura nunca más, es decir, no serás capaz de cerrar el sistema limpiamente.
Si sucede que haces un unmount /old-distro por "accidente" (lee: "estúpidamente"),
haz lo siguiente:
1. mata todos los procesos y desconectate de todos los terminales.
2. conectate como root.
3. ejecuta el comando
/bin/sync
3 veces. Grita "No quiero un sistema de ficheros corrupto" y golpeate en la cabeza
tras cada ejecución del comando (esto es ¡importante! No te quejes a nadie
sobre sistemas de ficheros corruptos si no sigues adecuadamente la secuencia
sync, grito, cabezazo, sync, grito, cabezazo, sync, grito, cabezazo).
4. /sbin/reboot
fsck debería comenzar automáticamente tras el reinicio, pero no debería haber
ninguna corrupción (al menos si sigues correctamente el paso 3)
#####################################################################
INTERCAMBIANDO LOS SISTEMAS ANFITRIÓN Y LFS
#####################################################################
Bien, ahora tu sistema LFS se lanza mediante chroot. Esto no tiene ningún efecto
perverso en el rendimiento, pero no es el "modo correcto", por lo que una vez que
estés contento con tu sistema LFS querrás convertirlo en tu sistema primario. Esto
es un poco complicado. Las siguientes instrucciones no borran ningún fichero, pero si
algo sale mal, es posible que ni tu sistema anfitrión ni el LFS vuelvan a arrancar.
Deberías tener un disquete de arranque Linux o un CD a mano. Esto es lo que debes
hacer ahora:
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
ADVERTENCIA: ¡NO ME HAGO RESPONSABLE DE NINGÚN DAÑO CAUSADO POR
ESTAS INSTRUCCIONES! TODO LO QUE GARANTIZO ES QUE LAS HE ESCRITO
CON MIS MEJORES INTENCIONES.
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1. Arranca tu sistema LFS.
Asegurate de que no tienes ningún punto de montaje en /old-distro (¿para qué podrías
quererlo?). Entonces haz
cd /old-distro
mkdir old-distro #esto crea el directorio /old-distro/old-distro
for dir in * ; do
if [ ! $dir -ef / -a ! $dir -ef ./old-distro -a ! $dir -ef ./boot \
-a ! $dir -ef ./lost+found ]; then
mv $dir old-distro
fi
done
¡ESTE ES EL PUNTO SIN RETORNO! ¡DESPUÉS DE LOS ANTERIORES
COMANDOS NI TU SISTEMA LFS NI EL ANFITRIÓN PODRÁN ARRANCAR!
¡DEBES COMPLETAR LAS SIGUIENTES INSTRUCCIONES CORRECTAMENTE!
cd /
for dir in * ; do
if [ $dir != old-distro -a $dir != boot -a $dir != lost+found ]; then
ln -s <LFS directorio>/$dir /old-distro/$dir
fi
done
En lo anterior, sustituye, como siempre, <LFS directorio> con el directorio de tu
sistema LFS relativo a su partición.
Ten en cuenta que estos enlaces simbólicos actualmente están rotos.
Sin embargo, funcionarán cuando arranques sin el guión init2.
2. Cambia el fichero de configuración de tu gestor de arranque y elimina el "2" de
"init=<LFS directorio>/sbin/init2" , es decir, queremos iniciar el programa init real,
no el guión init2..
ASEGURATE DE EDITAR EL FICHERO DE CONFIGURACIÓN CORRECTO.
Dependiendo de como hayas activado tu gestor de arranque, puede estar en /boot
o /old-distro/boot. Lo mejor es sincronizar ambos para evitar problemas.
3. Si tu gestor de arranque necesita ser reinstalado después de cambiar el fichero de
configuración, reinstálalo (por ejemplo, ejecuta `/sbin/lilo' para LILO).
4. Desmonta (o remonta en solo lectura) todos los sistemas de ficheros EXCEPTO
/, /old-distro y lo sistemas de ficheros virtuales (como proc, devfs, devpts,...).
Ten en cuenta que NO DEBES usar umount -a. Tienes que usar un comando
`umount -r' para cada sistema ficheros listado en /proc/mounts excepto para los
mencionados anteriormente.
Puede que necesites matar algunos procesos antes de que el desmontaje funcione.
Cambiar al nivel de arranque 1 normalmente debería dejarte con un sistema en el que
ningún tenga ocupado tus sistemas de ficheros.
5. Cambia el /etc/fstab de tu sistema LFS para listar / en lugar de /old-distro.
Cambia también el `noauto' a `defaults' (o lo que quiera que uses normalmente).
6. Cambia checkfs y mountfs a lo que hay en un sistema LFS normal, es decir,
deshaz los cambios mencionados en el anterior CREANDO LOS GUIONES DE
ARRANQUE DEL SISTEMA.
7. Ahora debemos fijar los puntos de montaje. Comprueba tu /etc/fstab para encontrar
qué directorios tienen puntos de montaje en / (o sea, puntos de montaje que sólo
contienen un "/". "/dev/pts" por ejemplo NO cuenta.).
Un directorio que siempre tiene un punto de montaje en / es /proc. Fijémoslo:
cd /old-distro
rm proc
mkdir proc
Ahora procedamos con los otros puntos de montaje. Elimina los enlaces simbólicos
en /old-distro y crea en su lugar un directorio real.
ADVERTENCIA: En realidad no necesitas hacer esto para todos los puntos de
montaje, solo en aquellos que se montan automáticamente durante el arranque.
Puedes saltarte los puntos de montaje marcados con "noauto".
8. Ahora remonta tu sistema de ficheros raíz en solo lectura con
/bin/mount -o remount,ro /old-distro
y ahora reinicia y elige otra vez la entrada de arranque de tu nuevo sistema LFS
(tu sistema anfitrión no volverá a funcionar jamás).
9. Tu sistema LFS debería funcionar de forma normal, pero cada directorio <dir> en
/ (excepto old-distro/, <LFS directorio> y algún punto de montaje) son un enlace
simbólico a <LFS directorio>/<dir>.
Esto no es bonito, así que vamos a fijarlo ahora.
Primero vamos a comprobar los puntos de montaje. Si lo has hecho todo bien
hasta ahora, entonces no debería haber puntos de montaje que sean enlaces
simbólicos en <LFS directorio> (al menos ninguno que tenga actualmente un
sistema de ficheros montado).
Usa el comando
cat /proc/mounts
para obtener la lista de todos los sistemas de ficheros montados. Las entradas
peligrosas se parecerán a esto
foo <LFS directorio>/bar type rw 0 0
Ten en cuenta que sólo los puntos de montaje que se encuentren directamente bajo
<LFS directorio> son peligrosos. Un punto de montaje "<LFS directorio>/xyzzy/bar"
es inofensivo porque está en un subdirectorio de <LFS directorio>.
Si de hecho olvidaste un punto de montaje <LFS directorio>/bar,
haz lo siguiente
umount <LFS directorio>/bar
cd /
rm bar
mkdir bar
Haz lo mismo con otros puntos de montaje en <LFS directorio>. Desmonta, elimina
el enlace simbólico y crea en su lugar un directorio real.
ADVERTENCIA: Si eres incapaz de desmontar un sistema de ficheros, esto no
importa SIEMPRE QUE ELIMINES EL ENLACE SIMBÓLICO. ¡***NO DEBE***
QUEDAR NINGÚN ENLACE SIMBÓLICO EN / QUE APUNTE A UN PUNTO DE
MONTAJE QUE ESTÉ EN USO ACTUALMENTE!
¡¡¡PELIGRO!!! ¡¡¡PELIGRO!!! ¡¡¡PELIGRO!!! ¡¡¡PELIGRO!!!
COMPRUEBA REPETIDAS VECES QUE TODOS LOS ENLACES SIMBÓLICOS
EN / APUNTAN A DIRECTORIOS REALES Y ***NO*** A PUNTOS DE MONTAJE
ACTUALMENTE EN USO.
De acuerdo, ahora que estamos *positivamente seguros* de que ninguno de los
enlaces simbólicos en / apuntan a puntos de montaje en uso, podemos continuar.
Primero debemos cambiar /tmp a un directorio real:
rm tmp
mv <LFS directorio>/tmp .
Ahora necesitamos algunos preparativos
export LD_LIBRARY_PATH=<LFS directorio>/lib:<LFS directorio>/usr/lib
cp /bin/mv /tmp
cp /lib/ld-linux.so.2 /tmp
Finalmente podemos librarnos del resto de enlaces simbólicos.
ADVERTENCIA: Si algo fuese mal al mover el directorio /lib no te asustes.
<LFS directorio>/sbin/sln es un ln enlazado estáticamente que puedes usar para
establecer los enlaces simbólicos y hacer que funcione de nuevo.
cd /
for l in * ; do
if [ -L $l ]; then
source=$(find $l -printf "%l\n") &&
rm $l &&
/tmp/ld-linux.so.2 /tmp/mv $source $l
fi
done
rm /tmp/mv
rm /tmp/ld-linux.so.2
10. Por último, cambia la entrada en el fichero de configuración de tu gestor de
arranque a lo que en realidad debe contener. Elimina el "init=<LFS directorio>/sbin/init"
y cambia "<LFS directorio>/boot/lfskernel" a "/boot/lfskernel". Ten en cuenta que
si has seguido exactamente las instrucciones, /boot es todavía el antiguo /boot de
tu sistema anfitrión. Sincronizalo con /lfs/boot si es necesario. Si usas LILO no
olvides ejecutar /sbin/lilo después de cambiar lilo.conf.
11. Para estar seguro ahora debes desmontar todos los sistemas de ficheros o
remontarlos en solo lectura. A continuación puedes reiniciar y todo debería ir bien.
Tu antigua distribución la encontrarás en /old-distro .
|