El SysAdmin del 3er Mundo

todo lo que expliqué mientras nadie prestaba atención

pacman bajo el microscopio

| Comments

En este post, me propongo mostrarle algunas de las bondades de pacman. Cualquier que conozca Arch Linux, sabe de lo que estoy hablando.

Veremos bien de cerca el engranaje de está compleja maquinaria.

Pacman, es una herramienta lo suficientemente versátil como para llevar el nombre de “administrador de paquetes”. Su nombre es un juego de palabras que proviene de juntar las palabras “PACkage MANager”.

A diferencia de ciertas y determinadas distribuciones (entiéndase debian); que requieren más de 3 softwares para esa pincha. Pacman solo es autosuficiente para gestionar la paquetería. La herramienta repo-add, está incluída dentro del paquete de pacman y se usa para crear repositorios personalizados.

“huevo de pascua de pacman”
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[lazaro@artema ~]$ repo-elephant 
     __
    '. \
     '- \
      / /_         .---.
     / | \\,.\/--.//    )
     |  \//        )/  /
      \  ' ^ ^    /    )____.----..  6
       '.____.    .___/            \._)
          .\/.                      )
           '\                       /
           _/ \/    ).        )    (
          /#  .!    |        /\    /
          \  C// #  /'-----''/ #  /
       .   'C/ |    |    |   |    |mrf  ,
       \), .. .'OOO-'. ..'OOO'OOO-'. ..\(,

Como ya sabrán (o se darán por enterado) Arch Linux no es por release, si no que un canal en constante desarrollo, hace como upstream, donde se depositan los paquetes consideraros estables. Esto es lo que en distribuciones estáticas se llamara “repo”. Pacman lleva la ardua tarea de mantener el sistema debidamente actualizado. Nuestro sistema no tendrá “actualizaciones” si no que evolucionará constantemente desde el “core”, escalando horizontalmente el sistema completo.

De esta manera se logra el mítico equilibrio entre estabilidad y novedad.

Para ello, pacman debe tener constancia local de la lista de paquetes que hay en el upstream. Estas listas son ficheros de textos, comprimidos con gzip, que contienen información acerca de lo que hay arriba. Por ejemplo, contiene la URL de como descargarlos.

Para pacman, instalar un paquete o alar está lista, es casi la misma operación. Se llama “sync” (sincronizar)

“-Sy”
1
pacman -Sy

Pero puedes de un solo viaje, sincronizar y actualizar todo el sistema.

“lo úlitmo que trajo el barco
1
pacman -Syu

Buscar un paquete también es una operación de sincronización.

“buscar fulanito”
1
pacman -Ss fulanito

También puedes, bajar la lista, actualizar el sistema e instalar algo de un solo golpe.

“todo junto”
1
pacman -Syu fulanito

Pacman irá a los sitios que tiene declarado en el fichero: /etc/pacman.d/mirrorlist y bajará esos ficheros. Seguidamente los depositará en el directorio /var/lib/pacman/sync/

