HowTo:705es:Crosscompiling

De Luispa

Compilación distribuida

En este artículo describo cómo usar "Cross compiling" y "distcc" para poder compilar los paquetes en el Compaq utilizando además mi servidor "bolica".

Nota: 
  "bolica" es el nombre de mi servidor. Xeon 5540 64bits (8 cpus): x86_64-pc-linux-gnu
   "sysroot" es el directorio toolchain utilizado para crosscompiling, está en "bolica": /usr/i686-pc-linux-gnu

  "minilur" es el nombre del Compaq.    Atom N270 (2 cpus): i686-pc-linux-gnu


Instalación de Crossdev en "bolica"

Creación del toolchain

  • Desde "bolica" y como root:
# USE="-*" crossdev -v --binutils 2.18-r3 --gcc 4.4.2 --kernel 2.6.30-r6 --libc 2.9_p20081201-r3 --ex-gdb --target i686-pc-linux-gnu
El toolchain queda instalado en /usr/i686-pc-linux-gnu/   <== A este directorio se le conoce como "sysroot"


Preparar el Host "bolica"

  • Añado la variable SYSROOT a /etc/bash/bashrc
# Para cross compiling
export SYSROOT="/usr/i686-pc-linux-gnu/"
  • Salgo de root y vuelvo a entrar y verifico que la variable está.
# echo $SYSROOT
/usr/i686-pc-linux-gnu/
  • Creo el make.conf en $SYSROOT/etc/make.conf
# Intel(R) Atom(TM) CPU N270 con GCC >= 4.3
ACCEPT_KEYWORDS="x86"
CHOST="i686-pc-linux-gnu"
CFLAGS="-O2 -march=core2 -mtune=generic -fomit-frame-pointer -pipe"
CXXFLAGS="${CFLAGS}"
MAKEOPTS="-j9"
USE="-font-server fontconfig xcb -motif -mozilla -firefox xulrunner alsa gnome oggvorbis jpeg png truetype udev X ffmpeg imagemagick java exif x264 gtk lm_sensors acpi pmu qt3support"
LINGUAS="es en"
VIDEO_CARDS="intel"
INPUT_DEVICES="keyboard synaptics mouse"
  • Copio make.globals y creo el profile
# cp /etc/make.globals "${SYSROOT}/etc"
# mkdir -p "${SYSROOT}/etc/portage/profile"
  • Link simbólico para el profile a utilizar en SYSROOT
ln -sn /usr/portage/profiles/default/linux/x86/10.0 "${SYSROOT}/etc/make.profile"
  • Creo un script "/usr/bin/xmerge" para facilitar el cross compiling
 #!/bin/bash
 CBUILD=$(portageq envvar CHOST)
 PORTAGE_CONFIGROOT="$SYSROOT"
 if [[ "$1" == "--root" ]] ; then
     ROOT="$2"
     shift 2
 else
     ROOT="$SYSROOT"
 fi
 export CBUILD PORTAGE_CONFIGROOT ROOT
 
 emerge $*
  • Creo un script "/usr/bin/xmake" para facilitar el cross compiling del kernel
#!/bin/bash
make CROSS_COMPILE="i686-pc-linux-gnu-" INSTALL_MOD_PATH="$SYSROOT" $*

Ejemplo de compilación

  • Un ejemplo para compilar ntp
# xmerge -av ntp

  • Nota:
Para hacer el despliegue se prepara con el programa "qpkg"
* Una vez que los paquetes se compilan y quedan en "sysroot", se podrán empaquetar para luego poder instalarlos en el equipo destino "minilur" usando el programa pkg. Un ejemplo: 
# ROOT="$SYSROOT" qpkg -P "${SYSROOT}/var/tmp/binpkgs" ntp
El paquete se archiva en se salva en $SYSROOT/var/tmp/binpkgs with a .tbz2 extension.
  • crossdev está ya preparado en "bolica"
Ya tengo preparado el sistema "bolica". No utilizaré la compilación desde bolica, sino que emplearé "distcc"

Instalación de distcc en "bolica" y "minilur"

Distcc permite distribuir tareas de compilación en diferentes ordenadores de la red. Está formado por un servidor "distccd" y un cliente "distcc"

  • emerge de distcc en ambos equipos
