Categories
Automatizacion Linux Raspberry

Cómo crear un espejo local de los repositorios de Ubuntu

Si has tenido que instalar o actualizar paquetes en más de un par de servidores, podrás haberte dado cuenta que la descarga de paquetes está limitada en mayor medida al ancho de banda contratado con nuestro proveedor de internet y en menor a la tarjeta de red del propio equipo. En este tipo de situaciones resulta conveniente tener un repositorio local para acelerar este proceso. A continuación mostraré cómo configurar un espejo local corriendo en Ubuntu 18.04 y utilizando una carpeta NFS donde estarán alojados todos los paquetes.

Requisitos

  • Permisos de administrador/root en el servidor que servirá de repositorio
  • Carpeta compartida NFS o espacio local de por lo menos 200 GB
  • Conexión a internet para descargar los paquetes del espejo de Ubuntu

Instrucciones

Instalación de Apache2

Instalaremos Apache como servidor web, para que los demás servidores puedan obtener los archivos del espejo.

# apt-get update && apt-get install apache2

Ahora habilitaremos el servicio de apache

# systemctl enable apache2

Ahora Apache debe de estar funcionando, validaremos esto con el comando curl

$ curl localhost

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml">  <!--    Modified from the Debian original for Ubuntu    Last updated: 2016-11-16    See: https://launchpad.net/bugs/1288690  -->  <head>

Si obtenemos texto similar al anterior quiere decir que Apache está funcionando de forma correcta.

Montar NFS en el sistema de archivos

Ahora montaremos la carpeta compartida NFS en nuestro servidor con el comando mount

# mount -t nfs 192.168.0.120:/volume1/mirror /var/www/html/ubuntu/

Para que la carpeta se monte de forma automática si el servidor es reiniciado haremos el montaje persistente editando el archivo /etc/fstab

# nano /etc/fstab

192.168.0.120:/volume1/mirror   /var/www/html/ubuntu nfs auto,nofail,noatime,nolock,intr,tcp,actimeo=1800 0 0

Una vez que el punto de montaje está listo, crearemos las carpetas donde configuraremos apache

# mkdir -p /var/www/html/ubuntu
# chown www-data:www-data /var/www/html/ubuntu

Instalación de apt-mirror

apt-mirror nos permitirá descargar los paquetes del espejo de Ubuntu

# apt-get install apt-mirror

Después configuraremos la lista de repositorios que estaremos alojando localmente, para obtener mejores resultados seleccionaremos la lista de repositorios que se encuentran en el archivo /etc/apt/sources.list

# cat /etc/apt/sources.list

## Note, this file is written by cloud-init on first boot of an instance
## modifications made here will not survive a re-bundle.
## if you wish to make changes you can:
## a.) add 'apt_preserve_sources_list: true' to /etc/cloud/cloud.cfg
##     or do the same in user-data
## b.) add sources in /etc/apt/sources.list.d
## c.) make changes to template file /etc/cloud/templates/sources.list.tmpl

# See http://help.ubuntu.com/community/UpgradeNotes for how to upgrade to
# newer versions of the distribution.
deb http://ports.ubuntu.com/ubuntu-ports bionic main restricted
# deb-src http://ports.ubuntu.com/ubuntu-ports bionic main restricted

## Major bug fix updates produced after the final release of the
## distribution.
deb http://ports.ubuntu.com/ubuntu-ports bionic-updates main restricted
# deb-src http://ports.ubuntu.com/ubuntu-ports bionic-updates main restricted
....

En esta ocasión solo seleccionaremos las entradas deb sin comentarios #, ya que las entradas deb-src incrementan los requisitos de almacenamiento en hasta 800 GB.

Ahora que contamos con la lista de repositorios a alojar, editaremos el archivo /etc/apt/mirror.list

Antes de editarlo realizaremos una copio de respaldo con el siguiente comando

# cp /etc/apt/mirror.list /etc/apt/mirror.list.bk

Ahora editaremos el archivo de configuración /etc/apt/mirror.list

# nano /etc/apt/mirror.list

############# config ##################
#
set base_path    /var/www/html/ubuntu
#
# 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  <running host architecture>
# set postmirror_script $var_path/postmirror.sh
# set run_postmirror 0
set nthreads     20
set _tilde 0
#
############# end config ##############
deb [arch=arm64] http://ports.ubuntu.com/ubuntu-ports bionic main restricted

deb [arch=arm64] http://ports.ubuntu.com/ubuntu-ports bionic-updates main restricted

deb [arch=arm64] http://ports.ubuntu.com/ubuntu-ports bionic universe
deb [arch=arm64] http://ports.ubuntu.com/ubuntu-ports bionic-updates universe


