sebb.info
"Write programs that handle text streams, because that is the universal interface."
Creadores del sistema Unix.



Cómo obtener un espejo de Debian sarge y sid en menos de 20GB.
Incluye main, contrib, non-free y security.

  Una de mis máquinas tiene un disco vacío, recientemente obtenido en una empresa de reciclaje tecnológico, por un puñado de higos secos. Se trata de un disco Seagate ST320014A ATA, dado por 20,02GB por el constructor, formateado con ext3. Estudié la manera de que cupiera en dicho espacio las dos distribuciones que más uso: Debian sarge y sid para i386, con repositorios main, contrib, non-free y security.

  El comando debmirror, un script de perl bastante espartano, tiene unos modificadores que permiten en cierta medida adaptar la configuración del espejo a las necesidades de cada uno. Por mi parte, decidí no replicar el código fuente de los paquetes, pues ocupan mucho espacio, ni los paquetes localizados para los idiomas que no hablo, y finalmente excluí tambien unas aplicaciones que nunca uso.

  El resultado es un larguísimo comando, lo iré detallando a continuación. La configuración de este espejo responde a mis necesidades, cada uno ha de modificar las opciones. Supongo que el presente comando se alargará conforme vaya identificando aplicaciones que no uso y ocupan un espacio notable.

  Empecemos por instalar debmirror:
# apt-get install debmirror gnupg

  Crear un llave gnupg para root:
# gpg --gen-key

  Editar el archivo ~/.gnupg/gpg.conf:
# nano ~/.gnupg/gpg.conf

  Modificar el archivo para obtener estas opciones:
keyserver-options auto-key-retrieve
keyserver keyring.debian.org

  El script:
#!/bin/bash

# Crea un espejo de Debian a medida.

