jueves, 10 de noviembre de 2011

FreeBSD: Supporting DTrace

Hace unos días en marco del BSDDay 2011 asistí a una charla de Fer Gleiser donde explicaba el uso de una herramienta increible como es DTracre. Así que partiendo de que tengo un FreeBSD instalado en mi notebook personal, decidí comenzar a aprender esta nueva herramienta.

Como primera medida, es necesario tener instaladas las fuentes del kernel, por lo que para hacer esto, es necesario ejecutar sysinstall


Luego ingresar en Configure, seleccionar Distributions:


Seleccionamos SRC:


Y finalmente sys, ya que base se encuentra instado por default:


Una vez hecho esto damos OK, y comenzara a descomprimir las fuentes del kernel en /etc/src/sys


Una vez que este proceso está terminado, procedemos a compilar el kernel, al cual debemos modificarle algunos parámetros.

En mi caso tengo instalado FreeBSD 8.2 sobre 64 bits, por lo cual debo editar su pertinente archivo de configuración que se encuentra en /usr/src/sys/amd64/conf/GENERIC seteando los siguientes parámetros:


options KDTRACE_HOOKS
options DDB_CTFmake
options DEBUG="-g"


makeoptions WITH_CTF=1


Guardamos el archivo de configuración bajo el nombre de DTRACE en el mismo directorio y procedemos a compilar el kernel. 
# make buildkernel KERNCONF=DTRACE
# make installkernel KERNCONF=DTRACE
# shutdown -r NOW
Una vez listo esto, y rebooteado el sistema, procedemos a cargar y verificar que los módulos de DTrace se encuentren funcionando


# kldload dtraceall# kldstat | grep dtrace
0xffffffff81022000 396      dtraceall.ko
0xffffffff81028000 131460   dtrace.ko

Ahora necesitamos setear unos parámetros en el /etc/make.conf para que el nuevo software compilado no sea strippeado y ademas sea compilado con -f-no-omit-frame-pointer, para de esta manera mantener un registro de la posición del frame pointer, este es un registro de la CPU, que mantiene un record de la dirección de memoria donde se encuentra el último dato añadido al stack utilizando el método LIFO (Last In - Firt Out) (RSP en arquitecturas x86_64 y ESP en arquitecturas i386). Si make.conf no existe en /etc, copiamos un ejemplo de el: 
# cp /usr/share/examples/etc/make.conf /etc/
Y añadimos las siguientes líneas al final:
STRIP=CFLAGS+=-fno-omit-frame-pointer
Ahora, como paso opcional, podemos hacer un make buildworld. Lo primero es instalar cvsup:


# make search name=cvsup
Port: cvsup-16.1h_4
Path: /usr/ports/net/cvsup
Info: File distribution system optimized for CVS 
Maint:  bzeeb+freebsdports@zabbadoz.net
B-deps: 
R-deps: 
WWW:  http://www.cvsup.org/


# cd /usr/port/net/cvsup && make install clean

Una vez listo, si tenemos instalado el sistema base al hacer el cvsup es posible que fallé con el siguiente mensaje de error:
cd: can't cd to /usr/src/usr.bin/make
*** Error code 2

Stop in /usr/src.
*** Error code 1

Stop in /usr/src.
Esto es debido a que el parámetro *default host del archivo de configuración de cvsup no se encuentra seteado, por lo cual reemplazamos este con la URI del mirror de que queremos descargar las fuentes:


# cp /usr/share/examples/cvsup/standard-supfile /root/standard-supfile
# vi /root/standard-supfile

Y modificamos el parámetro por la URI de un mirror de FreeBSD:
*default host=cvsup4.us.FreeBSD.org
Guardamos los cambios y procedemos a hacer el cvsup de la siguiente forma:
# cvsup /root/standard-supfile
Una vez listo ya podemos hacer el make buildworld de la siguiente manera:
# make WITH_CTF=1 buildworld
# shutdown -r NOW
Booteamos en single-user y ahora procedemos a instalar:
# boot -s
# make installworld
Listo, ya tenemos nuestr kernel y nuestro entorno con soporte a DTrace, ahora solo resta instalar el userland de la siguiente manera:
# cd /usr/ports/sysutils/DTraceToolkit/ && make install clean
Ahora si, ya podemos hacer uso de DTrace en nuestro sistema. 

No hay comentarios:

Publicar un comentario