====== Crear un repositorio parcial de Ubuntu ====== Uno de los problemas que nos encontramos en la administración de los equipos es que no podemos permitir que la gente instale cualquier paquete disponible para Ubuntu, porque sus sistemas duran muy poco tiempo usables y pueden instalar software no deseado como servidores de correo. Para solucionarlo, durante mucho tiempo no hemos permitido la instalación de paquetes a los usuarios, y cada vez que querían instalar software, ha tenido que ser mediando a través de nosotros, los administradores. Afortunadamente, esta solución nos permite saltarnos ese paso: Creando un repositorio que solo contenga los paquetes que nosotros aprobemos previamente podemos ofrecérselos a todo el mundo una vez una única persona nos lo pida y lo aprobemos. Tenemos así un repositorio tipo //lista blanca//. En los clientes es necesario configurar este repositorio, quitar todos los demás y permitir la instalación de los paquetes a los usuarios. Esto se sale del objetivo del tutorial así que no lo cubriremos aquí. ===== Material necesario ===== * Un servidor, donde almacenaremos el repositorio. Puede ser virtual perfectamente. * Se recomiendan al menos 15GB de almacenamiento exclusivos para ''/var/local'', aunque cuidado porque se pueden necesitar más si crece mucho el repositorio. Si se va a crear un repositorio multiarquitectura (para Ubuntu 12.04 en adelante), recomendamos al menos 20GB. * Puertos abiertos para HTTP, ya que el servidor estará accesible mediante este protocolo. ===== Resumen del funcionamiento ===== El funcionamiento básicamente es este: - Colocamos en una lista de texto los paquetes que queremos. - Se la pasamos a ''apt-get'' en modo //sólo descarga//, de forma que los deja en caché. - Con ''apt-move'', movemos los paquetes en caché a un repositorio. El problema es que el ''apt'' del sistema necesita ser capaz de instalar todos los paquetes que queramos, y eso quiere decir que o bien el servidor tiene exactamente el mismo sistema operativo y versión que los clientes a los que va dirigido el repositorio, o debemos crear un entorno chroot con ''debootstrap''. Optaremos por esta última opción. ===== Creación del entorno chroot ===== El siguiente script instalará ''bootstrap'' y hará el trabajo de crear el directorio y el entorno básico de los entornos chroot de 32 y de 64 bits: #!/bin/sh # generate a partial Debian mirror with debootstrap and apt-move # 2004-02, W. Borgert # Released under the terms of the GNU General Public License # 2012-12 Modified by Jorge Suárez de Lis # 2014-07 Modified again by Jorge Suárez de Lis # the root directory of the mirror system CHROOT64=/var/local/chroot-amd64 CHROOT32=/var/local/chroot-i386 # the mirror directory inside of the chroot MIRRORDIR64=/var/local/mirrors-amd64 MIRRORDIR32=/var/local/mirrors-i386 # the Debian archive next to you DEBIANREPO=http://fr.archive.ubuntu.com/ubuntu # the release name RELEASENAME=trusty #### OUT=adduser,aptitude,apt-utils,at,base-config,bsdmainutils,\ console-common,console-data,console-tools,cpio,cron,debconf-i18n,\ dhcp-client,ed,exim4,exim4-base,exim4-config,exim4-daemon-light,\ fdutils,gettext-base,groff-base,ifupdown,info,ipchains,iptables,\ iputils-ping,klogd,libconsole,libgcrypt1,libgcrypt7,libgdbm3,\ libgnutls10,libgpg-error0,libident,liblocale-gettext-perl,\ liblockfile1,liblzo1,libnewt0.51,libopencdk8,libpcap0.7,libpcre3,\ libpopt0,libsigc++-1.2-5c102,libssl0.9.7,libtasn1-0,\ libtext-charwidth-perl,libtext-iconv-perl,libtext-wrapi18n-perl,\ libwrap0,lilo,logrotate,mailx,makedev,man-db,manpages,mbr,modconf,\ modutils,nano,netbase,netkit-inetd,net-tools,nvi,pciutils,ppp,\ pppconfig,pppoe,pppoeconf,procps,psmisc,setserial,slang1,sysklogd,\ syslinux,sysvinit,tasksel,tcpd,telnet,wget,whiptail IN=apt-move,bc,bzip2,dash,debconf,libbz2-1.0,libpam0g,\ libreadline5 #### apt-get install debootstrap mkdir -p $CHROOT64$MIRRORDIR64/ubuntu debootstrap --components=main,universe --exclude="$OUT" --include="$IN" $RELEASENAME $CHROOT64 $DEBIANREPO mkdir -p $MIRRORDIR64 ln -s $CHROOT64$MIRRORDIR64/ubuntu $MIRRORDIR64 mkdir -p $CHROOT32$MIRRORDIR32/ubuntu debootstrap --components=main,universe --exclude="$OUT" --include="$IN" $RELEASENAME $CHROOT32 $DEBIANREPO mkdir -p $MIRRORDIR32 ln -s $CHROOT32$MIRRORDIR32/ubuntu $MIRRORDIR32 Es posible que falle para algunas releases de Ubuntu. Por ejemplo, este funciona para Ubuntu 14.04, pero es posible que necesites cambiar el nombre de algún paquete para otras versiones, o para usarlo en Debian. Una vez terminado, tendremos un sistema base limpito, listo para hacer chroot, en ''/var/local/chroot-amd64'' y en ''/var/local/chroot-i386''. ===== Configuración de apt y apt-move dentro del entorno chroot ===== Editamos el archivo ''/var/local/chroot-amd64/etc/apt/sources.list'' poniendo todos los repositorios de los que deseemos instalar paquetes. Por ejemplo, en nuestro caso: deb http://fr.archive.ubuntu.com/ubuntu precise main universe multiverse deb http://fr.archive.ubuntu.com/ubuntu precise-updates main universe multiverse deb http://fr.archive.ubuntu.com/ubuntu precise-security main universe multiverse deb http://download.virtualbox.org/virtualbox/debian precise contrib non-free Si añades repositorios externos, no olvides añadir las claves GPG dentro del entorno chroot, o todo dejará de funcionar correctamente. Por ejemplo, aquí hemos añadido el de Virtualbox. Al hacer ''sudo chroot /var/local/chroot-amd64 apt-get update'' recibiremos el siguiente error: W: Error de GPG: download.virtualbox.org lucid Release Las firmas siguientes no se pudieron verificar porque su llave pública no está disponible: NO_PUBKEY 54422A4B98AB5139 Lo único que tenemos que hacer es añadir esa llave pública descargándola de un servidor de llaves: chroot /var/local/chroot apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 54422A4B98AB5139 Comprueba que volviendo a hacer ''sudo chroot /var/local/chroot-amd64 apt-get update'' ya no recibes la advertencia. Ahora edita la configuración de ''apt-move''. Establece lo siguiente en el archivo ''/var/local/chroot-amd64/etc/apt-move.conf'': LOCALDIR=/var/local/mirrors-amd64/ubuntu DIST=lucid PKGCOMP="none gzip" CONTENTS=yes Y ahora crea el mirror vacío con los siguientes comandos: chroot /var/local/chroot-amd64 apt-get update chroot /var/local/chroot-amd64 apt-move get A partir de aquí nos serviremos de dos scripts más, ambos fuera del entorno chroot. El primero nos servirá para generar los archivos ''Release'', ya que ''apt-move'' no lo hace por nosotros. Colócalo en ''/usr/local /sbin/generate_release_files.sh'': #!/bin/sh # generate Release files for a Debian mirror # 2003-10, W. Borgert # Released under the terms of the GNU General Public License # 2012-12 Modified by Jorge Suárez de Lis ORIGIN="Ubuntu" LABEL="Ubuntu CITIUS" SUITE="lucid" CODENAME="precise" DESC="Paquetes para Ubuntu CITIUS 12.04" UNPACK=0 ARCHIVE=. SIGN_RELEASE=0 SIGN_KEY=0 # long options not yet implemented args=`getopt 'a:c:d:l:o:s:u' $*` for o do case "$o" in -a | --arch*) ARCHIVE="$2"; shift; shift;; -c | --code*) CODENAME="$2"; shift; shift;; -d | --desc*) DESC="$2"; shift; shift;; -l | --label) LABEL="$2"; shift; shift;; -o | --orig*) ORIGIN="$2"; shift; shift;; -s | --suite) SUITE="$2"; shift; shift;; -u | --unpa*) UNPACK=1; shift;; --) shift; break;; esac done #### cd $ARCHIVE DATE=`date -u` if [ $UNPACK -eq 1 ]; then PACKAGGZ=`find . -follow -name Packages.gz -o -name Sources.gz` for p in $PACKAGGZ; do gunzip -c $p > `dirname $p`/`basename $p .gz` done fi PACKAGES=`find . -follow -name Packages -o -name Packages.gz -o \ -name Sources -o -name Sources.gz` DIRS=`for p in $PACKAGES; do dirname $p; done|sort -u` COMPS=`for d in $DIRS; do echo $d | \ sed 's,[^A-Za-z0-9-]*\([A-Za-z0-9-]*\)/.*,\1,'; done|sort -u` ARCHS=`for d in $DIRS; do echo $d | \ sed 's,.*binary-\([A-Za-z0-9-]*\),\1,'; done|sort -u` for d in $DIRS; do cd $d ARCH=`echo $d | sed 's,.*binary-\([A-Za-z0-9-]*\),\1,'` COMP=`echo $d | \ sed 's,[^A-Za-z0-9-]*\([A-Za-z0-9-]*\)/.*,\1,'` echo "Archive: $SUITE Component: $COMP Origin: $ORIGIN Label: $LABEL Architecture: $ARCH" > Release cd - done rm -f Release MD5FILES=`find . -follow -name Packages -o -name Packages.gz -o \ -name Sources -o -name Sources.gz -o -name Release \ | sed 's,^[^/]*/,,'` echo "Origin: $ORIGIN Label: $LABEL Suite: $SUITE Codename: $CODENAME Date: $DATE Architectures:" `echo $ARCHS`" Components:" `echo $COMPS`" Description: $DESC MD5Sum:" > Release for m in $MD5FILES; do echo -n " " >> Release SIZE=`wc -c $m | sed 's/ *\([0-9]*\).*/\1/'` SUM=`md5sum $m | sed 's/^ *\([A-Fa-f0-9]*\) .*/\1/'` printf "%s %16d %s\n" $SUM $SIZE $m >> Release done echo "SHA1:" >> Release for m in $MD5FILES; do echo -n " " >> Release SIZE=`wc -c $m | sed 's/ *\([0-9]*\).*/\1/'` SUM=`sha1sum $m | sed 's/^ *\([A-Fa-f0-9]*\) .*/\1/'` printf "%s %16d %s\n" $SUM $SIZE $m >> Release done if [ $SIGN_RELEASE -eq 1 ] ; then gpg --armor --default-key $SIGN_KEY --yes -b -o $ARCHIVE/Release.gpg $ARCHIVE/Release fi No te olvides de modificar las variables de arriba, que definirán el nombre del repositorio y la descripción. Por último, el siguiente script que será el único que manejemos directamente a partir de ahora, será el que nos sirva para gestionar la instalación de nuevos paquetes, las actualizaciones, búsquedas, etc. Colócalo en ''/usr/local/sbin/update_mirror.sh'': #!/bin/sh # update a partial Debian mirror with apt-move # 2004-02, W. Borgert # Released under the terms of the GNU General Public License # 2012-12 Modified by Jorge Suárez de Lis # the root directory of the mirror system CHROOT=/var/local/chroot-amd64 # the mirror directory inside of the chroot MIRRORDIR=/var/local/mirrors-amd64/ubuntu/dists/precise # master packages file inside of the chroot MASTER=/var/local/packages #### MODE=$1; shift case "$MODE" in clean) chroot $CHROOT apt-move delete exit 0 ;; search|policy|show) chroot $CHROOT_BASEDIR-$ARCH apt-cache $MODE $@ exit 0 ;; install) PACKAGES="$*" if [ -f $CHROOT/$MASTER ]; then OLDPACKAGES=`cat $CHROOT/$MASTER` else OLDPACKAGES= fi for p in $OLDPACKAGES $PACKAGES; do echo $p; done | \ sort -u > $CHROOT/$MASTER ;; upgrade) if [ -f $CHROOT/$MASTER ]; then PACKAGES=`cat $CHROOT/$MASTER` else exit 0 fi ;; *) echo "Usage:" echo "$0 clean" echo "$0 install " echo "$0 upgrade" echo "$0 search" echo "$0 policy " echo "$0 show " exit 1 ;; esac chroot $CHROOT apt-get update chroot $CHROOT apt-get -d --yes --reinstall install $PACKAGES chroot $CHROOT apt-move get chroot $CHROOT apt-move move chroot $CHROOT apt-move packages /usr/local/sbin/generate_release_files.sh -a $MIRRORDIR chroot $CHROOT apt-get autoclean No te olvides de darle permiso de ejecución a ambos scripts. ==== Una de bugs ==== ''apt-move'' tiene un bug en Ubuntu 10.04 y 12.04 que debes solucionar. No le gustan los paquetes de ''universe'' y ''multiverse'', entre otros. Para solucionarlo, hay que editar el archivo ''/var/local/chroot-amd64/usr/share/apt-move/getdist.awk'' y dejarlo así: function getdist(section, dist, a) { if (section in _getdist) { return _getdist[section] } dist = section ldist = tolower(dist) if (match(ldist, /^non-us\/[^\/]*/)) { dist = "non-US" substr(dist, 7, RLENGTH - 6) } else if (ldist == "non-us") { dist = "non-US/main" #} else if (match(dist, /^[^\/]*\//)) { # dist = substr(dist, 1, RLENGTH - 1) } else { dist = "main" } return _getdist[section] = dist } Si usas Ubuntu 12.04, ten presente también [[https://bugs.launchpad.net/ubuntu/+source/apt-move/+bug/946605|este bug]]. Instalar el paquete deb directamente desde Debian, donde a fecha de escribir esto ya han arreglado el bug, soluciona todos los problemas. No te olvides de volver a aplicar el parche de más arriba de nuevo una vez vuelvas a instalar ''apt-move''. ===== Funcionamiento y actualización ===== Para añadir paquetes (con sus dependencias correspondientes) al repositorio, ejecuta lo siguiente: update_mirror.sh install Ten en cuenta que esto añade nombres de paquetes al archivo ''/var/local/chroot-amd64/var/local/packages''. Si te equivocas y empiezas a recibir advertencias o errores en el script de actualización debido a paquetes mal escritos o conflictivos, puedes eliminarlos de allí. Para actualizar el repositorio, escribe lo siguiente: update_mirror.sh upgrade ===== Servir el repositorio mediante HTTP ===== Dependiendo del volumen de peticiones, interesará instalar un servidor u otro. En nuestro caso, es suficiente con Lightttpd. sudo apt-get install lighttpd Editamos el archivo de configuración ''/etc/lighttpd/lighttpd.conf'' para servir el repositorio: server.document-root = "/var/local/mirrors-amd64" Reiniciamos lighttpd: invoke-rc.d lighttpd restart Y tras esto ya pueden conectarse los clientes. Para ello hace falta añadir esta línea en el ''sources.list'' de cada uno: deb http:///ubuntu lucid main contrib Nótese que solo se añaden ''main'' y''contrib'' independientemente de cómo se llamen las secciones en Ubuntu. Apt-move deja los paquetes que haya en ''contrib'' allí y el resto los manda a ''main'' (''universe'', ''multiverse'' y demás). ===== Firmar los archivos Release ===== Crea la firma usando ''gnupg'' en el entorno chroot: # chroot /var/local/chroot-lucid/ gpg --gen-key gpg (GnuPG) 1.4.10; Copyright (C) 2008 Free Software Foundation, Inc. This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Please select what kind of key you want: (1) RSA and RSA (default) (2) DSA and Elgamal (3) DSA (sign only) (4) RSA (sign only) Your selection? 1 RSA keys may be between 1024 and 4096 bits long. What keysize do you want? (2048) Requested keysize is 2048 bits Please specify how long the key should be valid. 0 = key does not expire = key expires in n days w = key expires in n weeks m = key expires in n months y = key expires in n years Key is valid for? (0) Key does not expire at all Is this correct? (y/N) y You need a user ID to identify your key; the software constructs the user ID from the Real Name, Comment and Email Address in this form: "Heinrich Heine (Der Dichter) " Real name: Unidade de Xestion de Infraestruturas TIC Invalid character in name Real name: "Unidade de Xestion de Infraestruturas TIC " Invalid character in name Real name: Unidade de Xestion de Infraestruturas TIC Email address: citius.tic@usc.es Comment: Chave para o repositorio de paquetes de Ubuntu You selected this USER-ID: "Unidade de Xestion de Infraestruturas TIC (Chave para o repositorio de paquetes de Ubuntu) " Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? o Edita el archivo ''/var/local/chroot-amd64/etc/apt-move.conf'' y establece la llave correcta: # Set this to key name to be used for signing Release files. GPGKEY="Unidade de Xestion de Infraestruturas TIC (Chave para o repositorio de paquetes de Ubuntu) " Edita el script ''/usr/local/sbin/generate_release_files.sh''. Establece la llave correcta y habilita el firmado: SIGN_RELEASE=1 SIGN_KEY="D91685C4" Exporta la llave privada y añádela a los entornos chroot: gpg --export-secret-keys --armor --output /var/local/repositorio.gpg 'Unidade de Xestion de Infraestruturas TIC' cp /var/local/repositorio.gpg /var/local/chroot-amd64/ cp /var/local/repositorio.gpg /var/local/chroot-i386/ chroot /var/local/chroot-amd64 gpg --allow-secret-key-import --import /repositorio.gpg chroot /var/local/chroot-i386 gpg --allow-secret-key-import --import /repositorio.gpg rm -f /var/local/chroot-amd64/repositorio.gpg rm -f /var/local/chroot-i386/repositorio.gpg Por último, actualiza la lista de paquetes de nuevo: /usr/local/sbin/update_mirror.sh upgrade Para obtener la llave pública que se deberá añadir a los clientes, ejecuta lo siguiente: gpg --armor --output /var/local/repositorio.pub --export 'Unidade de Xestion de Infraestruturas TIC' Esta clave pública debe añadirse en todos los clientes que vayan a usar el repositorio: apt-key add /tmp/repositorio.pub ===== Actualizar automáticamente el repositorio ===== Sencillamente, ejecuta una tarea en cron todas las noches, o cuando quieras. crontab -e # m h dom mon dow command 0 2 * * * /usr/local/sbin/update_mirror.sh upgrade ===== Soporte multiarquitectura ===== Desde Ubuntu 12.04 en adelante ''apt'' soporta multiarquitectura, y en equipos de 64 bits (arquitectura ''amd64'') buscará repositorios de ''i386'', e incluso puede haber dependencias entre arquitecturas. Por ejemplo, al instalar ''skype'' en realidad el paquete depende de ''skype:i386'' y se descarga el paquete de 32 bits. Por lo tanto, si se quiere montar un repositorio completo para Ubuntu 12.04 con la arquitectura ''amd64'', hay que tener esto en cuenta. Desafortunadamente, ''apt-move'' hoy en día NO soporta multiarquitectura, por lo que ignorará los paquetes ''i386''. Los clientes tampoco podrán descargar la lista de paquetes de ''i386'' y recibirán advertencias, y no podrán instalar paquetes de 32 bits como ''skype'' o ''wine''. Os habréis dado cuenta de que el entorno lo hemos creado previamente en ''/var/local/chroot-amd64''. No era gratuito, era por esto. Lo primero que debes hacer es crear otro entorno chroot con apt-move, pero de 32 bits. Hazlo en ''/var/local/chroot-i386'' siguiendo las instrucciones de más arriba, pero cambiando los directorios. Si usas Ubuntu 10.04 o 12.04, corrige los bugs pertinentes también en el entorno de 32 bits, no te olvides. Importa también la llave privada en el entorno de 32 bits. Ahora viene lo divertido. Crea un nuevo directorio ''/var/local/mirror-agregate'' haciendo enlaces a los archivos y directorios particulares de cada arquitectura en caso del directorio ''dists'', y al ''pool'' del entorno de 64 bits, que incluye en realidad todos los paquetes. Vamos, resumiendo, esto: mkdir -p /var/local/mirror-agregate/ubuntu/dists/precise/main mkdir -p /var/local/mirror-agregate/ubuntu/dists/precise/contrib ln -s /var/local/mirrors-i386/ubuntu/dists/precise/main/binary-i386 /var/local/mirror-agregate/ubuntu/dists/precise/main/ ln -s /var/local/mirrors-amd64/ubuntu/dists/precise/main/binary-amd64 /var/local/mirror-agregate/ubuntu/dists/precise/main/ ln -s /var/local/mirrors-amd64/ubuntu/dists/precise/contrib/binary-amd64 /var/local/mirror-agregate/ubuntu/dists/precise/contrib/ ln -s /var/local/mirrors-amd64/ubuntu/dists/precise/Contents-amd64.gz /var/local/mirror-agregate/ubuntu/dists/precise/ ln -s /var/local/mirrors-amd64/ubuntu/pool /var/local/mirror-agregate/ubuntu/ Modifica la configuración de Lighttpd para que sirva este nuevo directorio, en lugar del que solo contiene los paquetes de 64 bits. Solo es cambiar un directorio en la configuración, seguro que sabes hacerlo. Sustituye el script ''update_mirror.sh'' por la siguiente versión: #!/bin/sh # update a partial Debian mirror with apt-move # 2004-02, W. Borgert # Released under the terms of the GNU General Public License # 2012-12 Modified by Jorge Suárez de Lis # the root directory of the mirror system CHROOT64="/var/local/chroot-amd64" CHROOT32="/var/local/chroot-i386" # master packages file inside of the chroot MASTER="/var/local/packages" #### MODE=$1; shift case "$MODE" in clean) chroot $CHROOT64 apt-move delete exit 0 ;; search|policy|show) chroot $CHROOT64 apt-cache $MODE $@ exit 0 ;; install) PACKAGES="$*" if [ -f $CHROOT64/$MASTER ]; then OLDPACKAGES=`cat $CHROOT64/$MASTER` else OLDPACKAGES= fi for p in $OLDPACKAGES $PACKAGES; do echo $p; done | \ sort -u > $CHROOT64/$MASTER ;; upgrade) if [ -f $CHROOT64/$MASTER ]; then PACKAGES=`cat $CHROOT64/$MASTER` else exit 0 fi ;; *) echo "Usage:" echo "$0 clean" echo "$0 install " echo "$0 upgrade" exit 1 ;; esac # Sync amd64 and i386 config files and apt caches cp $CHROOT64/etc/apt/sources.list $CHROOT32/etc/apt/sources.list chroot $CHROOT32 apt-get update # Get all the packages chroot $CHROOT64 apt-get update chroot $CHROOT64 apt-get -d --yes --reinstall install $PACKAGES # Move i386 packages to the i386 chroot environment and get all dependencies cp -f $CHROOT64/var/cache/apt/archives/*_i386.deb $CHROOT32/var/cache/apt/archives/ PACKAGES_i386=$(cd $CHROOT32/var/cache/apt/archives/ && ls -1 *.deb | cut -d'_' -f1) chroot $CHROOT32 apt-get -d --yes --reinstall install $PACKAGES_i386 # Apt-move i386 chroot chroot $CHROOT32 bash -c "export LANG=C ; apt-move get" chroot $CHROOT32 bash -c "export LANG=C ; apt-move move" chroot $CHROOT32 bash -c "export LANG=C ; apt-move packages" chroot $CHROOT32 apt-get autoclean # Apt-move amd64 chroot chroot $CHROOT64 bash -c "export LANG=C ; apt-move get" chroot $CHROOT64 bash -c "export LANG=C ; apt-move move" chroot $CHROOT64 bash -c "export LANG=C ; apt-move packages" chroot $CHROOT64 apt-get autoclean # Generate Release files /usr/local/sbin/generate_release_files.sh -a /var/local/mirrors-agregated/ubuntu/dists/precise Eso es todo. Ejecuta ''update_mirror.sh upgrade'' para crear la primera versión de tu repositorio multiarquitectura. ===== Añadir paquetes sueltos al repositorio ===== Sigamos peleándonos con ''apt-move''. En teoría puedes decirle ''movefile esto'' y moverá archivos sueltos al repositorio, pero en la práctica no, los ignora. Apt-move es así, hay que quererle como es. La mejor opción para añadir paquetes sueltos al repositorio es escapar de apt-move creando un repositorio local, añadir los paquetes ahí, y dejar que apt-move coja los paquetes como si se tratara de cualquier otro repositorio. Para ello instalamos ''reprepro''. apt-get install reprepro Hacemos un directorio local donde almacenar la configuración y el repositorio. Debe estar colgando del entorno chroot: mkdir -p /var/local/chroot-amd64/var/local/local-repository/conf Creamos allí tres archivos con la configuración: Origin: Ubuntu-CITIUS-local Label: Ubuntu CITIUS 12.04 Local Repository Codename: precise Architectures: amd64 Components: main Description: Apt repository for local packages DebOverride: override.precise DscOverride: override.precise SignWith: # Rellenar con el ID de la clave para firmar los paquetes verbose basedir /var/local/local-repository En el tercer archivo se añadirán los paquetes del repositorio con alguna metainformación que se puede editar. Creamos el archivo vacío por ahora: touch /var/local/chroot/var/local/local-repository/conf/override.precise Cubre el archivo ''distributions'' con el ID de la clave privada, que por si a estas alturas ya has perido, puedes obtener con el comando ''gpg --list-keys''. Ahora, para añadir paquetes al repositorio: reprepro -b /var/local/chroot/var/local/local-repository includedeb precise /ruta/al/archivo/debian.deb Ahora podríamos añadir sin más el repositorio en el ''sources.list'' del entorno chroot, pero no. Debemos servirlo por HTTP, porque sino apt no cachea los archivos copiándolos a ''/var/cache/apt/archives'' al instalarlos, y apt-move no los encontrará. Suponemos que has hecho lo que se indica en la sección //Servir el repositorio mediante HTTP//. Ahora solo resta hacer un enlace: ln -s /var/local/chroot-amd64/var/local/local-repository /var/local/ Y añadirlo en la configuración del ''lighttpd'', al final del archivo ''/etc/lighttpd/lighttpd.conf'': $HTTP["host"] == "localhost" { server.document-root = "/var/local/local-repository/" } Reinicia lighttpd: /etc/init.d/lighttpd restart Y ahora sí, toca agregar al entorno chroot al repositorio local, para que pueda instalar paquetes desde allí. Agregamos la siguiente línea al archivo ''/var/local/chroot/''. deb http://localhost precise main Un pequeño extra. Podemos comprobar que el paquete aparece en el ''apt'' del entorno chroot, y que la versión almacenada allí es la candidata para la instalación. En nuestro caso, un paquete ''opensc'' que incluye los drivers para el DNIe: $ sudo chroot /var/local/chroot-amd64 apt-get update $ sudo chroot /var/local/chroot-amd64 apt-cache policy opensc opensc: Instalados: (ninguno) Candidato: 0.12.2-2ubuntu1 Tabla de versión: 0.12.2-2ubuntu1 0 500 http://fr.archive.ubuntu.com/ubuntu/ precise/universe amd64 Packages 0.12.1-1ubuntu1~svn385 0 500 file:/var/local/local-repository/ precise/main amd64 Packages Como en este caso está pero nuestra versión es inferior a la incluida con Ubuntu y tiene la misma prioridad, nuestra versión nunca se instalará. tenemos dos opciones: o bien modificar la puntuación de los paquetes (algo que no entraremos a detallar aquí) o especificar la versión a la hora de añadirlo al repositorio. Por ejemplo, para este caso: $ sudo update_mirror.sh install opensc=0.12.1-1ubuntu1~svn385 ===== Crear metapaquetes ===== Puedes crear metapaquetes y meterlos en tu repositorio local. Para ello necesitas ''equivs'': $ sudo apt-get install equivs Agora, crea a plantilla con: $ equivs-control nome-do-paquete Crearase un arquivo ''nome-do-paquete'' que debes encher co nome do paquete, a descrición, a versión e as dependencias. Unha vez feito, crea o paquete con: $ equivs-build nome-do-paquete ===== Enlaces externos ===== * [[http://people.debian.org/~debacle/mirror/]] - Principal fuente, donde se explica este método para Debian Sarge