echo -e "Inicio de la actualización:\n`date`\n"
# # # # # # # # # # # # # # # # # # # #
# Definición de espejo para SARGE y SID
# # # # # # # # # # # # # # # # # # # #
#
#
espejo="/repositorio/debian"
host='--host=ftp.es.debian.org'
method='--method=ftp'
root='--root=/debian'
dist='-d sid,sarge'
arch="--arch=i386"
section="--section=main,contrib,non-free"
source="--nosource"
modif='--exclude-deb-section="\
games|science|oldlibs|hamradio|otherosfs|news|electronics|math"
--exclude=".*-af_.*" --exclude=".*amd64.*" --exclude="ami.*" \
--exclude=".*-ar_.*" --exclude="atlas.*" --exclude="atmel-firmware.*" \
--exclude=".*-az_.*" --exclude="bcm5700-source.*" \
--exclude="beneath-a-steel-sky.*" --exclude=".*-bg_.*" \
--exclude="bible-kjv.*" --exclude="bibletime.*" --exclude=".*-bn_.*" \
--exclude="bomberclone.*" --exclude=".*-br_.*" --exclude=".*-bs_.*" \
--exclude="bsdgames.*" --exclude=".*-ca_.*" --exclude=".*canna.*" \
--exclude="canna.*" --exclude="cl-faq.*" --exclude="cmap-adobe-.*" \
--exclude=".*-cs_.*" --exclude=".*-cy_.*" --exclude=".*-da_.*" \
--exclude=".*-de_.*" --exclude="diatheke.*" --exclude="dict-easton.*" \
--exclude="dict-freedict.*" --exclude="dict-hitchcock.*" \
--exclude="doc-linux-.*" --exclude="ebook-dev-ggad.*" \
--exclude="ebook-dev-kde.*" --exclude="edict-fpw.*" --exclude=".*-el_.*" \
--exclude="electricsheep.*" --exclude=".*emt64t.*" --exclude=".*-en-gb_.*" \
--exclude=".*-eo_.*" --exclude=".*-et_.*" --exclude=".*-eu_.*" \
--exclude=".*-fa_.*" --exclude=".*-fi_.*" --exclude="firmware-ipw.*" \
--exclude="firmware-qlogic.*" --exclude=".*-fy_.*" --exclude=".*-ga_.*" \
--exclude="gazetteer.*" --exclude="gdm_.*" --exclude="geomview.*" \
--exclude=".*-gl_.*" --exclude="gnomesword.*" --exclude="grokking-the-gimp.*" \
--exclude="gtk-im-libthai.*" --exclude=".*hangul.*" --exclude="hanterm.*" \
--exclude=".*-he_.*" --exclude=".*-hi_.*" --exclude="hlatex.*" \
--exclude=".*-hr_.*" --exclude=".*-hu_.*" --exclude="iamerican.*" \
--exclude="ibrazilian.*" --exclude="ibulgarian.*" --exclude="icatalan.*" \
--exclude="iczech.*" --exclude="idanish.*" --exclude="idutch.*" \
--exclude="iesperanto.*" --exclude="ifaroesev.*" --exclude="ifinnish.*" \
--exclude="igaelic.*" --exclude="igalician-minimos.*" \
--exclude="ihungarian.*" --exclude="iiimf.*" --exclude="iirish.*" \
--exclude="iitalian.*" --exclude="ilithuanian.*" \
--exclude="illuminator-demo.*" --exclude="imanx.*" --exclude="ingerman.*" \
--exclude="inorwegian.*" --exclude="installation-guide-alpha.*" \
--exclude="installation-guide-powerpc.*" --exclude="iogerman.*" \
--exclude="ipolish.*" --exclude="irussian.*" --exclude=".*-is_.*" \
--exclude="iswedish.*" --exclude="iswiss.*" --exclude=".*-it_.*" \
--exclude="iukrainian.*" --exclude=".*-ja_.*" --exclude="k6_2.*" \
--exclude="k6_3.*" --exclude="k7_2.*" --exclude="k7_3.*" --exclude="k7-smp.*" \
--exclude="kde-i18n.*" --exclude="kdelibs4-.*" --exclude="kernel.*-arm.*" \
--exclude="kernel.*-mips.*" --exclude="kernel.*-s390.*" \
--exclude="kernel-.*-speakup_.*" --exclude="khangman.*" --exclude=".*-km_.*" \
--exclude=".*-ko_.*" --exclude="koffice-doc.*" --exclude="koffice-i18n-.*" \
--exclude=".*-korean-.*" --exclude="latex-cjk-chinese.*" \
--exclude="latex-cjk-thai.*" --exclude="libatlas.*" --exclude="libcanna.*" \
--exclude="libsword4.*" --exclude="libthai.*" --exclude=".*-lt_.*" \
--exclude=".*-lv_.*" --exclude="manpages-.*" --exclude="med-.*" \
--exclude=".*-mk_.*" --exclude=".*-mn_.*" --exclude=".*-ms_.*" \
--exclude="myspell-.*" --exclude="nabi.*" --exclude=".*-nb_.*" \
--exclude=".*-nds_.*" --exclude=".*-nl_.*" --exclude=".*-nn_.*" \
--exclude="openoffice.org-dev.*" --exclude="openoffice.org-dev-doc.*" \
--exclude="openoffice.org-l10n-.*" --exclude="oskit.*" --exclude=".*-pa_.*" \
--exclude="pango-libthai.*" --exclude="perl-debug.*" --exclude="picon-.*" \
--exclude=".*-pl_.*" --exclude="prc-tools.*" --exclude=".*-pt_.*" \
--exclude=".*-pt-br_.*" --exclude="rmligs-german.*" --exclude=".*-ro_.*" \
--exclude=".*-ru_.*" --exclude=".*-rw_.*" --exclude="samba-doc_.*" \
--exclude="scim-chinese.*" --exclude="scim-thai.*" --exclude=".*-se_.*" \
--exclude=".*-sk_.*" --exclude=".*-sl_.*" --exclude=".*-sr_.*" \
--exclude=".*-srlatin_.*" --exclude=".*-ss_.*" --exclude="stardict.*" \
--exclude=".*-sv_.*" --exclude="sword-comm-.*" --exclude="sword-dict-.*" \
--exclude="sword-text-.*" --exclude=".*-ta_.*" --exclude=".*-tg_.*" \
--exclude="thailatex.*" --exclude="thai-system.*" --exclude=".*-tr_.*" \
--exclude="treelang-.*" --exclude="ttf-.*" --exclude="ttf2pt1-chinese.*" \
--exclude="tuxpaint.*" --exclude=".*-uk_.*" --exclude=".*-uz_.*" \
--exclude="verse.*" --exclude="xfonts-a12k.*" --exclude="xfonts-ay.*" \
--exclude="xfonts-baekmuk.*" --exclude="xfonts-biznet.*" \
--exclude="xfonts-bolkhov.*" --exclude="xfonts-cmex.*" \
--exclude="xfonts-cronyx.*" --exclude="xfonts-cyrillic.*" \
--exclude="xfonts-encodings.*" --exclude="xfonts-intl-arabic.*" \
--exclude="xfonts-intl-asian.*" --exclude="xfonts-intl-chinese.*" \
--exclude="xfonts-intl-japanese.*" --exclude="xfonts-kaname.*" \
--exclude="xfonts-kappa.*" --exclude="xfonts-marumoji.*" \
--exclude="xfonts-mplus.*" --exclude="xfonts-naga.*" \
--exclude="xfonts-shinonome.*" --exclude="xfonts-thai.*" \
--exclude="xiterm+thai.*" --exclude="xlibmesa-dri-dbg.*" \
--exclude="xmanpages-ja.*" --exclude="xpdf-chinese.*" \
--exclude="zh-autoconvert.*" --exclude=".*-zh-cn_.*" --exclude="zhconf.*" \
--exclude="zh-sgmltools.*" --exclude=".*-zh-tw_.*" --include="bc_.*" \
--include="dict-freedict-eng-fra.*" --include="dict-freedict-eng-spa.*" \
--include="dict-freedict-fra-eng.*" --include="dict-freedict-spa-eng.*" \
--include="doc-linux-fr.*" --include="kde-i18n-es_.*" \
--include="koffice-i18n-es.*" --include="libgtk*" --include="manpages-es.*" \
--include="manpages-fr.*" --include="myspell-es.*" --include="myspell-fr.*" \
--include="openoffice.org-l10n-es.*" --include="ttf-bitstream-vera.*" \
--include="ttf-dejavu.*" --include="ttf-dustin.*" --include="ttf-f500.*" \
--include="ttf-freefont.*" --include="ttf-isabella.*" \
--include="ttf-junicode.*" --include="ttf-opensymbol.*" \
--include="ttf-staypuft.*" --include="ttf-xfree86.*" \
--ignore-small-errors --ignore-release-gpg --ignore-missing-release \
-v -p --cleanup'

