22.4. Uso de make world

Una vez que has sincronizado las fuentes de tu árbol local con alguna versión determinada deFreeBSD (FreeBSD-STABLE, FreeBSD-CURRENT, y asi) puedes usar las fuentes del árbol para reconstruir el sistema.

Haciendo una copia de respaldoNunca se hace suficiente hincapié sobre lo importante que es hacer una copia de respaldo de tu sistema antes de hacer esto. Aunque reconstruir world es (siempre que sigas estas instrucciones) una tarea fácil de hacer, habrá veces que inevitablemente cometas errores, o cuando errores hechos por otros en las fuentes del árbol inutilice tu sistema haciendolo inarrancable.

Asegúrate de haber hecho una copia de respaldo. Y ten un diskette de reparación a mano. ¡Probablemente no tengas nunca que usarlo, pero es mejor asegurarse que lamentarlo!

Suscribete a la lista de correo correctaLas ramas FreeBSD-STABLE and FreeBSD-CURRENT son , por naturaleza, en desarrollo . La gente que contribuye a FreeBSD son humanos, y los errores ocasionalmente ocurren.

Algunos de estos errores pueden ser poco dañinos, que sólo causan que tu sistema imprima una nueva señal de diagnostico. O el cambio puede ser catastrófico, e inutilizar tu sistema inarrancable o destruir tu sistema de archivos ( o algo peor).

Si un problema como este ocurre, un “heads up” es enviado a la lista de correo apropiada, explicando la naturaleza del problema y a que sistema afecta. Y un “all clear” anuncio es enviado cuando el problema ha sido resuelto.

Si intentas seguir FreeBSD-STABLE o FreeBSD-CURRENT y no lees la lista de correo sobre FreeBSD-STABLE o la FreeBSD-CURRENT lista de correo respectivamente, entonces estás buscando problemas.

22.4.1. Lee /usr/src/UPDATING

Antes de hacer nada mas, lee /usr/src/UPDATING (o el archivo equivalente dondequiera que tengas una copia del código fuente). Este archivo puede contener importante información sobre problemas que puedes encontrarte, o indicar el orden en que debes ejecutar ciertas ordenes.) Si UPDATING contradice algo que leas aqui, UPDATING tiene preferencia.

Importante: Leer UPDATING no es un sustituto aceptable a la suscripcion a la lista adecuada, como se describió antes. Los dos requisitos son complementarios no exclusivos.

22.4.2. Comprueba /etc/make.conf

Examina los archivos /etc/defaults/make.conf y /etc/make.conf. El primero contiene algunas definiciones por defecto - la mayoría de las cuales ya se han comentado. Para hacer uso de ellas cuando reconstruyas tu sistema desde las fuentes, añadelas a /etc/make.conf. Ten en cuenta que cualquier cosa que añadas a /etc/make.conf se usa cada vez que ejecutas make, así que es una buena idea colocarles algo sensato para tu sistema.

Un usario típico querrá probablemente copiar las líneas CFLAGS y NOPROFILE encontradas en /etc/defaults/make.conf a /etc/make.conf y ponerles un comentario.

Examina las otras definiciones (COPTFLAGS, NOPORTDOCS y sucesivamente) y decide si son importantes para ti.

22.4.3. Actualiza /etc/group

Este directorio /etc contiene una gran parte de la información sobre la configuración de tu sistema ,asi como scripts que se ejecutan al iniciarse el sistema. Algunos de estos scripts cambian de versión en versión de FreeBSD.

Algunos de estos archivos de configuración son usados en el funcionamiento del día a día del sistema. En particular, /etc/group.

Ha habido ocasiones durante la instalación de “make world” que se ha supuesto la existencia de ciertos nombres de usuario o grupos. Cuando se lleva a cabo una actualizacion es probable que alguno de estos grupos no existan. Esto causa problemas cuando actualizas. para>

