viernes, 19 de octubre de 2007

pkgsrc: Install free or die!

FreeBSD

Resulta que cuando instalé por primera vez el FreeBSD y aprendí a instalar paquetes, descubrí que tiene tres formas de lograrlo:

Por medio de los binarios empaquetados.

Este procedimiento es como si descargaras el archivo .exe en Windows y lo instalaras en el sistema:

# ftp -a ftp2.FreeBSD.org
Connected to ftp2.FreeBSD.org.
220 ftp2.FreeBSD.org FTP server (Version 6.00LS) ready.
331 Guest login ok, send your email address as password.
230-
230- This machine is in Vienna, VA, USA, hosted by Verio.
230- Questions? E-mail freebsd@vienna.verio.net.
230-
230-
230 Guest login ok, access restrictions apply.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> cd /pub/FreeBSD/ports/packages/sysutils/
250 CWD command successful.directorio
ftp> get lsof-4.56.4.tgz
local: lsof-4.56.4.tgz remote: lsof-4.56.4.tgz
200 PORT command successful.
150 Opening BINARY mode data connection for 'lsof-4.56.4.tgz' (92375 bytes).
100% |**************************************************| 92375 00:00 ETA
226 Transfer complete.
92375 bytes received in 5.60 seconds (16.11 KB/s)
ftp> exit
# pkg_add lsof-4.56.4.tgz

Usando el programa pkg_add.

Es básicamente lo mismo que el método anterior sólo que en lugar de hacer el FTP y el get y todo el procedimiento de descarga, el programa lo hace todo por ti:

# pkg_add -r lsof

Compilando los paquetes.

El programa se encarga de descargar todo lo requerido para el funcionamiento del paquete, desempaqueta los archivos, los compila, los instala y listo. Este el método en el cual quiero puntualizar.

FreeBSD's Ports

Los señores que diseñaron el FreeBSD pusieron todo lo que tu necesitas para compilar los programas en un enorme esqueleto de Makefiles llamado "ports" que se ubica en:

/usr/ports

en el cual, accedes a el:

# cd /usr/ports

buscas el paquete que necesitas:

# make search name=lsof
Port: lsof-4.56.4
Path: /usr/ports/sysutils/lsof
Info: Lists information about open files (similar to fstat(1))
Maint: obrien@FreeBSD.org
Index: sysutils
B-deps:
R-deps:

vas a donde está ubicado el Makefile del programa:

# cd /usr/ports/sysutils/lsof

compilas, instalas y eliminas los archivos del proceso:

# make install clean
>> lsof_4.57D.freebsd.tar.gz doesn't seem to exist in /usr/ports/distfiles/.
>> Attempting to fetch from ftp://lsof.itap.purdue.edu/pub/tools/unix/lsof/.
===> Extracting for lsof-4.57
...
[extraction output snipped]
...
>> Checksum OK for lsof_4.57D.freebsd.tar.gz.
===> Patching for lsof-4.57
===> Applying FreeBSD patches for lsof-4.57
===> Configuring for lsof-4.57
...
[configure output snipped]
...
===> Building for lsof-4.57
...
[compilation output snipped]
...
#

y después de muchas horas tienes el programa listo para ser utilizado.

NetBSD Binary Packages

El manual menciona el siguiente procedimiento para agregar los binarios (packages o paquetes en la jerga del NetBSD):

Definimos la ruta de acceso, en mi caso estoy usando el NetBSD 3.1 en una máquina compatible con el i386:

Para los C-Shells (TCSH, etc):

