Instalación y actualización de apt-cacher

Apt-cacher es un software que permite configurar un equipo de la red local como intermediario (proxy-caché) para que las peticiones de instalación/actualización del resto de equipos puedan aprovechar una copia “local” y no saturen la conexión de red a internet.

apt-cacher-ngCuando un equipo cliente solicite una lista o paquete a cualquiera de los repositorios que tenga configurados (oficiales o no) delegará la descarga al servidor de “apt-cacher”. Si existe una copia en el servidor se devolverá al cliente. En caso contrario el servidor descargará la lista/paquete, hará copia para otras peticiones posteriores y la enviará al cliente.

Es posible configurar el servidor “apt-cacher” para que optimice el espacio ocupado manteniendo sólo copias de los archivos con la última versión, copias para distintas distribuciones de Ubuntu (12, 14, …) o arquitecturas (32 / 64 bits), así como restringir el uso a equipos o subredes concretas.

Instalación inicial

  1. Localiza un equipo que pueda actuar como servidor, con IP fija, y espacio suficiente en la partición de usuarios del disco duro (+10Gb).

  2. Instalar con “apt-get install apt-cacher apache2

  3. Configurar como “demonio” para que inicie automáticamente. Si no preguntara durante la instalación hay que modificar el archivo “/etc/default/apt-cacher” y cambiar la línea de “autostart” a “1”

  4. Asegúrate de que el servidor apt-cacher está parado con “ service apt-cacher stop”

Ajustes a la configuración por defecto del servidor

En nuestro caso la partición del sistema que incluye el directorio “/var/cache” está limitada a 8-10Gb. Es en este directorio donde por defecto se guardarán las copias de los paquetes de apt-cacher. Corremos el riesgo de quedarnos sin espacio en esa partición.

Vamos a crear en primer lugar un nuevo directorio en la partición de “/home” que tiene mucho más espacio libre asignado. Se lo asociaremos al usuario del servidor apache:

mkdir /home/apt-cacher
chown www-data:www-data /home/apt-cacher
chmod 770 /home/apt-cacher

Edita el fichero “/etc/apt-cacher/apt-cacher.conf”y realiza los siguientes cambios

  1. Descomenta y edita la línea “cache_dir = /var/cache/apt-cacher” y cámbiala por “cache_dir = /home/apt-cacher” para que utilice el directorio que hemos creado previamente.

  2. Opcionalmente descomenta y edita la línea “admin_email = root@localhost” y cambia la dirección de correo por otra con más sentido.

  3. Descomenta la línea “daemon_addr = localhost” y modifícala para que refleje la IP del servidor (192.168.0.3 en mi caso) de la forma “daemon_addr = 192.168.0.3 ”.

  4. Si existen en la red varios tipos de distribuciones (Debian, Ubuntu) es posible separar los paquetes de cada una habilitando la opción “distinct_namespaces”. Descomenta la línea correspondiente y cámbiala a “distinct_namespaces = 1”.

  5. Descomenta la línea de “allowed_hosts = *” para que cualquier equipo de la red pueda acceder al servidor. En caso contrario observarás mensajes del tipo “403 access to cache prohibited” o similar cuando traten de instalar/actualizar paquetes los clientes.

  6. Descomenta la línea “generate_reports = 1” para que el servidor regenere el informe de uso cada 24 horas.

  7. Descomenta la línea “clean_cache = 1” para que el servidor se purge cada 24 horas y elimine las copias de paquetes de versiones no actualizadas y se quede con la última.

(Opcional) Modifica el fichero “/etc/services” para reflejar el uso del puerto “3142” por parte de “apt-cacher”. Añade al final del archivo las líneas:

apt-cacher 3142/tcp 
apt-cacher 3142/udp

Para terminar vamos a reconfigurar la forma en que el servidor instala/actualiza sus propios paquetes. Ejecuta el siguiente comando para crear un nuevo fichero de ajuste de configuración para “apt” (suponiendo que la dirección IP 192.168.0.3 es la del servidor. Cámbiala por la tuya):

