domingo, 2 de octubre de 2011

Actualizando FreeBSD (desde el código fuente y con csup)

Una de las tareas administrativas más fáciles y con grandes proporciones es actualizar FreeBSD. Sea cual sea la versión a la que queramos actualizar. Todas tienen los mismos pasos a seguir (por lo menos las oficiales).

En este post trataremos de descargar primero el código fuente de FreeBSD mediante el comando csup(1) viene íntegro con el sistema (aunque hay otros métodos como subversion que dejaremos para más tarde).

Nota: Actualizaremos en sistema en base a la rama RELENG_8_2. que es la que contiene parches, correcciones y añadidos para la versión 8.2-RELEASE de FreeBSD.

1º Generando un fichero de configuración para csup(1).
# cd /root/
# cp /usr/share/examples/cvsup/standard-supfile  .
# sed -ie 's/CHANGE_THIS/cvsup.de/g' standard-supfile
# echo "umask=007" >> standard-supfile
2º Descargando el código fuente
# csup -g -L 2 /root/standard-supfile
3º Compilando world

Notas:
  • World es el entorno de las aplicaciones, librerías, manuales (man) que es ajeno al kernel.
  • En mi caso, si quería compilar el world con CFLAGS lo hacía usando las siguientes flags y almacenarlas en el fichero /etc/make.conf
CFLAGS+=-march=athlon64 -mmmx -msse -msse2 -m3dnow (No añadas las opciones de compilación -O2 -pipe porque están añadidas por defecto.)
CXXFLAGS+= (Aquí no se añade nada, ya toma como variables las de CFLAGS) 
Si tienes un CPU distinto, y no sabes que flags tiene, es mejor usar como nos dijo nuestro visitante Javier la opción -march=native.
Ten en cuenta que el compilador que tiene de base es GCC 4.2.1. Por lo tanto, no compilará con instrucciones SSE3, SSE4, SSE5..etc. Necesitarás instalar GCC 4.5.x (lang/gcc45) como mínimo. (La versión de GCC 4.4.x (lang/gcc44) no está mantenida. 
Si decides usarla, es tú decisión. (más información sobre compilar con otras versiones más actualizadas de GCC pulse aquí.)
  • Si quieres hacer compilaciones paralelas puedes hacerlo. Basta con definir en la línea "make -j"n"" dónde "n" es el número de compilaciones paralelas posibles. 
Para saber cuál te corresponde se le suma +x dependiendo de cuantos núcleos tengas. Por ejemplo, para 2 núcleos se usa -j3 (El 1 no se cuenta). Si tienes 4, -j5, y si tienes tan sólo 1 núcleo, omite esta opción.
Las compilaciones paralelas son muy buenas amigas, ergo nos compilan todo, más rápido pudiendo reducir desde desde 1h hasta mucho más dependiendo de tu CPU, RAM...etc y con una cuota de error muy pero que muy mínima. 
# cd /usr/src
# make buildworld
3º Compilando el kernel

En el siguiente paso se explicará como compilar el kernel GENERIC y no uno propio. Eso lo hablaremos más tarde.

Notas: 
  • El kernel es, como la parte mecánica/dinámica de un coche. Supongamos que la carrocería, los asientos, el volante es lo que denominamos world. Pero sin el motor, los discos de freno, la caja de cambios, la transmisión...etc el coche no se llamaría coche y mucho menos arrancaría. Se necesita la presencia de ambos.
  • Para compilar el kernel con FLAGS. Es necesario añadir esta variable al fichero /etc/make.conf
COPTFLAGS+=
  • Se puede usar compilaciones paralelas
  • Utilizar make kernel, es una alternativa más rápida al proceso (porque compila e instala después de haber compilado). Pero la desventaja es que no le asignas las compilaciones paralelas.  
# cd /usr/src
# make buildkernel
# make installkernel 
3º Actualizando FreeBSD (world y ficheros de configuración)

Una vez terminada la compilación/instalación del kernel. Reiniciamos y arrancamos FreeBSD como "Single user mode" (o boot -s). Una vez nos salga "Enter full pathname of shell or RETURN for /bin/sh" pulsamos enter y continuamos el proceso de actualización.
# fsck -y
# adjkerntz -i 
# mount -u /
# mount -a -t ufs
# cd /usr/src
# make installworld
# mergemaster
# make check-old
# reboot 
Nota: "make check-old", se usa para verificar si hay ficheros viejos que requieran ser revisados en el /usr/src/UPDATING  antes de eliminarlos, porque éstos ficheros podrían desestabilizar el sistema. En caso de que hubieran ficheros y has leído el  /usr/src/UPDATING. Procede a eliminarlos
# make delete-old
# make delete-old-libs

2 comentarios:

  1. y si mi procesador es de 32bit? ahi fallan las CFLAGS, mejor usar -march=native

    ResponderEliminar
    Respuestas
    1. Hola Javier,

      Tienes razón, tiré un apunte hacia el CPU que tenía. Si tu procesador es de 32 bits, no tendrías problemas habría que omitir el paso de make -j "", y usar como dices -march=native.

      Gracias.

      Eliminar