deb [arch=arm64] http://ports.ubuntu.com/ubuntu-ports bionic multiverse
deb [arch=arm64] http://ports.ubuntu.com/ubuntu-ports bionic-updates multiverse

deb [arch=arm64] http://ports.ubuntu.com/ubuntu-ports bionic-backports main restricted universe multiverse


deb [arch=arm64] http://ports.ubuntu.com/ubuntu-ports bionic-security main restricted
deb [arch=arm64] http://ports.ubuntu.com/ubuntu-ports bionic-security universe
deb [arch=arm64] http://ports.ubuntu.com/ubuntu-ports bionic-security multiverse

En este caso modificamos los campos

  • set base_path – Lugar donde se alojarán los paquetes del espejo
  • arch=arm64 – Para indicar que solo queremos descargar los paquetes de arquitectura arm64. Si piensas alojar los paquetes para todas las arquitecturas puedes eliminar esta opción del código para que quede de la siguiente forma
deb http://ports.ubuntu.com/ubuntu-ports bionic-security multiverse

Una vez modificado el archivo de configuración, copiaremos el script postmirror.sh, que se ejecutará una vez que se hayan descargado todos los paquetes

# mkdir -p /var/www/html/ubuntu/var
# cp cp /var/spool/apt-mirror/var/postmirror.sh /var/www/html/ubuntu/var/

Ahora es tiempo de descargar los paquetes, ten en cuenta que esto puede tardar un par de horas dependiendo de nuestra conexión a internet, por lo que recomendamos hacerlo durante la noche. De no ser posible descargar los paquetes en un solo intento, podemos reiniciar la descarga en cualquier momento.

# apt-mirror
Downloading 346 index files using 20 threads...
Begin time: Sun May 16 16:44:01 2021
[20]... [19]... [18]... [17]... [16]... [15]... [14]... [13]... [12]... [11]... [10]... [9]... [8]... [7]... [6]... [5]... [4]... [3]... [2]... [1]... [0]... 
End time: Sun May 16 16:44:05 2021

Processing translation indexes: [TTTTTTTTTTTTTTTTTTTTTTT]