echo "Acquire::http::Proxy \"http://192.168.0.3:3142\";" > /etc/apt/apt.conf.d/01proxy

Reinicia ahora el servicio con “service apache2 restart; service apt-cacher restart”.

Verificación del funcionamiento del servidor

  1. Abre la página “direccion_ip_servidor:3142” en un navegador y comprueba que devuelve la página con la configuración activa.

  2. Actualiza la lista de paquetes disponibles con “apt-get update”.

  3. Actualiza el servidor con “apt-get dist-upgrade”. Reinicia si es necesario.

  4. A continuación puedes verificar que se han hecho copia de las listas y de los archivos a partir del directorio “/home/apt-cacher”.

Configuración de los clientes

Ejecuta el siguiente comando para crear un nuevo fichero de ajuste de configuración para “apt” (suponiendo que la dirección IP 192.168.0.3 es la del servidor. Cámbiala por la tuya):

echo "Acquire::http::Proxy \"http://192.168.0.3:3142\";" > /etc/apt/apt.conf.d/01proxy

Una vez configurados los clientes SOLO instalarían/actualizarían a través del servidor-proxy. Si éste no estuviera disponible se produciría un error de acceso y no completarían el proceso. Para evitarlo sugiero utilizar uno o varios de los siguientes medios:

Opción 1: Configuración al iniciar el sistema

Escribe el siguiente script dentro del fichero “/etc/rc.local”:

. /lib/lsb/init-functions

SERVIDOR_APT=192.168.0.3

log_daemon_msg "Configurando el servidor APT cache proxy (verificando acceso a $SERVIDOR_APT ...)"

ping -c 1 $SERVIDOR_APT &> /dev/null

if [ $? = "0" ]; then
 log_daemon_msg "Encontrado. Configurando acceso..."
 echo "Acquire::http::Proxy \"http://$SERVIDOR_APT:3142\";" > /etc/apt/apt.conf.d/01proxy
else
 log_daemon_msg "No encontrado. Retirando configuración..."
 rm /etc/apt/apt.conf.d/01proxy &> /dev/null
fi

log_end_msg 0

Nota: Modificar la primera línea del archivo y sustituir “#!/bin/sh -e” por “#!/bin/bash”

Opción 2: Automatizar con “cron”

  1. Crea un archivo llamado “check-apt-cacher.sh“ en la carpeta de “/root”.
  2. Escribe en su interior el script de control:
#!/bin/bash

SERVIDOR_APT=192.168.0.3

ping -c 1 $SERVIDOR_APT &> /dev/null

if [ $? = "0" ]; then
 echo "Acquire::http::Proxy \"http://$SERVIDOR_APT:3142\";" > /etc/apt/apt.conf.d/01proxy
else
 rm /etc/apt/apt.conf.d/01proxy &> /dev/null
fi
  1. Dale permisos de ejecución con “chmod +x /root/ check-apt-cacher.sh
  2. Abre el editor de programación del cron con “crontab -e” y añade la siguiente línea:
    */5 * * * * /bin/bash /root/check-apt-cacher

Sal del editor guardando los cambios. Con esto se ejecutará el ajuste cada 5 minutos.

Opción 3: Script para actualizar manualmente

#!/bin/bash

SERVIDOR_APT="192.168.0.3"

INSTALACION="alumno"

