Crear un mirror local con apt-mirror

LINUXSISTEMAS OPERATIVOS
apt-mirror

Configuración del mirror-server

Cuando tenemos un gran número de equipos, como es el caso del centro en el que trabajo con más de 300 equipos, a la hora de hacer una actualización masiva de paquetes podemos saturar excesivamente el ancho de banda de la salida a Internet. 

Para evitar esto podemos recurrir a un mirror en una máquina local y que todo se actualice por la LAN local. También nos puede servir para esperar un tiempo prudencial a que la actualización sea completamente estable, ya que puede darse el caso que se libere una actualización con problemas, aunque si estamos descargando de la rama “stable” no debería ocurrir.

Para ello vamos a utilizar apt-mirror para crear un repositorio de Ubuntu Bionic (versión que tengo desplegada en los equipos actualmente). En mi caso la tengo incluida en un servidor virtualizado con Ubuntu Server dentro una máquina con un servidor Proxmox.

apt-mirror maneja los siguientes ficheros de configuración y directorios:

  • /etc/apt/mirror.list: Es el principal fichero de configuración.
  • /etc/cron.d/apt-mirror: Es una plantilla de configuración de cron para lanzar apt-mirror de forma programada
  • /var/spool/apt-mirror/mirror: Es el directorio donde se guardará el mirror.
  • /var/spool/apt-mirror/skel: Es un directorio para almacenar temporalmente los índices descargados.
  • /var/spool/apt-mirror/var: Es un directorio donde se guardan los logs, urls y hashes md5.

Primero instalamos apache2 (si no lo tenemos instalado ya) para servir los paquetes del mirror:

$ sudo apt install apache2

Después instalamos el paquete apt-mirror:

$ sudo  apt install apt-mirror

Una vez instalados los paquetes, hacemos una copia del fichero de configuración principal, para recurrir a él, si fuera necesario:

$ sudo cp /etc/apt/mirror.list /etc/apt/mirror.list.orig

Y editamos el fichero añadiendo el siguiente contenido que os servirá perfectamente porque crea los mirrors de los principales repositorios de Ubuntu Bionic:

$ sudo nano /etc/apt/mirror.list
############# config ##################
#
# set base_path    /var/spool/apt-mirror
#
# set mirror_path  $base_path/mirror
# set skel_path    $base_path/skel
# set var_path     $base_path/var
# set cleanscript $var_path/clean.sh
# set defaultarch  
# set postmirror_script $var_path/postmirror.sh
# set run_postmirror 0
set nthreads     20
set _tilde 0
# set limit_rate 2000k
#
############# end config ##############


## Official Ubuntu repositories
# deb-i386 http://es.archive.ubuntu.com/ubuntu/ bionic main restricted universe multiverse
deb-amd64 http://es.archive.ubuntu.com/ubuntu/ bionic main restricted universe multiverse

# deb-i386 http://security.ubuntu.com/ubuntu bionic-security main restricted universe multiverse
deb-amd64 http://security.ubuntu.com/ubuntu bionic-security main restricted universe multiverse

# deb-i386 http://es.archive.ubuntu.com/ubuntu/ bionic-updates main restricted universe multiverse
deb-amd64 http://es.archive.ubuntu.com/ubuntu/ bionic-updates main restricted universe multiverse

# deb-i386 http://es.archive.ubuntu.com/ubuntu/ bionic-proposed main restricted universe multiverse
deb-amd64 http://es.archive.ubuntu.com/ubuntu/ bionic-proposed main restricted universe multiverse

# deb-i386 http://es.archive.ubuntu.com/ubuntu/ bionic-backports main restricted universe multiverse
deb-amd64 http://es.archive.ubuntu.com/ubuntu/ bionic-backports main restricted universe multiverse

## Security Ubuntu repositories
# deb-i386 http://security.ubuntu.com/ubuntu bionic-security main restricted universe multiverse
deb-amd64 http://security.ubuntu.com/ubuntu bionic-security main restricted universe multiverse

## Canonical's 'partner' repository.
# deb-i386 http://archive.canonical.com/ubuntu/ bionic partner
deb-amd64 http://archive.canonical.com/ubuntu/ bionic partner

# oem.archive.canonical.com
# deb-i386 http://oem.archive.canonical.com/updates/ bionic-oem public
deb-amd64 http://oem.archive.canonical.com/updates/ bionic-oem public

# hp.archive.canonical.com
# deb-i386 http://hp.archive.canonical.com/updates bionic-oem public
deb-amd64 http://hp.archive.canonical.com/updates bionic-oem public

# mirrors desarrollo.educarex.es ubuntu
# deb-i386 http://desarrollo.educarex.es/solointranet/ubuntu/bionic bionic linex
deb-amd64 http://desarrollo.educarex.es/solointranet/ubuntu/bionic bionic linex

# mirror Google Chrome
deb-amd64 http://dl.google.com/linux/chrome/deb/ stable main

# mirror Google Earth
deb-amd64 http://dl.google.com/linux/earth/deb/ stable main

clean http://es.archive.ubuntu.com/ubuntu/
clean http://security.ubuntu.com/ubuntu/
clean http://archive.canonical.com/ubuntu/
clean http://oem.archive.canonical.com/updates/
clean http://hp.archive.canonical.com/updates/
clean http://desarrollo.educarex.es/solointranet/ubuntu/
clean http://dl.google.com/linux/chrome/

