Crear un mirror local con apt-mirror para los Ubuntu Bionic | Algo de Linux

miércoles, 6 de junio de 2018

Crear un mirror local con apt-mirror para los Ubuntu Bionic

En mayo de 2016, vimos cómo crear un mirror de Ubuntu Trusty. En este post, vamos a ver cómo crear el mirror para actualizar los equipos con Ubuntu Bionic que tendremos tras el proceso de clonación.

Como ya he comentado en varias ocasiones, disponer de un mirror facilita enormemente el trabajo de actualizar paquetes en los clientes y reduce el consumo de ancho de banda. Así que siempre que imparto una nueva edición del curso de Puppet, insisto en que, con el volumen de máquinas que tenemos, todos los administradores deberían tener uno en su centro.

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:
# apt-get install apache2
A continuación instalamos el paquete apt-mirror:
# apt-get install apt-mirror
Una vez instalados los paquetes, hacemos una copia del fichero de configuración principal, para recurrir a él, si fuera necesario:
# 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:
# 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/

Como podéis ver, en la sección de configuración, todos los parámetros de ubicación de ficheros están comentados. No los he "descomentado" porque quiero que se almacenen en la ubicación por defecto.

Tampoco he tocado la opción set defaultarch que nos permite indicar la arquitectura de paquetes por defecto. Por ejemplo:

# set defaultarch amd64

He dejado por defecto set nthreads 20 para indicar que se usen 20 hilos.

set nthreads 20

He dejado comentada la línea set limit_rate 2000k que 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, tengo la necesidad de iniciar apt-mirror en horas de trabajo, ajusto los valores nthreads y limit_rate para que no realicen un consumo excesivo de ancho de banda.

apt-mirror usa wget para descargar los paquetes y mediante este parámetro limitamos la tasa de descarga.

set limit_rate 2000k

Como se puede apreciar en el fichero de configuración, estoy creando específicamente el repositorio con paquetes de 64 bits: deb-amd64. Ya no "mirrorizo" paquetes de 32 bits porque no tengo máquinas con sistema operativo de 32 bits. Si las tuvierais, tan sólo tendríais que "descomentar" las líneas que comienzan por: deb-i386

Por último, al final del fichero de configuración encontraréis las siguientes líneas:

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/

Estas líneas le dicen a apt-mirror en qué directorios del disco duro local debería chequear para ver si se puede liberar espacio.

Bien, pues una vez que ya tenemos los repositorios en /var/spool/apt-mirror/mirror, vamos a crear enlaces en /var/www para que los paquetes del reposxitorio sean servidos por apache:
# cd /var/www
# ln -s /var/spool/apt-mirror/mirror/archive.canonical.com
# ln -s /var/spool/apt-mirror/mirror/desarrollo.educarex.es
# ln -s /var/spool/apt-mirror/mirror/dl.google.com
# ln -s /var/spool/apt-mirror/mirror/es.archive.ubuntu.com
# ln -s /var/spool/apt-mirror/mirror/hp.archive.canonical.com
# ln -s /var/spool/apt-mirror/mirror/oem.archive.canonical.com
# 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
Por otra parte, crearemos un fichero cron /etc/cron.d/apt-mirror-die para matar la tarea anterior a cierta hora:
# Kill the apt-mirror
#
45 7    * * *    apt-mirror    killall -9 apt-mirror
46 7    * * *    root          /var/spool/apt-mirror/var/clean.sh
Y eso es todo. Cuando lleguen las 22:00 comenzará la creación del mirror y, si no terminara, se mataría el proceso a las 7:45 de la mañana del día siguiente. Y, a las 7:46 se haría limpieza en el repositorio.

Por último, tan sólo me queda mencionar cómo usar los repositorios en el fichero /etc/apt/sources.list de los clientes.

Al haber creado el mirror y los enlaces como he explicado, es muy sencillo modificar cada una de las entradas del sources.list. Veamos un ejemplo:

Si utilizamos el mirror de Ubuntu:
deb http://es.archive.ubuntu.com/ubuntu/ bionic-updates main restricted universe multiverse
No tenemos más que cambiarlo por:
deb http://servidor/es.archive.ubuntu.com/ubuntu/ bionic-updates main restricted universe multiverse
Y así con todos los repositorios.

De este modo es como podría quedar el /etc/apt/sources.list de un cliente:
deb http://servidor/es.archive.ubuntu.com/ubuntu/ bionic main restricted universe multiverse
deb http://servidor/es.archive.ubuntu.com/ubuntu/ bionic-security main restricted universe multiverse
deb http://servidor/es.archive.ubuntu.com/ubuntu/ bionic-updates main restricted universe multiverse
deb http://servidor/es.archive.ubuntu.com/ubuntu/ bionic-proposed main restricted universe multiverse
deb http://servidor/es.archive.ubuntu.com/ubuntu/ bionic-backports main restricted universe multiverse
deb http://servidor/security.ubuntu.com/ubuntu bionic-security main restricted universe multiverse
Como ya comenté cuando creé el mirror para trusty, en mi opinión, es interesante crear una entrada DNS en el servidor ldap a la que llamemos 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.
Publicado por primera vez en http://enavas.blogspot.com.es

No hay comentarios: