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.
Cuando 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
-
Localiza un equipo que pueda actuar como servidor, con IP fija, y espacio suficiente en la partición de usuarios del disco duro (+10Gb).
-
Instalar con “apt-get install apt-cacher apache2”
-
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”
-
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
-
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.
-
Opcionalmente descomenta y edita la línea “admin_email = root@localhost” y cambia la dirección de correo por otra con más sentido.
-
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 ”.
-
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”.
-
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.
-
Descomenta la línea “generate_reports = 1” para que el servidor regenere el informe de uso cada 24 horas.
-
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
-
Abre la página “direccion_ip_servidor:3142” en un navegador y comprueba que devuelve la página con la configuración activa.
-
Actualiza la lista de paquetes disponibles con “apt-get update”.
-
Actualiza el servidor con “apt-get dist-upgrade”. Reinicia si es necesario.
-
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”
- Crea un archivo llamado “check-apt-cacher.sh“ en la carpeta de “/root”.
- 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
- Dale permisos de ejecución con “chmod +x /root/ check-apt-cacher.sh”
- 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";