En la sección de configuración, dejaremos comentado los parámetros de ubicación si deseamos que se almacenen en la ubicación por defecto.

La opción set defaultarch nos permite indicar la arquitectura de paquetes por defecto. Por ejemplo:

set defaultarch amd64

Por defecto set nthreads 20 para indicar que se usen 20 hilos.

set nthreads 20

La línea set limit_rate 2000k establece un límite de consumo de ancho de banda de descarga de 2000k por hilo porque normalmente, el mirror se realiza cada noche, cuando no hay usuarios en el sistema. Si, en algún momento, hubiera que iniciar apt-mirror en horas de trabajo, podemos ajustarlos valores nthreads y limit_rate para que no realicen un consumo excesivo de ancho de banda.

En mi caso solo voy a crear el repositorio de la versión de 64 bits: deb-amd64, ya que no dispongo de máquinas con versiones de 32 bits. Si se desea hacer el mirror también de estas máquinas bastaría con descomentar estas líneas.

Las siguientes líneas se utilizan para indicarle a apt-mirror qué directorios debe comprobar para ver si se puede liberar espacio:

clean http://es.archive.ubuntu.com/ubuntu/
clean http://security.ubuntu.com/ubuntu/
clean http://archive.canonical.com/ubuntu/
clean http://oem.archive.canonical.com/updates/
clean http://hp.archive.canonical.com/updates/
clean http://desarrollo.educarex.es/solointranet/ubuntu/
clean http://dl.google.com/linux/chrome/

Crearemos simplemente los directorios de los mirror en /var/spool/mirror, el resto de carpetas «skel» y «var» estarán vacías y se irán rellenando solas: 

Una vez que ya tenemos los repositorios en /var/spool/apt-mirror/mirror, vamos a crear enlaces simbólicos en /var/www para que los paquetes del repositorio sean servidos por apache:

$ sudo cd /var/www
$ sudo ln -s /var/spool/apt-mirror/mirror/archive.canonical.com
$ sudo ln -s /var/spool/apt-mirror/mirror/desarrollo.educarex.es
$ sudo ln -s /var/spool/apt-mirror/mirror/dl.google.com
$ sudo ln -s /var/spool/apt-mirror/mirror/es.archive.ubuntu.com
$ sudo ln -s /var/spool/apt-mirror/mirror/hp.archive.canonical.com
$ sudo ln -s /var/spool/apt-mirror/mirror/oem.archive.canonical.com
$ sudo ln -s /var/spool/apt-mirror/mirror/security.ubuntu.com

Una vez que tengamos los enlaces creados, el siguiente paso será editar el fichero /etc/cron.d/apt-mirror y modificar la hora de puesta en marcha de la creación del mirror:

# /etc/cron.d/apt-mirror
# Regular cron jobs for the apt-mirror package
#
00 22    * * *    apt-mirror    /usr/bin/apt-mirror > /var/spool/apt-mirror/var/cron.log
Crearemos también un fichero cron /etc/cron.d/apt-mirror-die para matar la tarea anterior a cierta hora:
# Kill the apt-mirror
#
45 6    * * *    apt-mirror    killall -9 apt-mirror
50 6    * * *    root          /var/spool/apt-mirror/var/clean.sh

Cuando lleguen las 22:00 comenzará la creación del mirror y, si no terminara, se mataría el proceso a las 6:45 de la mañana del día siguiente. Y, a las 6:50 se haría limpieza en el repositorio.

Uso de los repositorios en los clientes

Para cada cliente debemos modificar su archivo /etc/apt/sources.list. Por ejemplo si utilizamos el mirror de Ubuntu:

deb http://es.archive.ubuntu.com/ubuntu/ bionic-updates main restricted universe multiverse

Lo cambiaremos por el servidor donde está nuestro mirror:

deb http://servidor-mirror/es.archive.ubuntu.com/ubuntu/ bionic-updates main restricted universe multiverse

El fichero /etc/apt/sources.list de un cliente quedaría de esta forma:

deb http://servidor-mirror/es.archive.ubuntu.com/ubuntu/ bionic main restricted universe multiverse
deb http://servidor-mirror/es.archive.ubuntu.com/ubuntu/ bionic-security main restricted universe multiverse
deb http://servidor-mirror/es.archive.ubuntu.com/ubuntu/ bionic-updates main restricted universe multiverse
deb http://servidor-mirror/es.archive.ubuntu.com/ubuntu/ bionic-proposed main restricted universe multiverse
deb http://servidor-mirror/es.archive.ubuntu.com/ubuntu/ bionic-backports main restricted universe multiverse
deb http://servidor-mirror/security.ubuntu.com/ubuntu bionic-security main restricted universe multiverse

Para que resuelva nuestro nombre DNS “servidor-mirror” podemos modificar nuestro fichero /etc/hosts y añadir una línea con la IP y la resolución del nombre que definamos. Por ejemplo:

$ cat /etc/hosts
127.0.0.1 localhost
172.21.100.3 servidor-mirror

Es interesante crear una entrada DNS en el servidor LDAP, que podemos llamar “servidor-mirror”, que apunte al servidor  en que tenemos almacenado el mirror. De este modo, si en algún momento necesitamos cambiar el mirror que vamos a usar, no tendremos más que cambiar esa entrada en el servidor LDAP para que apunte a otro mirror.