El ejemplo más reciente de esto es cuando el grupo “ppp” (llamado despues “network”) fue añadido. A los usarios les falló el proceso de instalación cuando partían del subsistema ppp fueron instaladas usando un nombre de grupo inexistente (para ellas).

La solución es examinar /usr/src/etc/group y comparar su lista con la tuya.Si hay algún grupo en el nuevo archivo que no están en tu archivo entonces cópialos encima. De la misma forma, deberías renombrar cualquier grupo en /etc/group que tenga la misma GID pero un nombre diferente para aquellas en /usr/src/etc/group.

Sugerencia: Si te sientes particularmente paranoico, puedes comprobar tu sistema para ver que archivos pertenecen al grupo que estas renombrando o borrando.

# find / -group GID -print

mostrará todos los ficheros que pertenecen al grupo GID (que puede ser o un nombre de grupo o una ID numérica de grupo).

22.4.4. Cambiando a modo Monousuario

Puede que quieras compilar el sistema en modo monousuario.Aparte del beneficio obvio de hacer que las cosas vayan más rapido , reinstalar el sistema tocará un montón de archivos importantes del sistema, todos los binarios standard del sistema, bibliotecas incluso archivos y demás. Cambiar estas cosas en un sistema en funcionamiento (especialmente si en ese momento hay usuarios activos en el sistema) es ganas de meterse en lios.

Otro método es compilar el sistema en modo multiusuario y luego cambiar a modo monousuario para la instalación.Si te gustaría hacerlo de esta forma, simplemente retrasa los siguientes pasos hasta que hayas completado la construcción.

Como superusuario, ejecuta

# shutdown now

desde un sistema en funcionamiento, al que cambiará a modo monousuario.

Alternativamente, reinicia el sistema, y en el boot promt, introduce la -s flag. El sistema se reiniciará en modo monousuario.En el promt de la shell deberías ejecutar:

# fsck -p
# mount -u /
# mount -a -t ufs
# swapon -a

Esto comprueba los sistemas de archivos, remounts / lectura/escritura, mounts, todos los sistemas de archivos UFS referenciados en /etc/fstab y entonces hace los cambios indicados.

22.4.5. Quita /usr/obj

Mientras algunas partes son reconstruidas ellas se colocan en directorios que (por defecto) estan bajo /usr/obj. Los directorios shadow estos bajo /usr/src.

Puedes acelerar el proceso “make world” y posiblemente ahorrarte dolores de cabeza por las dependencias quitando este directorio también.

Algunos archivos bajo /usr/obj pueden tener colocada la señal inmutable (immutable flag set) (mira chflags(1) para mas información) que deberá ser quitada primero.

# cd /usr/obj
# chflags -R noschg *
# rm -rf *

22.4.6. Recompilar la fuente

22.4.6.1. Guardando la salida (Output)

Es una buena idea guardar la salida que obtienes cuando se ejecuta make(1) en otro archivo. Si algo sale mal tendrás una copia del mensaje de error.Aunque esto puede no ayudarte en el diagnóstico de que ha salido mal, puede ser útil si mandas tu problema a una de las listas de FreeBSD .

La forma más fácil de hacer esto es usar la orden script(1) , con un parámetro que indique el nombre del archivo donde guardar los datos de salida.Podrías hacer esto inmediatamente antes de reconstruir world, y luego teclear exit cuando el proceso ha terminado.

# script /var/tmp/mw.out
Script started, output file is /var/tmp/mw.out   
# make TARGET
... compile, compile, compile ...     
# exit
Script done, ...

Si haces esto, no guardes el output en /tmp. Este directorio podria ser vaciado en el proximo arranque. Un lugar mejor para almacenarlo es en /var/tmp (como en el ejemplo anterior) o en el directorio home de root.

22.4.6.2. Compilar e instalar el Sistema Base (Base System)

Debes estar en /usr/src directory...

# cd /usr/src