function reflejos
{
eval "debmirror $espejo $host $method $root $dist $arch $section $source $modif"
}
#
#

# Presenta por orden de tamaño los 100 archivos más grandes del espejo.
#
#
function presenta
{
echo -e "\nLos cien archivos más grandes del espejo:\n"
( eval " echo 'Bloques de 1024 bytes|Nombre del paquete'; ls -R1s $espejo/pool/ \
| grep '\.deb' | sed -e 's/^ *//g' | sort -t ' ' -k 1 -g -r | head -100 | \
sed -e 's/ /|/g' " ) | column -t -s"|"
mirate=`du -sh "$espejo"`
echo -e "\nOcupación del espejo en $espejo:\n$mirate"
[ "$total" = "" ]&&total="$mirate"||total="$total \n$mirate"
echo -e "\n                 = = = = = = = = = = = = = = = = = = = = =\n"
}

# # # # # # # # # # # # # # # # # # #
# Genera espejo para SID y SARGE
# # # # # # # # # # # # # # # # # # #
#
#
reflejos&&presenta

# # # # # # # # # # # # # # # # # # #
# Definición de espejo para SECURITY
# # # # # # # # # # # # # # # # # # #
#
#
espejo='/repositorio/debian_sec'
host='--host=security.debian.org'
root='--root=/debian-security'
dist='-d sarge/updates'

# # # # # # # # # # # # # # # # # # #
# Genera espejo para SECURITY
# # # # # # # # # # # # # # # # # # #
#
#
reflejos&&presenta

echo -e "Espacio ocupado por todos los repositorios:\n$total\n\n"
observa=`df -h /dev/hdc`
echo -e "Estado del disco:\n$observa\n\n"
echo -e "Fin de la actualización:`date`\n\n"
#
#

