Tabla de Contenidos

Repositorio Ubuntu

Este documento esquematiza cómo crear un repositorio para tener un mirror local de Ubuntu e incluye otros repositorios no estandar.

Preparando disco

Espacio: Dic/2008, solamente sincronizando i386 y ocupa unos 26G

Este paso no es necesario, pues debianmirror se encarga de crear la estructura de directorios, no obstante se deja aquí para saber qué quedará en el disco:

mkdir -p /mirror/ubuntu
mkdir -p /mirror/medibuntu
mkdir -p /mirror/canonical
mkdir -p /mirror/google
mkdir -p /mirror/virtualbox

Preparando llavero

No se utiliza el llavero (keyring) estandard ya que debmirror viene preparado para utilizar el keyring de Debian.

Bajar incorporar al llavero no estandar para cada repositorio que se quiera sincronizar:

Ubuntu estandar

gpg --no-default-keyring --keyring /root/keyring/trustedkeys.gpg --import /usr/share/keyrings/ubuntu-archive-keyring.gpg 

Medibuntu

wget -q http://packages.medibuntu.org/medibuntu-key.gpg -O - | gpg --no-default-keyring --keyring /root/keyring/trustedkeys.gpg --import

Canonical

gpg --keyserver subkeys.pgp.net --recv 437D05B5 --import --no-default-keyring --keyring /root/keyring/trustedkeys.gpg

Google

wget -q https://dl-ssl.google.com/linux/linux_signing_key.pub -O - | gpg --no-default-keyring --keyring /root/keyring/trustedkeys.gpg --import

VirtualBox

wget -q http://download.virtualbox.org/virtualbox/debian/sun_vbox.asc -O- | gpg --no-default-keyring --keyring /root/keyring/trustedkeys.gpg --import

Verificación del llavero

Se puede verificar la insorporación de las llaves al llavero:

gpg  --list-keys --no-default-keyring --keyring /root/keyring/trustedkeys.gpg

y tendrá la siguiente salida:

/root/keyring/trustedkeys.gpg
-----------------------------
pub   1024D/437D05B5 2004-09-12
uid                  Ubuntu Archive Automatic Signing Key <ftpmaster@ubuntu.com>
sub   2048g/79164387 2004-09-12

pub   1024D/FBB75451 2004-12-30
uid                  Ubuntu CD Image Automatic Signing Key <cdimage@ubuntu.com>

pub   1024D/0C5A2783 2006-11-23
uid                  Medibuntu Packaging Team <admin@lists.medibuntu.org>
uid                  The Medibuntu Team <medibuntu@sos-sts.com>
sub   2048g/16C7105A 2006-11-23

pub   1024D/7FAC5991 2007-03-08
uid                  Google, Inc. Linux Package Signing Key <linux-packages-keymaster@google.com>
sub   2048g/C07CB649 2007-03-08

pub   1024D/6DFBCBAE 2008-07-14
uid                  Sun Microsystems, Inc. (xVM VirtualBox archive signing key) <info@virtualbox.org>
sub   2048g/78A86EAF 2008-07-14

Script

El keyring utilizado debe estar referenciado en el script mediante la variable GNUPGHOME:

export GNUPGHOME=/root/keyring

Sincronizando

Crear y mantener actualizado el respositorio:

Crear repositorio

Colocar variables con estos valores:

SILENT=0
REINTENTOS=1

para tener un control directo de lo que pasa al ejecutar el script y en caso de error sale al primer intento.

Correr el script (./ubumirror.sh o el nombre que se le haya colocado). El script yo lo suelo colocar en /mirror, pero puede estar en cualquier lugar.

Demora muuucho en sincronizar todo el repositorio

(son más de 20G de archivos a descargar)

Una vez finalizado, vuelva a lanzar el script hasta estar seguro que está correctamente sincronizado (es decir, que ya no transfiera ningún archivo de paquetes .deb)

Mantener repositorio