(a menos que, por supuesto, tu código fuente este en otra parte, en ese caso cambia a ese directorio).

Para reconstruir world utiliza el make(1) command. Esta orden lee las instrucciones desde el Makefile, que describe como el programa que comprende el FreeBSD debe ser reconstruido.

El formato general de la línea de ordenes que teclearás es como sigue:

# make -x -DVARIABLE target

En este ejemplo, -x es una opción que pasarías a make(1). Mira la pagina del manual de make(1) para un ejemplo de las opciones que puedes pasar.

-DVARIABLE pasa una variable a el Makefile. El comportamiento de Makefile esta controlado por esas variables.Estas son las mismas variables como estan colocadas en /etc/make.conf, y esto proporciona otra forma de disponerlas.

# make -DNOPROFILE=true target

es otra forma de indicar que las bibliotecas indicadas no se construyan, y corresponde con el

NOPROFILE=    true
#    Avoid compiling profiled libraries

Las líneas en /etc/make.conf.

target dicen a make(1) que quieres hacer. Cada Makefile define un número de diferentes “objetivos”, y la elección de esos objetivos determina lo que ocurre.

Algunos objetivos estan listados en Makefile, pero no significa que puedas ejecutarlos En vez de eso, se usan por el proceso de consrucción para romper los pasos necesarios para reconstruir el sistema en un número de sub-pasos.

La mayoría de las veces, no necesitas pasar ningun parametro a make(1), y asi tu orden se parecerá a esto:

# make target

A partir de la versión 2.2.5 de FreeBSD (en realidad, se creó por primera vez en la FreeBSD-CURRENT branch, y luego posteriormente colocado en FreeBSD-STABLE a mitad de camino entre 2.2.2 y 2.2.5) el objetivo (target) world se ha dividido en dos. buildworld y installworld.

Como el nombre implica, buildworld construye un nuevo árbol bajo /usr/obj, y installworldinstala este árbol en una máquina con la versión current.

Esto es muy útil por dos motivos.Primero, te permite construir de forma segura, sabiendo que ningún componente del sistema current será afectado. La construcción es “self hosted”. Por esto puedes con seguridad ejecutar buildworld en una m6aacute;quina funcionado en modo multiusuario sin miedo a efectos indeseados.Aunque aun es recomendable que ejecutes installworld en modo monousuario.

En segundo lugar, permite usar NFS mounts para actualizar multiples m6aacute;quinas en tu red. Si tienes tres máquinas, A, B y C que quieres actualizar, ejecuta make buildworld y make installworld en A. B y C deben luego mount NFS /usr/src y /usr/obj desde A, y puedes luego ejecutar make installworld para instalar los resultados de la construcción en B y C.

Aunque el world target aún exista, se recomienda firmemente que no lo uses.

Ejecutar

# make buildworld

Ahora es posible especificar un opción -j make lo que provocará varios procesos simultaneos. Esto es lo mas útil en máquinas con multiples CPU. Sin embargo, ya que el proceso de compilación es IO bound mas que CPU bound es también útil en máquinas con una sóla CPU.

En una típica máquina mono-CPU ejecutarías:

# make -j4 buildworld

make(1) tendrías mas de 4 procesos ejecutandose en cada momento. La evidencia empírica comentada en las listas de correo muestran que esto da el mejor resultado.

Si tienes una máquina multi-CPU y estas usando un kernel configurado SMP prueba valores entre 6 y 10 y mira como se aceleran las cosas.

Estas advertido de que esto es aún experimental y que hacer commits al código fuente del árbol puede ocasionalmente romper esta posibilidad. Si world falla al compilar usando este parámetro intentalo de nuevo sin él, antes de informar de los problemas.

22.4.6.3. Momento (Timings)

Muchos factores influyen en el tiempo de construcción, pero generalmente un Pentium 3 500 Mhz con 128 MB de RAM tardara 2 horas en construir el árbol FreeBSD-STABLE , sin trucos o cortes durante el proceso. Un árbol FreeBSD-CURRENT tardará algo mas.