bolica # emerge -v distcc
minilur # emerge -v distcc

Salida en bolica:
* 
* IPv6 has not supported yet by distcc-3.1.
* 
* Tips on using distcc with Gentoo can be found at
* http://www.gentoo.org/doc/en/distcc.xml
* 
* How to use pump mode with Gentoo:
* # distcc-config --set-hosts "foo,cpp,lzo bar,cpp,lzo baz,cpp,lzo"
* # pump emerge -u world
* 
* To use the distccmon programs with Gentoo you should use this command:
* # DISTCC_DIR="" distccmon-text 5
* Or:
* # DISTCC_DIR="" distccmon-gnome
* 
* ***SECURITY NOTICE***
* If you are upgrading distcc please make sure to run etc-update to
* update your /etc/conf.d/distccd and /etc/init.d/distccd files with
* added security precautions (the --listen and --allow directives)
* 
  • Modifico el /etc/make.conf en "minilur", para que utilice distcc. No lo hago en "bolica" ya que es el ordenador potente y de momento no quiero que emplee distcc como cliente
Fichero /etc/make.conf
FEATURES="distcc"
  • Añado los dos ordenadores a la lista en ambos equipos
bolica # distcc-config --set-hosts "192.168.1.1/8,cpp,lzo"
minilur # distcc-config --set-hosts "192.168.1.1/8,cpp,lzo"
# distcc-config --set-log /var/log/distcc.log 

  • Edito el fichero /etc/conf.d/distccd
En bolica: 
  DISTCCD_OPTS="${DISTCCD_OPTS} --allow 192.168.1.0/24"
  DISTCCD_OPTS="${DISTCCD_OPTS} --listen 192.168.1.1"
En minilur: 
  DISTCCD_OPTS="${DISTCCD_OPTS} --allow 192.168.1.0/24"
  DISTCCD_OPTS="${DISTCCD_OPTS} --listen 192.168.1.20"
  • Arranco el daemon y lo configuro para que arranque siempre
bolica # rc-update add distccd default
bolica # /etc/init.d/distccd start
minilur # rc-update add distccd default
minilur # /etc/init.d/distccd start

Crossdev y Distcc

  • Por defecto distcc no está bien preparado para unirse a crossdev, así que realizamos lo siguiente en ambos equipos:
  • En bolica:
# cd /usr/lib/distcc/bin/
# rm c++ cc g++ gcc
# e x86_64-pc-linux-gnu-wrapper
  #!/bin/bash
  exec /usr/lib/distcc/bin/x86_64-pc-linux-gnu-g${0:$[-2]} "$@"
# chmod 755 x86_64-pc-linux-gnu-wrapper
# ln -s x86_64-pc-linux-gnu-wrapper cc
# ln -s x86_64-pc-linux-gnu-wrapper gcc
# ln -s x86_64-pc-linux-gnu-wrapper g++
# ln -s x86_64-pc-linux-gnu-wrapper c++
  • En minilur: (PENDIENTE)
# cd /usr/lib/distcc/bin/
# rm c++ cc g++ gcc
# e i686-pc-linux-gnu-wrapper
  #!/bin/bash
  exec /usr/lib/distcc/bin/i686-pc-linux-gnu-g${0:$[-2]} "$@"
# chmod 755 i686-pc-linux-gnu-wrapper
 ln -s i686-pc-linux-gnu-wrapper cc
 ln -s i686-pc-linux-gnu-wrapper gcc
 ln -s i686-pc-linux-gnu-wrapper g++
 ln -s i686-pc-linux-gnu-wrapper c++

Ejecución

  • A partir de ahora simplemente se ejecuta emerge en "minilur" y debería funcionar ... (PENDIENTE DE PROBAR)
Un ejemplo:
# emerge -v bmon
Con uso de pump
# pump emerge -v bmon



Monitorización

  • En modo gráfico con distccmon-gnome o distccmon-gui
# DISTCC_DIR=/var/tmp/portage/.distcc distccmon-gnome 1
  • O bien en modo texto
# DISTCC_DIR=/var/tmp/portage/.distcc distccmon-text 1



Enlaces y Créditos


Volver a Página inicial del Compaq Mini 705ES

--Luis 11:57 31 dic 2009 (CET)