# FIN

  Detalles.
  • Se crea el espejo en /repositorio/, donde está montado el disco de 20GB.
  • sid y sarge están en /repositorio/debian, security está en /repositorio/debian_sec.
  • Se usa el servidor más cercano: es.debian,org.
  • Se usa ftp para evitar diferentes problemas, como el proxy poisoning.
  • La raiz es Debian, evidentemente.
  • Se elige sid y sarge para i386, secciones main, contrib y non-free.
  • Se elige security para i386, secciones main, contrib y non-free.
  • No se baja el código fuente.
  • No se bajan las secciones intiles (Para mí: juegos, aplicaciones científicas, etc.
  • Se excluye otra serie de paquetes usando una expresión regular.
  • Se excluen todas las variantes locales de paquetes en idiomas que no se usan.
  • Se excluyen los paquetes de diccionarios de muchos idiomas.
  • Se incluyen ciertos paquetes que han sido excluidos por las expresiones regulares anteriores.
  • Se ignoran errores no críticos.
  • Se pide detalles de lo que se va haciendo y unas barras de progreso.
  • Se mide finalmente el espacio de cada distribución.
  • Todos los resultados del script nos llegarán por mail gracias a cron.
  Más control.
  Una de las metas iniciales de todo este trajín es limitar el espacio del espejo para que quepa en un disco de tamaño dado. Para hacer más sencilla la tarea de buscar qué paquetes pesan más, se inclye al final del script el siguiente comando, que también se puede usar directamente desde la línea de comandos:
echo "Los cien archivos más grandes del espejo:"
( echo 'Bloques de 1024 bytes|Nombre del paquete'; ls -R1s /repositorio/pool/\
| grep '\.deb' | sed -e 's/^ *//g' | sort -t ' ' -k 1 -g -r | head -100 \
| sed -e 's/ /|/g' ) | column -t -s"|"

# Se puede también buscar el tamaño de unos paquetes concretos (línea de comandos):
paquete="samba-doc*" ; donde="/repositorio/debian/pool/main/s" ; clear ; \
a=0 ; b=0 ; for i in `find "$donde" -type f -iname "$paquete" -print | xargs \
ls -ls | sed -e 's/^ *//g' -e 's/  / /g' | sed -e 's/  / /g'` ; do x=`echo $i \
| cut -d" " -f1` ; a=$((a+x)) ; b=$((b+1)) ; echo `echo $i | cut -d" " -f6 ; \
echo $i | cut -d" " -f9` ; done ; echo -e \
"\nTotal: $a"KB = $((a/1024))MB en $b "archivo(s).\n"

# Este comando devuelve por ejemplo:
12116952 /repositorio/debian/pool/main/s/samba/samba-doc_3.0.14a-3sarge2_all.deb
6907148 /repositorio/debian/pool/main/s/samba/samba-doc_3.0.23c-4_all.deb
6592686 /repositorio/debian/pool/main/s/samba/samba-doc-pdf_3.0.23c-4_all.deb

Total: 25064KB = 24MB en 3 archivo(s).
# 

El comando formatea con encabezados la lista de los 100 archivos más grandes del repositorio. Cron nos enviará esta información por correo electrónico junto con los datos de actualización. Estos archivos son candidatos prioritarios para ser eliminados en caso de falta de espacio.

  Cron.
  Resulta conveniente actualizar el espejo de manera automática. Para tal menester, cron es ideal. Se mete el comando anterior en un archivo, y se vuelve ejecutable con "chmod 711 refleja". Luego se edita crontab. (El comando corre todos los días de madrugada a las 6:02 en Tapia):
2 6 * * * /usr/local/sbin/refleja

  Un truco general para cron: Como añadir una tarea automáticamente desde un script sin borrar las entradas anteriores
( crontab -l ; echo "* * * * * comando" ) | crontab -
  ($? devuelve 0 en caso de éxito, 1 si falla)

  Apache.
  Una vez terminado la actualización del espejo, lo enlazamos en la carpeta de Apache para que apt encuentre los repositorios desde las máquinas de la red local:
ln -s /repositorio/debian/ /var/www/debian/
ln -s /repositorio/debian_sec/ /var/www/debiansec/

  El archivo sources.list
  Solo queda retocar el archivo /etc/apt/sources.list de cada máquina de la red local para apuntar al repositorio local:
nano /etc/apt/sources.list

  En mi caso, la máquina con el repositorio tiene la ip: 192.168.0.200 y la carpeta con los archivos se llama debian en el Apache:
deb http://192.168.0.120/debian sarge main contrib non-free
deb http://192.168.0.120/debiansec sarge/updates main contrib non-free

  Resultado.
tapia:~# df -h /dev/hdc
S.ficheros          tamaño Usado  Disp Uso% Montado en
/dev/hdc               19G   17G  746M  96% /repositorio
tapia:~#date
mar nov  7 18:31:11 CET 2006
tapia:~#
  El repositorio cabe en los 20GB, con los paquetes de sid, sarge y security de la fecha indicada. Quedan más de 700MB libres.

  Implementación casera:
  Tengo varias máquinas fabricadas a medida que se cuelgan de la pared o de cualquier otro sitio donde no molesten. Hay muchos ordenadores en casa; la manera más rentable para almacenarlos es la vertical.

  En el caso del repositorio, uso a veces un P-II a 300Mhz llamado Tapia, otras veces migro el disco a otro pc de la red. El disco blanco que se ve por fuera tiene el espejo de Debian. El disco de sistema, de 2,5GB, está detrás en la jaulilla. Tapia solo tiene un cable de red y la alimentación, se accede por ethernet. Lleva 128MB de RAM y una fuente de luces. Proporciona apache, postgres y nfs además del repositorio. Al estar montado en una bandeja metálica, es fácil de transportar.

  Se supone que un repositorio local ha de poder llevarse a lugares donde no llega Internet...
Tapia, un pc desplazable con un espejo de 20GB
  Puede pulsar la imagen para ampliarla


Primera publicación: 10 de Octubre del 2006. Última actualización: 7 de Noviembre del 2006
El HTML40 cumple con las normas W3   La hoja de estilo CSS cumple con las normas W3