22.4.7. Compilar e instalar un nuevo Kernel

Para sacar el máximo provecho de nuestro sistema debemos recompilar el kernel. Esto es prácticamente una necesidad, ya que ciertas estructuras de memoria podrían haber cambiado y ciertos programas como ps(1) y top(1) fallarán hasta que el kernel y la versiones del código fuente sean la misma.

El modo más simple y seguro de hacer esto es construir e instalar un kernel basado en GENERIC. Mientras GENERIC puede no teer todos los dispositivos necesarios para tu sistema, debe tener todo lo necesario para arrancar tu sistema de nuevo en modo monousuario. Esta es una buena prueba de que el nuevo sistema funciona correctamente. Después de hacer el arranque desde GENERIC y verificar que el sistema funciona puedes luego construir un nuevo kernel basado en el archivo de configuración de tu kernel normal.

Si estas actualizando de FreeBSD 4.0 a superior entonces el procedimiento standard de construcción de kernel (descrito Capítulo 8) es desaconsejable.En vez de eso deberías, ejecutar estas ordenes

# cd /usr/src
# make buildkernel
# make installkernel

Si estás actualizando a una versión de FreeBSD por debajo de 4.0 usa el procedimiento de construcción standard del kernel. Sin embargo, se recomienda que uses una nueva versión de config(8), usando una línea de ordenes como esta.

# /usr/obj/usr/src/usr.sbin/config/config KERNELNAME

22.4.8. Arranca en Modo Usuario Único

Deberías arrancar en modo usuario único para probar como funciona el nuevo kernel.Haz esto siguiendo las instrucciones en Sección 22.4.4.

22.4.9. Instalar los Nuevos Binarios del Sistema

Si estuvieses construyendo una version de FreeBSD suficientemente reciente como para haber usado make buildworld entonces deberías usar ahora el installworldpara instalar el nuevo sistema de binarios.

Ejecuta

# make installworld

Nota: Si especificaste variables en la línea de orden make buildworld deberías poner las mismas variables en la línea de orden de make installworld . Esto no es necesariamente cierto para otras opciones; por ejemplo, , -j nunca debe ser usada con installworld.

Por ejemplo, si ejecutaste:

# make -DNOPROFILE=true buildworld

debes instalar los resultados con:

# make -DNOPROFILE=true installworld

de otro modo, instalaría bibliotecas seleccionadas que no habían sido construidas durante la fase make buildworld .

22.4.10. Actualización de archivos no actualizados por make world

Rehacer el world no actualizará ciertos directorios (en particular, /etc, /var y /usr) con los archivos de configuración nuevos o cambiados.

El medio más simple para actualizar estos archivos es usar mergemaster(8), aunque es posible hacerlo manualmente si lo prefieres. Nosotros te recomendamos fervientemente usar mergemaster(8), aunque, si lo haces entonces puedes saltar a la siguiente sección , puesto que mergemaster(8) es muy simple de usar. Deberías leer la página del manual primero, y hacer una copia de respaldo de /etc por si algo va mal.

Si deseas hacer la actualización manualmente no basta con que copies los archivos de /usr/src/etc a /etc y que funcione. Algunos de estos archivos deben ser “instalados” primero. Esto es porque el directorio/usr/src/etc no es una copia de lo que tu directorio /etc debería parecer. Además, hay archivos que deberían estar en /etc que no están en /usr/src/etc.

El medio más sencillo de hacer esto a mano es instalar los archivos en un nuevo directorio y luego trabajar con ellos buscando las diferencias.

Haz una copia de tu existente /etcAunque en teoría nada va a tocar este directorio automáticamente, es mejor estar seguros. Así que copia tu existente /etc en lugar seguro. Algo como:

# cp -Rp /etc /etc.old