Para mantener actualizado el respositorio existen varias formas de hacerlo, aquí describo la que yo utilizo.

El chequeo de md5sum demora

(se realiza con el parámetro –md5sums)

Es un proceso más lento de revisión del contenido del repositorio antes de sincronizar, pero bastante más seguro de la integridad de los paquetes locales.

Colocar variables con estos valores de producción:

SILENT=1
REINTENTOS=5

Colocar el script para que se ejecute una vez al día en por el cron:

ln -s /mirror/ubumirror.sh /etc/cron.daily/ubumirror

Verificar sincronización

Verificar periódicamente el archivo /var/log/syslog para ver que el repositorio se está sincronizando correctamente:

 Dec 21 15:34:13 host logger: Inicio actualizacion mirror us.archive.ubuntu.com
 Dec 21 15:49:46 host logger: Final actualizacion mirror us.archive.ubuntu.com
 Dec 21 15:49:46 host logger: Inicio actualizacion mirror archive.canonical.com
 Dec 21 15:49:52 host logger: Final actualizacion mirror archive.canonical.com
 Dec 21 15:49:52 host logger: Inicio actualizacion mirror packages.medibuntu.org
 Dec 21 15:50:26 host logger: Final actualizacion mirror packages.medibuntu.org
 Dec 21 15:50:26 host logger: Inicio actualizacion mirror dl.google.com
 Dec 21 15:50:29 host logger: Final actualizacion mirror dl.google.com

Sirviendo a la red local

Instalar servidor web (apache, lighttpd o cherokee) y configurar un alias para cada uno de los directorios creados en el primer paso.

Existen muchas opciones para servir el repositorio creado a la red, aquí se sugiere una forma.

Apache

Archivo /etc/apache2/sites-enabled/000-default:

Alias /ubuntu/ "/mirror/ubuntu/"
Alias /canonical/ "/mirror/canonical/" 
Alias /medibuntu/ "/mirror/medibuntu/"
Alias /google/ "/mirror/google/"
Alias /virtualbox/ "/mirror/virtualbox/"

lighttpd

Archivo /etc/lighttpd/lighttpd.conf:

alias.url = ( "/ubuntu/" => "/mirror/ubuntu/" ) 
alias.url += ( "/canonical/" => "/mirror/canonical/" ) 
alias.url += ( "/medibuntu/" => "/mirror/medibuntu/" ) 
alias.url += ( "/google/" => "/mirror/google/" ) 
alias.url += ( "/virtualbox/" => "/mirror/virtualbox/" ) 

Configurando los clientes

Configuraciones que deben ser realizadas en cada cliente:

Agregando certificados

sudo wget -q http://packages.medibuntu.org/medibuntu-key.gpg -O- | apt-key add -
sudo wget -q https://dl-ssl.google.com/linux/linux_signing_key.pub -O- | apt-key add -
sudo wget -q http://download.virtualbox.org/virtualbox/debian/sun_vbox.asc -O- | apt-key add -

/etc/apt/sources.list

Los clientes deben tener su archivo /etc/apt/sources.list configurado en concordancia al repositorio que se ofrece.

#
# Ubuntu principal
deb http://192.168.2.250/ubuntu/ intrepid main restricted universe multiverse
deb http://192.168.2.250/ubuntu/ intrepid-updates main restricted universe multiverse
deb http://192.168.2.250/ubuntu/ intrepid-security main restricted universe multiverse 

# Canonical partners
# adobe-flashplugin
deb http://192.168.2.250/canonical/ intrepid partner
deb http://192.168.2.250/canonical/ intrepid-updates partner
deb http://192.168.2.250/canonical/ intrepid-security partner

# Medibuntu
# acroread googleearth hot-babe realplayer codecs skype etc 
deb http://192.168.2.250/medibuntu/ intrepid free non-free

# Google
# google-desktop picasa
deb http://192.168.2.250/google/ stable main non-free

# Virtualbox
deb http://192.168.2.250/virtualbox/ intrepid non-free