[#] setenv PKG_PATH ftp://ftp.netbsd.org/pub/pkgsrc/packages/NetBSD-3.1/i386/All

Para los Bourne shells (Bash, etc):

[#] PKG_PATH="ftp://ftp.netbsd.org/pub/pkgsrc/packages/NetBSD-3.1/i386/All"
[#] export PKG_PATH

Y agregamos los paquetes que necesitas:

[#] pkg_add -v firefox
[#] pkg_add -v gimp
[#] pkg_add -v mc
[#] pkg_add -v gnome

Este procedimiento es similar al segundo de la instalación de paquetes del FreeBSD, pkg_add descarga el paquete con los binarios precompilados, los desempaqueta, instala y establece las opciones por default, además de descargar tambien las dependencias de éstos.

Es muy sencillo y sin complicaciones, sólo agregas la línea donde se define la variable de entorno PKG_PATH al archivo de inicio del shell de la cuenta del superusuario, loggeas como él e instalas lo que necesitas.

El detalle está en que a veces un determinado paquete necesita de otro que no está disponible en forma precompilada y tienes que compilarlo, instalarlo y seguir con la instalación del paquete que originalmente querías.

...todo tiene su razón...

Así reza la canción, vamos a suponer que quieres instalar una aplicación el cual no está disponible a través de tu administrador de paquetes nativo del sistema que usas.

Lo primero que haces es pedirle a San Google que te muestre la dirección donde puedes obtener su código fuente (los Slackers están acostumbrado a esta forma de instalar aplicaciones así que para ellos esto no es ninguna noveda').

Desempaquetas e inicias la configuración del proceso de compilación con el script ./configure pero ¡oh sorpresa!, ésta aplicación necesita de otra que para tu mala fortuna tampoco está disponible a través de tu administrador de paquetes nativo (cuánta razón tuvo el ingrato del Murphy al haber dicho que lo peor sucede en el peor momento), pero bueno, como estás de buenas y se te cuecen las habas por probar esa susodicha aplicación, le vuelves a pedir a San Google que te ilumine el camino de nuevo.

Descargas la dependencia, configuras el entorno de compilación y necesita de *OTRA* aplicación que tampoco tienes. Tu paciencia ya se empieza a agotar y después de una respiración profunda acudes de nuevo a San Google y ahí vas otra vez.

Esta vez la configuración del entorno de compilación del tercer nivel de dependencias no te dijo nada (a veces me pongo a pensar en estas situaciones que los objetos tienen más vida de lo que aparentan y se burlan de uno), entonces inicias la compilación y como no pasó a mayores instalas la dependencia.

Entonces regresas al segundo nivel y continuas con el script ./configure pero de nuevo, otra dependencia. Ya te empiezas a encabronar pero le sigues, buscas esa dependencia, la descargas, empiezas su proceso de configuración y ¡OTRA DEPENDENCIA QUE NO TIENES!

Entonces te pones a pensar "cómo no hubiera una forma de rastrear todas esas dependencias y que automáticamente las descarge, compile e instale", pues ya no sufras, la solución esta a tan solo dos tecleos de distancia.

Origen del pkgsrc

pkgsrc (se pronuncia "package source") fue inspirado en los ports del FreeBSD. Tambien es un conjunto de Makefiles que además de indicar cuáles son las dependencias de determinada aplicación sabe dónde puede conseguirlos (incluye una lista con varias direcciones por si da la casualidad de que el servidor del sitio oficial está apagado o en mantenimiento ese día).

pkgsrc es un universo a parte del sistema en donde está instalado, no le importa saber qué aplicaciones ya tienes instalado y ni existe una manera de hacérselo saber (sería una total estupidez y una enorme pérdida de tiempo y ancho de banda pedirle que te compile el KDE completo si ya lo tienes instalado). Con el simple hecho que funcione su bootstrap tienes la completa seguridad de que tiene todo lo necesario para que haga su magia

Los señores de NetBSD le han puesto tanto empeño a este proyecto al grado en que el alumno superó al maestro (por el aquello de haber sido inspirado en los Ports del FreeBSD) y es ahora un sistema independiente de NetBSD y de cualquier otro sistema en particular.

De la misma forma en que lo podrías usar en Debian, Slackware o en Ubuntu lo puedes usar en Solaris, AIX o en HP-UX (claro que con ciertos detallitos ya que no todos los sistemas son iguales).

Requisitos

Lo mínimo que necesita un sistema para poder usarlo es lo siguiente:

CVS — con el cual obtendrás una copia del árbol del pkgsrc.
GCC — Compilador C, obvio si no cómo diablos piensas compilar el código fuente.
G++ — Para las aplicaciones escritas en el lenguaje C++.
Make — Lo irónico de pkgsrc: necesitas un make para hacer su make... (!?)
Gawk — Para las expresiones.
libncurses-dev — Una librería ncurses para desarrollar aplicaciones.
SSH — Para hacer el tunneling y obtener los paquetes.
WGet — Para poder mejorar las descargas de los tarballs.

Configuración del entorno del CVS

*NOTA*

Todos los comandos con el pkgsrc se tienen que hacer como el superusuario.

Primero creas el archivo ~/.cvsrc y le agregas lo siguiente:

[#] vi ~/.cvsrc

checkout -P
update -dP
release -d
diff -upN
cvs -q -z3
rdiff -u

Ahora configuras el archivo de inicio del intérprete de comandos (el shell para los puristas) que esté usando el superusuario:

Para los Bourne shells:

CVSROOT="anoncvs@anoncvs.netbsd.org:/cvsroot"
CVS_RSH="ssh"

export CVSROOT CVS_RSH

Para los C-Shells:

setenv CVSROOT anoncvs@anoncvs.netbsd.org:/cvsroot
setenv CVS_RSH ssh

Descarga del árbol del pkgsrc

Simplemente:

[#] cd /usr

Y luego:

Si quieres la versión estable:

[#] cvs -q checkout -rpkgsrc-2007Q2 -P pkgsrc

Si quieres la versión actual:

[#] cvs -q checkout -P pkgsrc

Preparación del pkgsrc

Configuramos el entorno del pkgsrc a través de su bootstrap:

[#] cd /usr/pkgsrc/bootstrap

[#] ./bootstrap

Este proceso es muy importante. Si en las líneas de la compilación del bootstrap lees algún error corrígelo aunque el proceso haya acabado "satisfactoriamente".

Y agregamos las nuevas rutas:

Para el superusuario:

Para los Bourne Shells:

PATH="$PATH:/usr/pkg/bin:/usr/pkg/sbin"
MANPATH="$MANPATH:/usr/pkg/man"

export PATH MANPATH

Para los C-Shells:

setenv PATH ${PATH}:/usr/pkg/bin:/usr/pkg/sbin
setenv MANPATH ${MANPATH}:/usr/pkg/man

Para los usuarios normales (para que puedan acceder a los programas instalados vía pkgsrc):

Para los Bourne Shells:

PATH="$PATH:/usr/pkg/bin"
MANPATH="$MANPATH:/usr/pkg/man"

export PATH MANPATH

Para los C-Shells:

setenv PATH ${PATH}:/usr/pkg/bin
setenv MANPATH ${MANPATH}:/usr/pkg/man

Configuración del bmake

Agregamos lo siguiente para que se pueda mejorar la descarga de los tarballs:

[#] vi /usr/pkg/etc/mk.conf

.ifdef BSD_PKG_MK
...
PKG_RESUME_TRANSFER = yes
FETCH_CMD = wget
FETCH_BEFORE_ARGS = --passive-ftp
FETCH_RESUME_ARGS = -c
FETCH_OUTPUT_ARGS = -O

# Por si necesitas agregar alguna aplicacion X11
X11_TYPE = xorg

.endif # ends pkgsrc settings

Auditoría de paquetes

Para que puedas checar si no existe por ahí algún "hoyito" por donde se pueda
meter el chiflón en los paquetes (problemas de seguridad):

Instalamos el auditor:

[#] cd /usr/pkgsrc/security/audit-packages

[#] bmake fetch-list | sh

[#] bmake

[#] bmake install

[#] bmake distclean clean-depends

Descargamos el archivo de auditoría:

[#] cd /usr/pkg/sbin

[#] ./download-vulnerability-list

Auditamos los paquetes:

[#] cd /usr/pkg/sbin

[#] ./audit-packages

Administración de paquetes

Instalación de paquetes

Buscamos el paquete:

[#] find /usr/pkgsrc -type d | grep nombre_del_paquete

Lo instalamos:

[#] cd /usr/pkgsrc/seccion_del_paquete/nombre_del_paquete

Descargamos el paquete con sus dependencias ("fetching dependencies" dijeran los gringos):

[#] bmake fetch-list | sh

Observa que el comando incluye el tubito '|' y el 'sh'.

Compilamos (y esperamos):

[#] bmake

Instalamos (nos despertamos):

[#] bmake install

Y limpiamos para liberar espacio:

[#] bmake distclean clean-depends

Desinstalación de paquetes

Usando el bmake:

[#] cd /usr/pkgsrc/seccion_del_paquete/nombre_del_paquete

[#] bmake deinstall

Usando el pkg_delete:

[#] pkg_delete -v nombre_del_paquete

Información sobre los paquetes disponibles

Se puede obtener una lista en HTML que puedes consultar con el firefox, el konqueror, etc., de todos los paquetes que puedes instalar en tu sistema y que están disponibles vía pkgsrc:

[#] cd /usr/pkgsrc

[#] bmake readme

Y te esperas como tres horas para que te genere el índice de todos ellos.

Conociendo los targets del bmake

Para saber de qué otra manera puedes compilar los paquetes puedes obtener una lista de la siguiente manera (por ejemplo para descargar las dependencias "fetch-list":

[#] cd /usr/pkgsrc

[#] bmake help topic=fetch-list

Opciones de compilación

Para ver las opciones posibles de compilación del paquete:

[#] bmake show-list

"Desinstalación" del pkgsrc

La "desintalación" del pkgsrc consiste en lo siguiente:

Eliminar la estructura del pkgsrc:

[#] cd /usr

[#] rm -R pkg*

Eliminar la base de datos de los paquetes:

[#] cd /var/db

[#] rm -R pkg*

Para saber más...

El manual del pkgsrc:

The pkgsrc guide - for users and developers of pkgsrc, the centralized package build and management system . Available formats for download: PostScript and PDF

En el FreeNode

Los canales #netbsd y #pkgsrc (only for english speakers).

Dedicatoria

Este post está dedicado a todos los del canal de #netbsd en FreeNode por haberme soportado todo el tiempo que me llevó comprender la mecánica del pkgsrc, en especial al Malditron por su paciencia y sus consejos.

A los señores que diseñaron el pkgsrc: muchas gracias por habernos dado una alternativa segura, sencilla y confiable.

La ley de Murphy y las mujeres

Por cierto ¿y cómo se aplica la ley de Murphy en las mujeres? Fácil:

"Tu mujer no es la excepción"

Tétrico ¿no?

Saludos