Downloading 1137 translation files using 20 threads...
Begin time: Sun May 16 16:44:05 2021
[20]... [
....

End time: Sun May 16 16:44:09 2021

Processing DEP-11 indexes: [DDDDDDDDDDDDDDDDDDDDDDD]

Downloading 146 dep11 files using 20 threads...
Begin time: Sun May 16 16:44:10 2021
[20]... [19]... [18]... [17]... [16]... [15]... [14]... [13]... [12]... [11]... [10]... [9]... [8]... [7]... [6]... [5]... [4]... [3]... [2]... [1]... [0]... 
End time: Sun May 16 16:44:11 2021

Processing indexes: [PPP

Finalizado el script, habremos descargado todos los paquetes del espejo, crearemos un cronjob para ejecutar apt-mirror todos los días a las 2 am, y así obtener los nuevos paquetes del espejo.

# crontab -e
00 	02 	*	 *	 *	/usr/bin/apt-mirror

Configurar los servidores para utilizar el repositorio local

En cada servidor donde deseamos utilizar el espejo local modificaremos el archivo /etc/apt/sources.list para reemplazar ports.ubuntu.com por la dirección IP/dominio de nuestro servidor funcionando como espejo.

## Note, this file is written by cloud-init on first boot of an instance
## modifications made here will not survive a re-bundle.
## if you wish to make changes you can:
## a.) add 'apt_preserve_sources_list: true' to /etc/cloud/cloud.cfg
##     or do the same in user-data
## b.) add sources in /etc/apt/sources.list.d
## c.) make changes to template file /etc/cloud/templates/sources.list.tmpl

# See http://help.ubuntu.com/community/UpgradeNotes for how to upgrade to
# newer versions of the distribution.
deb https://archive.nestortechtips.online/ubuntu/mirror/ports.ubuntu.com/ubuntu-ports bionic main restricted
# deb-src http://ports.ubuntu.com/ubuntu-ports bionic main restricted

## Major bug fix updates produced after the final release of the
## distribution.
deb https://archive.nestortechtips.online/ubuntu/mirror/ports.ubuntu.com/ubuntu-ports bionic-updates main restricted
# deb-src http://ports.ubuntu.com/ubuntu-ports bionic-updates main restricted

## N.B. software from this repository is ENTIRELY UNSUPPORTED by the Ubuntu
## team. Also, please note that software in universe WILL NOT receive any
## review or updates from the Ubuntu security team.
deb https://archive.nestortechtips.online/ubuntu/mirror/ports.ubuntu.com/ubuntu-ports bionic universe
# deb-src http://ports.ubuntu.com/ubuntu-ports bionic universe
deb https://archive.nestortechtips.online/ubuntu/mirror/ports.ubuntu.com/ubuntu-ports bionic-updates universe
# deb-src http://ports.ubuntu.com/ubuntu-ports bionic-updates universe

## N.B. software from this repository is ENTIRELY UNSUPPORTED by the Ubuntu
## team, and may not be under a free licence. Please satisfy yourself as to
## your rights to use the software. Also, please note that software in
## multiverse WILL NOT receive any review or updates from the Ubuntu
## security team.
deb https://archive.nestortechtips.online/ubuntu/mirror/ports.ubuntu.com/ubuntu-ports bionic multiverse
# deb-src http://ports.ubuntu.com/ubuntu-ports bionic multiverse
deb https://archive.nestortechtips.online/ubuntu/mirror/ports.ubuntu.com/ubuntu-ports bionic-updates multiverse
# deb-src http://ports.ubuntu.com/ubuntu-ports bionic-updates multiverse

## N.B. software from this repository may not have been tested as
## extensively as that contained in the main release, although it includes
## newer versions of some applications which may provide useful features.
## Also, please note that software in backports WILL NOT receive any review
## or updates from the Ubuntu security team.
deb https://archive.nestortechtips.online/ubuntu/mirror/ports.ubuntu.com/ubuntu-ports bionic-backports main restricted universe multiverse
# deb-src http://ports.ubuntu.com/ubuntu-ports bionic-backports main restricted universe multiverse

## Uncomment the following two lines to add software from Canonical's
## 'partner' repository.
## This software is not part of Ubuntu, but is offered by Canonical and the
## respective vendors as a service to Ubuntu users.
# deb http://archive.canonical.com/ubuntu bionic partner
# deb-src http://archive.canonical.com/ubuntu bionic partner

deb https://archive.nestortechtips.online/ubuntu/mirror/ports.ubuntu.com/ubuntu-ports/ bionic-security main restricted
# deb-src http://ports.ubuntu.com/ubuntu-ports bionic-security main restricted
deb https://archive.nestortechtips.online/ubuntu/mirror/ports.ubuntu.com/ubuntu-ports/ bionic-security universe
# deb-src http://ports.ubuntu.com/ubuntu-ports bionic-security universe
deb https://archive.nestortechtips.online/ubuntu/mirror/ports.ubuntu.com/ubuntu-ports/ bionic-security multiverse
# deb-src http://ports.ubuntu.com/ubuntu-ports bionic-security multiverse

El espejo que acabamos de configurar agrega ubuntu-mirror/ports.ubuntu.com/ a la ruta de paquetes, por lo que hay que tomar en cuenta esta ruta al archivo de configuración.
En el ejemplo anterior utilizamos un nombre de dominio, puedes reemplazar archive.nestortechtips.online por la dirección IP del servidor.

En el servidor cliente, validaremos los cambios ejecutando el siguiente comando

# apt-get update
Hit:1 http://archive.nestortechtips.online/ubuntu/mirror/ports.ubuntu.com/ubuntu-ports bionic InRelease
Get:2 http://archive.nestortechtips.online/ubuntu/mirror/ports.ubuntu.com/ubuntu-ports bionic-updates InRelease [88.7 kB]
Get:3 http://archive.nestortechtips.online/ubuntu/mirror/ports.ubuntu.com/ubuntu-ports bionic-backports InRelease [74.6 kB]
Get:4 http://archive.nestortechtips.online/ubuntu/mirror/ports.ubuntu.com/ubuntu-ports bionic-security InRelease [88.7 kB]
Ign:5 http://archive.nestortechtips.online/ubuntu/mirror/ports.ubuntu.com/ubuntu-ports bionic-updates/main arm64 Packages
Ign:6 http://archive.nestortechtips.online/ubuntu/mirror/ports.ubuntu.com/ubuntu-ports bionic-updates/universe arm64 Packages
Get:7 http://archive.nestortechtips.online/ubuntu/mirror/ports.ubuntu.com/ubuntu-ports bionic-updates/main arm64 Packages [1264 kB]
Get:8 http://archive.nestortechtips.online/ubuntu/mirror/ports.ubuntu.com/ubuntu-ports bionic-updates/universe arm64 Packages [1527 kB]
Fetched 3053 kB in 2s (1394 kB/s)                                              
Reading package lists... Done

El resultado del comando anterior confirma que los paquetes están siendo actualizados desde el espejo local.

Conclusión

Descargar actualizaciones puede tomar largo tiempo desde un espejo de internet, con un espejo local podemos aprovechar que la mayoría del equipo de red moderno pone a nuestra disposición velocidades Gigabit (1000 Mbits/s), que pueden no estar disponibles por nuestro proveedor de internet, o si lo están puede que no mantengan está velocidad de forma constante/estable. Con el repositorio local podemos mitigar este cuello de botella o al menos reducir su impacto.