-R hace una copia recursiva , -p almacena los tiempos, propiedad de los archivos y cosas así.

Necesitas construir el grupo de directorios que hagan el papel de / para instalar el nuevo /etc y otros archivos dentro. /var/tmp/root es una elección razonable, y también se requiere un número de subdirectorios debajo de este.

# mkdir /var/tmp/root
# cd /usr/src/etc
# make DESTDIR=/var/tmp/root distrib-dirs distribution

Esto construirá la necesaria estructura de directorio e intalará los archivos.Un montón de directorios que habrán sido creados bajo /var/tmp/root estan vacios y deberan ser borrados. Una forma muy f6aacute;cil de hacerlo es:

# cd /var/tmp/root
# find -d . -type d | xargs rmdir 2>/dev/null

Así quitamos todos los directorios vacios. (El error standard es redirigido a /dev/null para prevenir las advertencias sobre directorios que no están vacios.)

/var/tmp/root ahora contiene todos los archivos que deberían estar colocados en lugares adecuados bajo /. Ahora tienes que ir a cada archivo y determinar cuánto difieren de tus archivos exiting.

Date centa que algunos de los archivos que se habrán instalado en /var/tmp/root tienen un leading “.”. En el momento de escribir esta documentación los únicos archivos como estos son los archivos de inicio de la shell en /var/tmp/root/ y /var/tmp/root/root/, aunque podría haber otros (dependiendo de cuando leas esto.Asegurate de usar ls -a para capturarlos.

El sistema más fácil para hacerlo es usar diff(1) para comparar los dos ficheros.

# diff /etc/shells /var/tmp/root/etc/shells

Esto te mostrará las diferencias entre tu archivo /etc/shellsy el nuevo archivo /etc/shells . Úsalos para decidir si fusionas con los cambios que hayas hecho o si lo copias encima de tu viejo archivo.

Nombra el Nuevo Directorio de Root (/var/tmp/root) con un Sello temporal (time stamp), de esta forma puedes comparar fácilmente las diferencias entre versiones: Reconstruir frecuentemente el world significa que actualizas /etc tambien frecuentemente, lo que puede ser un poco pesado.

Puedes acelerar este proceso manteniendo una copia del último grupo de archivos cambiados que hayas fusionado en /etc. El siguiente metodo te da una idea de como hacer esto.

  1. Make the world como normal. Cuando quieras actualizar /etcy los otros directorios, dále al directorio de destino un nombre basado en la fecha actual. Si estuvieses haciendo esto el 14 de Febrero de 1998 harías lo siguiente.

    # mkdir /var/tmp/root-19980214
    # cd /usr/src/etc
    # make DESTDIR=/var/tmp/root-19980214 \
        distrib-dirs distribution
    
  2. Añade los cambios del directorio según lo explicado arriba.

    No quites el directorio /var/tmp/root-19980214 cuando hayas acabado.

  3. Cuando hayas descargado la ultima versión de las fuentes y las hayas rehecho, sigue el paso 1.Esto te dará un nuevo directorio, que podría llamarse /var/tmp/root-19980221 (si esperas una semana entre las actualizaciones).

  4. Tu puedes ahora ver las diferencias que se han hecho en esa semana intermedia usando diff(1) puedes usar diff para buscar recursivamente las diferencias entre los dos directorios.

    # cd /var/tmp
    # diff -r root-19980214 root-19980221
    

    Típicamente, este conjunto de diferencias serán más pequeñas que las que hay entre /var/tmp/root-19980221/etc y /etc. Como las diferencias son menores, es más fácil enviar esos cambios hasta tu directorio /etc .

  5. Ahora puedes quitar el más viejo de los dos directorios /var/tmp/root-*.

    # rm -rf /var/tmp/root-19980214
    
  6. Repite el proceso cada vez que necesites añadir un cambio a /etc.

Puedes usar date(1) para automatizar la generación de los nombres de directorio.

# mkdir /var/tmp/root-`date "+%Y%m%d"`

22.4.11. Actualiza /dev

DEVFS: Si estás usando DEVFS esto no sería necesario.

En la mayoría de los casos, la herramienta mergemaster(8) se dar6aacute; cuenta cuando es necesario actualizar dispositivos y se ofrecerá a hacerlo automáticamente. Estas instrucciones te dirán como hacerlo manualmente.

Por motivos de seguridad, este es un proceso con varios pasos.

  1. Copia /var/tmp/root/dev/MAKEDEV en /dev.

    # cp /var/tmp/root/dev/MAKEDEV /dev
    

    Si usaste mergemaster(8) para actualizar /etc, entonces tu script MAKEDEV debería haberse actualizado ya, aunque no hace daño si lo compruebas (con diff(1))y lo copias manualmente si fuese necesario.

  2. Ahora, toma una instantánea de tu actual /dev. Esta instantánea necesita contener los permisos, propiedades, números mayores y menores de cada archivo, pero no debería contener un sello temporal (time stamp) La forma más fácil de hacerlo es usar awk(1) para sacar alguna información.

    # cd /dev
    # ls -l | awk '{print $1, $2, $3, $4, $5, $6, $NF}' > /var/tmp/dev.out
    
  3. Rehacer todos los dispositivos.

    # sh MAKEDEV all
    
  4. Copia otra instantánea del directorio , esta vez en /var/tmp/dev2.out. Ahora mira entre esos dos archivos por si se te olvido crear algun dispositivo. No debería haber ninguno, pero es mejor estar seguro que lamentarlo.

    # diff /var/tmp/dev.out /var/tmp/dev2.out
    

    Podrás detectar más fácilmente discrepancias en las cuotas del disco que tienen que ver con mandatos tales como

    # sh MAKEDEV sd0s1
    
    Para recrear las entradas a las cuotas. Tus circunstancias especificas pueden variar.

22.4.12. Actualiza /stand

Nota: Este paso se incluye para completar. Puede omitirse sin miedo.

Para terminar completamente , podrías querer actualizar los archivos en /stand tan bien. Estos archivos consisten en enlaces sostenidos (hard links) a el binario /stand/sysinstall. Este binario debería estar enlazado estáticamente, para que pueda funcionar cuando ningún otro sistema de archivos (y en particular /usr)haya sido montado.

# cd /usr/src/release/sysinstall
# make all install

22.4.13. Reinicio

Ya esta hecho. Despues de que hayas verificado que todo parece estar en el lugar adecuado puedes reiniciar el sistema. Un simplefastboot(8) lo hará.

# fastboot

22.4.14. Finalizado

Deberías tener ahora tu sistema operativo actualizado con exito. Felicidades.

Si las cosas fueron ligeramente mal, es facil reconstruir una parte del sistema. Por ejemplo, si accidentalmente borraste /etc/magic como parte de la actualización o al añadir algo a /etc, la orden (command) file(1) dejara de funcionar. En ese caso, el arreglo sería ejecutar:

# cd /usr/src/usr.bin/file
# make all install

22.4.15. Preguntas

22.4.15.1. ¿Es necesario rehacer world en cada cambio?
22.4.15.2. ¿Cuando compilo falla con montones de señales de error 11 (u otro número de señal). ¿Qué ha ocurrido?
22.4.15.3. ¿Puedo quitar /usr/obj cuando he terminado?
22.4.15.4. ¿Puede continuarse una construcción interrumpida?
22.4.15.5. ¿Puedo usar una máquina comomaster para actualizar montones de maquinas (NFS)?
22.4.15.6. ¿Cómo acelero making the world?
22.4.15.7. ¿Queé hago si algo sale mal?

22.4.15.1. ¿Es necesario rehacer world en cada cambio?

No hay una respuesta fácil para esto, depende de la naturaleza del cambio. Por ejemplo, si sólo ejecutaste CVSup, y mostró las siguientes líneas mientras se actualizaba ,

src/games/cribbage/instr.c
src/games/sail/pl_main.c
src/release/sysinstall/config.c
src/release/sysinstall/media.c
src/share/mk/bsd.port.mk

Probablemente no merezca la pena reconstruir world entero. Puedes ir a los subdirectorios apropiados y make all install, y ya esta. Pero si el cambio fue mayor, por ejemplo src/lib/libc/stdlib entonces deberías o rehacer world, o al menos aquellas de sus partes que estan estáticamente unidas (asi como cualquier otra cosa que hayas añadido y que esté unida estáticamente).

Es cuestión de que elijas. Podrías estar contento ejecutando make world digamos cada quincena , y dejar que los cambios se acumulen hasta ese día. O quizá quieras hacerlo sólo a aquellas que hayan cambiado, y tengas confianza en haber comprobado todas las dependencias.

Y, por supuesto, todo esto depende de cada cuánto tiempo actualices y si estas usando la versión stable o current.

22.4.15.2. ¿Cuando compilo falla con montones de señales de error 11 (u otro número de señal). ¿Qué ha ocurrido?

Esto normalmente es una indicación de problemas de máquina. Al ejecutar make world ((Re)making world) se produce una sobrecarga del ordenador, que frecuentemente desencadena problemas de memoria.Esto se manifiesta cuando el compilador agoniza recibiendo señales extrañas.

Un indicador seguro de esto, es si puedes repetir el make y muere en un punto diferente del proceso.

En este cambio hay poco que puedas hacer excepto comenzar a probar los compenentes de tu máquina para saber cual es el que falla.

22.4.15.3. ¿Puedo quitar /usr/obj cuando he terminado?

La respuesta corta es si.

/usr/obj contiene todos los archivos binarios (object files) que se produjeron durante la fase de compilación.Normalmente, uno de los primeros pasos en el proceso “make world” es quitar este directorio y hacer uno nuevo. En este caso, mantener /usr/obj después de haber terminado no tiene mucho sentido, y liberarás un buen montón de espacio de disco (alrededor de 340MB).

Aunque, si sabes lo que haces puedes hacer que “make world” se salte este paso. Esto hará que la consiguiente construcción vaya más rápido, ya que la mayor parte de las fuentes no necesitarán recompilarse. La parte molesta de esto es que pueden provocarse problemas de dependencias, haciendo que la construcción falle de forma rara. Esto genera alboroto en las listas de correo, cuando una persona se queja de que su construcción ha fallado, sin darse cuenta de que es porque ha intentado acortar demasiado.

Si quieres vivir peligrosamente entonces haz make world, pasando la definición NOCLEAN , como esto:

# make -DNOCLEAN world

22.4.15.4. ¿Puede continuarse una construcción interrumpida?

Esto depende de como de lejos llegaste hasta encontar el problema.

En general (y esto no es una regla fija) El proceso “make world” construye nuevas copias de herramientas esenciales (como gcc(1), y make(1)) y el sistema de bibliotecas. Estas herramientas y bibliotecas estan entonces instaladas.Las nuevas herramientas y bibliotecas son usadas para reconstruirse a si mismas, y son instaladas de nuevo.El sistema entero (incluyendo ahora programas normales como ls(1) or grep(1))es entonces reconstruido con el nuevo sistema de archivos.

Si estas al final del proceso, y lo sabes (porque has mirado los resultados que estuviste guardando) entonces puedes (bastante seguramente) hacer

... fix the problem ...
# cd /usr/src
# make -DNOCLEAN all

Esto no deshará el trabajo de los previos “make world”.

Si ves el mensaje

--------------------------------------------------------------
Building everything..
--------------------------------------------------------------
en la salida “make world” entonces es probablemente bastante seguro hacer eso.

Si tu no ves ese mensaje, o no estas seguro, entonces es siempre mejor estar seguro que lamentarse, y comenzar otra vez desde el principio.

22.4.15.5. ¿Puedo usar una máquina comomaster para actualizar montones de maquinas (NFS)?

Esto es una tarea bastante sencilla, y puede ahorrar horas de compilacion en muchas máquinas.Simplemente ejecuta buildworld en una máquina central, y entonces NFS monta /usr/src y /usr/obj en la máquina remota y installworld alli.

22.4.15.6. ¿Cómo acelero making the world?

  • Ejecuta en modo monousuario.

  • Pon /usr/src y /usr/obj en sistemas de archivos diferentes en discos separados. Si es posible, pon esos discos en controladoras de discos separadas.

  • Aún mejor, pon esos sistemas de archivos a través de multiples discos usando ccd(4)

  • Desactiva el perfil (coloca “NOPROFILE=true” en /etc/make.conf). Casi seguro que no lo necesitas.

  • También en /etc/make.conf, coloca CFLAGS a algo como “-O -pipe”. La optimización “-O2” es mucho más lenta y la diferencia de optimización entre “-O” y “-O2” es normalmente poco importante. “-pipe” permite que el compilador utilice tuberias (pipes) antes que archivos temporales lo que ahorra accesos al disco (a expensas de memoria).

  • Pon la opción -j<n> para hacer que se ejecuten multiples procesos en paralelo.Esto ayuda se tenga un procesador o varios.

  • El sistema de archivos que contiene /usr/src puede ser montado ( o vuelto a montar) con la opción noatime . Esto evita al sistema de archivos el grabar la hora de acceso al archivo. Probablemente no te haga falta esta información para nada.

    # mount -u -o noatime /usr/src
    

    AvisoEste ejemplo supone que /usr/src esta en su propio sistema de archivo.Si no está (Por ejemplo, si es parte de /usr ) Entonces necesitarás el punto de montaje de ese sistema de archivos, y no /usr/src.



  • El sistema de archivos que contiene/usr/obj puede montarse (o volverse a montar) con la opción “async”. Esto hace que el disco escriba de modo asíncrono. En otras palabras, el grabar se completa inmediatamente, y el dato es escrito en el disco unos pocos segundos después.Esto hace que las grabaciones se agrupen juntas y puede ser una gran aceleración del funcionamiento.

    AvisoTen en cuenta que esta opción hace el sistema de archivos más fragil.Con esta opción hay un incremento de posibilidades, si la corriente falla, de que el sistemas de archivos sea irrecuperable cuando la m6aacute;quina se reinicie.

    Si /usr/obj es lo único en este sistema de archivos entonces no hay problema.Si tienes otros datos valiosos entonces asegúrate de tener copias recientes antes de habilitar esta opción.

    # mount -u -o async /usr/obj
    

    AvisoComo arriba, si/usr/objno está en su propio sistema de archivos, reemplazalo en el ejemplo con el nombre del apropiado punto de montaje.

22.4.15.7. ¿Queé hago si algo sale mal?

Asegurate de que tu entorno no tiene extrañas cruft de construcciones anteriores.Esto es suficiente.

# chflags -R noschg /usr/obj/usr
#rm -rf  /usr/obj/usr
#cd  /usr/src
# make cleandir
#make cleandir

Sí , make cleandir realmente debería ejecutarse dos veces.

Entonces comienza el proceso de nuevo, empezando con make buildworld.

Si aún tienes problemas, envía el error y la salida de uname -aa lista de correo para preguntas generales sobre FreeBSD. ¡Prepárate para contestar preguntas sobre tu setup

Éste y otros documentos pueden obtenerse en ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/.

Para preguntas acerca de FreeBSD, leer la documentación antes de contactar con la lista <questions@FreeBSD.org>.
Para preguntas acerca de esta documentación, e-mail a <doc@FreeBSD.org>.