Instalar LFS en la misma partición que un sistema existente (v2)

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 .