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 . |