verifica_ppa() {
 grep -h -q "^deb.*$2" /etc/apt/sources.list /etc/apt/sources.list.d/* > /dev/null 2>&1
 if [ $? -ne 0 ]; then
   if [ $1 = "add" ]; then
     add-apt-repository -y $2 &> /dev/null
     return 0
   fi
 fi
 if [ $1 = "del" ]; then
   add-apt-repository -y -r $2 &> /dev/null
 fi
 }

ping -c 1 $SERVIDOR_APT &> /dev/null

if [ $? = "0" ]; then
  echo "Acquire::http::Proxy \"http://$SERVIDOR_APT:3142\";" > /etc/apt/apt.conf.d/01proxy
  HAY_SERVIDOR=1
else
  rm /etc/apt/apt.conf.d/01proxy &> /dev/null
  HAY_SERVIDOR=0
fi

if [ $HAY_SERVIDOR = "1" ]; then
  wget -q http://$SERVIDOR_APT/$INSTALACION/ppa_eliminar.txt -O /tmp/ppa_eliminar.txt &> /dev/null
  if [ $? = "0" ]; then
    while read PPA
    do
       verifica_ppa del $PPA
    done < ppa_eliminar.txt
  rm /tmp/ppa_eliminar.txt &> /dev/null
  fi
  wget -q http://$SERVIDOR_APT/$INSTALACION/ppa_instalar.txt -O /tmp/ppa_instalar.txt &> /dev/null
  if [ $? = "0" ]; then
    while read PPA
    do
      verifica_ppa add $PPA
    done < ppa_instalar.txt
    rm /tmp/ppa_instalar.txt &> /dev/null
  fi
fi

apt-get -y update

if [ $HAY_SERVIDOR = "1" ]; then
  wget -q http://$SERVIDOR_APT/$INSTALACION/apt_eliminar.txt -O /tmp/apt_eliminar.txt &> /dev/null
  if [ $? = "0" ]; then
    apt-get -y --purge remove `cat /tmp/apt_eliminar.txt`
    rm /tmp/apt_eliminar.txt &> /dev/null
  fi
  wget -q http://$SERVIDOR_APT/$INSTALACION/apt_instalar.txt -O /tmp/apt_instalar.txt &> /dev/null
  if [ $? = "0" ]; then
    apt-get -y install `cat /tmp/apt_instalar.txt`
    rm /tmp/apt_instalar.txt &> /dev/null
  fi
fi

apt-get -y dist-upgrade

NOTAS

  • Es posible que haya paquetes almacenados en el servidor de alguna actualización anterior (por ejemplo en “/var/cache/apt/archives” ) y queramos poner disponible para los clientes. Se puede hacer con este comando:

 /usr/share/apt-cacher/apt-cacher-import.pl -r /var/cache/apt/archives
  • Con respecto a los informes de uso, se pueden ver desde “http://direccion_ip_servidor:3142/report” pero como seguro todavía no se generó ninguno puedes forzar que lo cree ejecutando este comando en el servidor:

/usr/share/apt-cacher/apt-cacher-report.pl

Actualizar a la última versión:

En primer lugar debemos parar el servicio si es que tenemos ya una versión anterior instala y funcionando:

service apt-cacher stop

Luego podemos descargar la última versión desde: www.hindley.org.uk/~mark/debian/

Antes de aplicar asegurarse de tener instalados los paquetes de los que depende apt-cacher para procesar listas comprimidas:

  • libcompress-raw-lzma-perl
  • libcompress-raw-bzip2-perl
  • libcompress-raw-zlib-perl
  • libio-compress-perl
  • libio-compress-lzma-perl
apt-get install  libcompress-raw-lzma-perl libcompress-raw-bzip2-perl libcompress-raw-zlib-perl libio-compress-perl libio-compress-lzma-perl

dpkg -i apt-cacher_1.7.13_all.deb

A la pregunta sobre si queremos instalar una nueva versión del fichero de configuración o mantener el anterior respondemos instalar el del paquete.

Editamos el fichero de configuración y descomentamos/modificamos las líneas en función de muestras preferencias:

cache_dir = /data/apt-cacher
daemon_addr = 192.168.0.3
distinct_namespaces = 1
allowed_hosts = *
supported_archs = i386, amd64
generate_reports = 1
clean_cache = 1

Reiniciamos el servicio apache y apt-cacher. En los clientes no habría que cambiar nada.

service apt-cacher startservice apache2 restart

NOTAS:

Si al actualizar desde un cliente da problemas con algún repositorio podemos indicarle en su fichero «01proxy» que evite al apt-cacher y se conecte directamente añadiendo una línea como:

Acquire::http::proxy::dirección_del_repositorio_problemático "DIRECT";