Script

#!/bin/bash
# Mirror Ubuntu y amigos 
#
# Version 2.0 - 08.dec.2008
#       * Se adapta para ubuntu (root, keyring)
#       * Se agrega multi-protocolo
#       * Se utiliza keyring no-standard
# Version 1.5 - 06.feb.2006
#       * Eliminado repositorio non-US
#       * Control de sincronizacion y reintentos
# Versión 1.0 - 17.ene.2005
# 
 
# 0 corre en modo consola con salida a stdout
# 1 corre en modo batch con salida a /var/log/syslog
SILENT=1
 
# Cantidad de reintentos en sincronizar antes de abortar
REINTENTOS=5
 
DEBMIRROR=/usr/bin/debmirror
 
export GNUPGHOME=/root/keyring
 
function bajo_mirror {
        if [ $SILENT -eq 1 ]; then
                /usr/bin/logger "Inicio actualizacion mirror $HOST"
                PROGRESO=""
        else
                echo Distro:     $DISTRO
                echo Section:    $SECTION
                echo Server:     $HOST
                echo Mirror en:  $LOCATION
                PROGRESO="-p -v"
        fi
        BUCLES=1
        run_debmirror
        if [ $SILENT -eq 1 ]; then
                /usr/bin/logger "Final actualizacion mirror $HOST"
        else
                echo "==============================================================================="
        fi
}
 
function run_debmirror {
        if [ $BUCLES -gt $REINTENTOS ]; then return; fi
        # TEST="--dry-run"
        $DEBMIRROR $TEST --method=$METHOD -a $ARCH -s $SECTION -h $HOST -r $ROOT -d $DISTRO $LOCATION $PROGRESO --nosource --md5sums
        if [ $? -ne 0 ]; then
                if [ $SILENT -eq 1 ]; then
                        /usr/bin/logger "Error al sincronizar repositorio, intento $BUCLES"
                else
                        echo "Error al sincronizar repositorio, intento $BUCLES"
                fi
                BUCLES=$(($BUCLES+1))
                run_debmirror
        fi
}
 
# deb http://us.archive.ubuntu.com/ubuntu/ intrepid main restricted universe
# METHOD="http" ROOT="ubuntu"
# METHOD="rsync" ROOT=":ubuntu"
METHOD='rsync'
ROOT=":ubuntu"
DISTRO='intrepid,intrepid-security,intrepid-updates'
SECTION='main,restricted,universe,multiverse'
ARCH='i386'
LOCATION=/mirror/ubuntu
HOST=us.archive.ubuntu.com
bajo_mirror
 
# deb http://archive.canonical.com/ intrepid main
METHOD='http'
ROOT="/"
DISTRO='intrepid,intrepid-security,intrepid-updates'
SECTION='partner'
ARCH='i386'
LOCATION=/mirror/canonical
HOST=archive.canonical.com
bajo_mirror
 
# deb http://packages.medibuntu.org/ intrepid free non-free
METHOD='http'
ROOT="/"
DISTRO='intrepid'
SECTION='free,non-free'
ARCH='i386'
LOCATION=/mirror/medibuntu
HOST=packages.medibuntu.org
bajo_mirror
 
# http://dl.google.com/linux/deb/dists/stable/Release.gpg
METHOD='http'
ROOT="linux/deb"
DISTRO='stable'
SECTION='main,non-free'
ARCH='i386'
LOCATION=/mirror/google
HOST=dl.google.com
bajo_mirror
 
# deb http://download.virtualbox.org/virtualbox/debian intrepid non-free
METHOD='http'
ROOT="virtualbox/debian/"
DISTRO='intrepid'
SECTION='non-free'
ARCH='i386'
LOCATION=/mirror/virtualbox
HOST=download.virtualbox.org
bajo_mirror
 
exit 0

Fin

Con todo esto, el repositorio debería estar funcionando normalmente, cualquier comentario que quieras hacer hazlo en mi blog. Gracias.