“bases de datos”
1
2
3
4
5
[lazaro@artema ~]$ file /var/lib/pacman/sync/*.db
/var/lib/pacman/sync/archlinuxfr.db: gzip compressed data, last modified: Thu May 21 04:31:59 2015, from Unix
/var/lib/pacman/sync/community.db:   gzip compressed data, last modified: Fri May 29 08:47:01 2015, from Unix
/var/lib/pacman/sync/core.db:        gzip compressed data, last modified: Wed May 27 19:02:40 2015, from Unix
/var/lib/pacman/sync/extra.db:       gzip compressed data, last modified: Fri May 29 04:27:15 2015, from Unix

Ahora nuestro sistema sabe lo que hay “arriba” (en el repo) y está listo para compararlo con lo que está “abajo” (instalado). La información sobre todo los paquetes que el sistema tiene instalado, se almacena en el directorio /var/lib/pacman/local/

La lista es muy grande para mostrarla. Pero dentro hay directorios con la versión de cada programa instalado. Dentro de ese subdirectorio, hay 4 ficheros que contiene la información del paquete instalado.

Por ejemplo, el paquete ruby, en su versión 2.2.2-1 responde al directorio /var/lib/pacman/local/ruby-2.2.2-1

Cada directorio, contiene 4 ficheros:

“metainfo de un paquete instalado”
1
2
[lazaro@artema ~]$ ls /var/lib/pacman/local/ruby-2.2.2-1/
desc  files  install  mtree

El fichero desc contiene la información que describe al paquete, versión, nombre, etc..

El fichero files contiene la lista de ficheros que instala dicho paquete.

El fichero install contiene una serie de comando disparadores, como post_install. Dentro de install, se declaró una función llamada post_install() que será llamada cuando el paquete termine de ser instalado.

Por último, mtree (que está comprimido con gz) contiene lo mismo que files, pero con la suma MD5 de cada fichero. Esto es usado por pacman para verificar la integridad de los archivos instalados.

Por ejemplo, si quisiéramos ver que ficheros contiene el paquete ruby, podríamos ver el contenido del fichero files pero sería más fácil usar el comando Query con el argumento list

“pacman -Ql fulano”
1
2
3
4
5
6
7
8
9
[lazaro@artema ~]$ pacman -Ql ruby|grep '/usr/bin/'
ruby /usr/bin/
ruby /usr/bin/erb
ruby /usr/bin/gem
ruby /usr/bin/irb
ruby /usr/bin/rake
ruby /usr/bin/rdoc
ruby /usr/bin/ri
ruby /usr/bin/ruby

El principal fichero de pacman, es /etc/pacman.conf y a diferencia de otros package managers, este es bien sencillo. Además, es MUY personalizable.

Por ejemplo, la cláusala XferCommand, permite especificar que comando usar para bajar los paquetes. Las variables, %u y %o serán enviadas como URL del paquetes y fichero en disco.

“scope de pacman.conf”
1
2
3
[lazaro@artema ~]$ cat /etc/pacman.conf|grep Xfer
#XferCommand = /usr/bin/curl --retry-delay 5 --progress-bar -C - -f %u > %o
XferCommand = /usr/bin/wget --no-cache -t 0 -T 10 --max-redirect=0 -w 5 --passive-ftp -c -O %o %u

Ese es un buen ejemplo de una configuración para wget en conexiones “hostiles”. Para que tengas una idea de cuan personalizable puede llegar a ser:

“NoExtract”
1
2
[lazaro@artema ~]$ cat /etc/pacman.conf|grep NoEx
NoExtract = *.mo

En este caso, los ficheros .mo no serán extraídos de los paquetes durante el proceso de instalación. Como yo uso el sistema en inglés, no me interesa tener las traducciones de sepetecientos idiomas.

Los paquetes que instales, irán al directorio /var/cache/pacman/pkg/ y podrías usar dicho directorio como repo para compartirlo con aquellos que no tiene acceso a internet; o bien, llevártelo para tu casa, lugar donde te integras al grupo antes mencionado.

Quizás te interese crear tu propio repo. La idea de crear un repo a partir de la cache, le ha tirado un cabo a una pila de gente. En un viaje reciente que hice por el oriente de la isla, cargué mi laptop con todo el software necesario he instalé 3 servidores con arch sin conectarme a internet (vergonzosa hazaña).

Con esta opción:

“mantener paquetes”
1
2
[lazaro@artema ~]$ cat /etc/pacman.conf|grep Clea
CleanMethod = KeepCurrent

Aquellos paquetes que una vez fuero instalados se mantienen. Por tanto, supón que quieres tener en la otra máquina (la de tu casa) “geary” el cliente de correo. Simplemente lo instalas y lo desinstalas en la máquina privilegiada.

“cacheando paquetes”
1
pacman -S geary && pacman -R geary

Ahora el paquete está en la cache, y aunque ya no está en el sistema, se conservará en la cache hasta que no lo borres. Claro, esto tiene como desventaja que no se bajarán actualizaciones para ese paquete.

En mi caso, yo tengo este escripcito al que llamo mkrepo.sh

mkrepo.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#!/bin/bash

# elimina esa base de datos
rm /var/cache/pacman/pkg/custom.db.tar.gz

# crea una nueva
repo-add /var/cache/pacman/pkg/custom.db.tar.gz /var/cache/pacman/pkg/*.pkg.tar.xz

# dime que tengo que poner
echo '''
[mirepo]
SigLevel = Optional TrustAll
Server = http://localhost:8080
'''
# sírvelo con darkhttpd
darkhttpd /var/cache/pacman/pkg/ --chroot --port 8080

Al correrlo, la cache se indexa; lista para ser usada como repo. El script hace un echo, para recordarte como sería la configuración que debes poner en /etc/pacman.conf para usar ese repo.

Finalmente, darkhttpd (un servidor web que viene con el Live de arch) sirve ese repo.

Quizás tengas una memoria flash donde creas el repo. En ese caso, bastaría con especificar una linea Server con la dirección file:///

Server = file:///media/MEMORIA/repo/

Simple verdad?

Pensé hacer esta entrada más larga, pero sería aburrir al lector. En cambio, ahora ya sabes una parte, te dejo que investigues el resto.

Happy Hacking!

Si este artículo te resultó interesante, considere donar 0.08 BTC: 1Kg4gu3e7u8HUw8bj5NbBciRg6Y56kuFCU

Comments