¿Cómo crear un repositorio APT local?


103

Me gustaría construir mi propio repositorio local en mi LAN, para que las máquinas en la LAN puedan actualizarse y actualizarse desde él. Quiero descargar los paquetes y almacenarlos en mi servidor local para poder actualizarlos, actualizarlos, instalarlos, etc., sin usar Internet.



3
No creo que sea un duplicado. Lo que Maythux quiere lograr es crear su propio servidor de repositorio para usarlo con aptitude. Lo que hace Keryx es reemplazar aptitude como administrador de paquetes y crear fuentes externas para paquetes.
con-f-use

Respuestas:


80

Desde el wiki de Ayuda de Ubuntu :

Hay 4 pasos para configurar un repositorio simple para usted

1.Instale dpkg-dev
2.Ponga los paquetes en un directorio
3.Cree un script que escaneará los paquetes y creará un archivo que apt-get update puede leer
4. Agregue una línea a su lista sources.list apuntando a su repositorio

Instalar dpkg-dev

Escribe un terminal

sudo apt-get install dpkg-dev

El directorio

Cree un directorio donde guardará sus paquetes. Para este ejemplo, usaremos/usr/local/mydebs.

sudo mkdir -p /usr/local/mydebs

Ahora mueva sus paquetes al directorio que acaba de crear.

Los paquetes descargados anteriormente generalmente se almacenan en su sistema en el /var/cache/apt/archivesdirectorio. Si ha instalado apt-cacher, tendrá paquetes adicionales almacenados en su directorio / packages.

El script update-mydebs

Es un simple tres líneas:

#! /bin/bash
 cd /usr/local/mydebs
 dpkg-scanpackages . /dev/null | gzip -9c > Packages.gz

Corte y pegue lo anterior en gedit, y guárdelo como update-mydebs en ~ / bin. (la tilde '~' significa su directorio de inicio. Si ~ / bin no existe, créelo: Ubuntu colocará ese directorio en su RUTA. Es un buen lugar para colocar scripts personales). A continuación, haga que el script sea ejecutable:

chmod u+x ~/bin/update-mydebs

How the script works:

dpkg-scanpackages analiza todos los paquetes en mydebs, y la salida se comprime y se escribe en un archivo (Packages.gz) que puede leer apt-get update (consulte a continuación una referencia que explica esto con un detalle insoportable). / dev / null es un archivo vacío; es un sustituto de un archivo de anulación que contiene información adicional sobre los paquetes, que en este caso no es realmente necesaria. Vea deb-override (5) si quiere saberlo.

Fuentes.lista

agrega la línea

deb file:/usr/local/mydebs ./

a su /etc/apt/sources.list, y ya está.

Opción de CD

Puede grabar el directorio que contiene las debs en un CD y usarlo también como repositorio (bueno para compartir entre computadoras). Para usar el CD como repositorio, simplemente ejecute

sudo apt-cdrom add

Usando el repositorio

Siempre que coloque una nueva deb en el directorio mydebs, ejecute

sudo update-mydebs
sudo apt-get update

Ahora sus paquetes locales se pueden manipular con Synaptic, aptitude y los comandos apt: apt-get, apt-cache, etc. Cuando intente instalar apt-get, cualquier dependencia se resolverá por usted, siempre que puedan cumplirse .

Los paquetes mal hechos probablemente fallarán, pero no habrás soportado dpkg hell.


3
¿Podría explicar la sintaxis en la línea dpkg-scanpackages . /dev/null | gzip -9c > Packages.gz? Que esta /dev/nullhaciendo alli También leí la página del manual, pero no estaba del todo claro.
sayantankhan

@ blade19899 Necesito un poco de aclaración, por favor. Quiero un repositorio con solo unos pocos paquetes seleccionados, no todos los paquetes que he tocado. ¿Estoy en lo cierto de que esta técnica me dará esa habilidad? El objetivo aquí es tener un repositorio que un grupo de instalación de software pueda usar en una LAN aislada, lejos de las tentaciones para obtener lo innecesario.
Wes Miller

@WesMiller Creo que necesitas ¡Acabo de editar su publicación!
blade19899

@ blade19899 Lo siento, no entiendo tu respuesta.
Wes Miller

@WesMiller necesitas BigSack Acabo de editar su publicación para problemas de gramática (creo que es un momento) esta no es mi respuesta, pero BigSack es
blade19899

41

* Para hacer un repositorio fuera de línea a través de LAN * Instalar un servidor

web local Apache

# apt-get install apache2

Por defecto, el paquete Apache de Debian configurará un sitio web /var/wwwen su sistema. Para nuestros propósitos, está bien, así que no hay razón para hacer nada más. Puede probarlo fácilmente apuntando a su navegador favorito http://localhost. Debería ver la página web predeterminada posterior a la instalación que en realidad está almacenada en /var/www/index.html


Crear un directorio de repositorio de paquetes de Debian

elegido para crear un directorio/var/www/debspara esto. Debajo, debe crear directorios de "arquitectura", uno para cada arquitectura que necesite admitir. Si está usando una sola computadora (o tipo de computadora), entonces solo necesitará una, generalmente "i386" para sistemas de 32 bits o "amd64" para 64 bits. Si está utilizando alguna otra arquitectura, supongo que probablemente ya lo sepa. Ahora solo copie los archivos de paquete ".deb" para una arquitectura dada en los directorios apropiados. Si ahora apunta su navegador web favorito http://localhost/debs/amd64(por ejemplo) verá una lista de los paquetes para sistemas de 64 bits.


Crear un archivo Packages.gz

Ahora necesitamos crear un archivo de catálogo para que APT lo use. Esto se hace con una utilidad llamada "dpkg-scanpackages". Aquí'

# cd /var/www/debs/

# dpkg-scanpackages amd64 | gzip -9c > amd64/Packages.gz




Dar a conocer el repositorio a APT

Ahora, lo único que queda por hacer es informar a APT sobre su repositorio. Para ello, actualice su archivo /etc/apt/sources.list. Necesitarás una entrada como esta:

deb http://localhost/debs/ amd64/

Utilicé el nombre de host real de mi sistema en lugar de localhost; de esta manera, el código es el mismo para todas las computadoras en mi LAN, pero localhost funcionará bien si está ejecutando solo una computadora.
Ahora, actualice APT:

# apt-get update

2
Agregar esa línea a /etc/apt/sources.list interrumpirá las actualizaciones cuando no esté en la LAN, ¿no?
Felix

2
Para Ubuntu 16.04, es posible que deba reemplazar /var/www/debsen esta respuesta con /var/www/html/debs. O necesitará pasos adicionales para editar manualmente su configuración de apache en/etc/apache2
Erik

18

Crear un repositorio autenticado

He echado un vistazo a las respuestas aquí y en otros sitios y la mayoría tiene la desventaja (en mi humilde opinión) de que está configurando un repositorio no autenticado. Esto significa que necesita para funcionar apt-getcon la --allow-unauthenticatedinstalación de paquetes de la misma. Esto puede ser un riesgo de seguridad, especialmente en los scripts donde los paquetes que está instalando pueden no ser todos de su repositorio local.

Tenga en cuenta que no he cubierto aquí cómo hacerlo disponible a través de LAN, pero esa es una configuración bastante genérica usando Apache o nginx (vea las otras respuestas aquí).

Configurar el directorio repo

mkdir /home/srv/packages/local-xenial
cd /home/srv/packages/local-xenial

Luego agregue una línea como esta para sources.list:

deb file:/home/srv/packages/local-xenial/ ./

Agregar y quitar paquetes

eliminar paquetes

rm /home/srv/packages/local-xenial/some_package_idont_like

agregar paquetes

cp /some/dir/apackage.deb /home/srv/packages/local-xenial

ahora ejecute el siguiente script que genera los archivos Paquetes, Release e InRelease y los firma con su clave privada gpg:

#!/bin/bash

if [ -z "$1" ]; then
       echo -e "usage: `basename $0` DISTRO
where DISTRO is the Ubuntu version codename (e.g. 14.04 is trusty)\n
The way to use this script is to do the changes to the repo first, i.e. delete or copy in the .deb file to /srv/packages/local-DISTRO, and then run this script\n
This script can be run as an unprivileged user - root is not needed so long as your user can write to the local repository directory"
else
    cd /srv/packages/local-"$1"

    # Generate the Packages file
    dpkg-scanpackages . /dev/null > Packages
    gzip --keep --force -9 Packages

    # Generate the Release file
    cat conf/distributions > Release
    # The Date: field has the same format as the Debian package changelog entries,
    # that is, RFC 2822 with time zone +0000
    echo -e "Date: `LANG=C date -Ru`" >> Release
    # Release must contain MD5 sums of all repository files (in a simple repo just the Packages and Packages.gz files)
    echo -e 'MD5Sum:' >> Release
    printf ' '$(md5sum Packages.gz | cut --delimiter=' ' --fields=1)' %16d Packages.gz' $(wc --bytes Packages.gz | cut --delimiter=' ' --fields=1) >> Release
    printf '\n '$(md5sum Packages | cut --delimiter=' ' --fields=1)' %16d Packages' $(wc --bytes Packages | cut --delimiter=' ' --fields=1) >> Release
    # Release must contain SHA256 sums of all repository files (in a simple repo just the Packages and Packages.gz files)
    echo -e '\nSHA256:' >> Release
    printf ' '$(sha256sum Packages.gz | cut --delimiter=' ' --fields=1)' %16d Packages.gz' $(wc --bytes Packages.gz | cut --delimiter=' ' --fields=1) >> Release
    printf '\n '$(sha256sum Packages | cut --delimiter=' ' --fields=1)' %16d Packages' $(wc --bytes Packages | cut --delimiter=' ' --fields=1) >> Release

    # Clearsign the Release file (that is, sign it without encrypting it)
    gpg --clearsign --digest-algo SHA512 --local-user $USER -o InRelease Release
    # Release.gpg only need for older apt versions
    # gpg -abs --digest-algo SHA512 --local-user $USER -o Release.gpg Release

    # Get apt to see the changes
    sudo apt-get update
fi

Contenido de ejemplo del archivo conf / distributions

Origin: My_Local_Repo Label: My_Local_Repo Codename: xenial Architectures: i386 amd64 Components: main Description: My local APT repository SignWith: 12345ABC

Enlaces

https://wiki.debian.org/RepositoryFormat

http://ubuntuforums.org/showthread.php?t=1090731

https://help.ubuntu.com/community/CreateAuthenticatedRepository


@Phillip usó su edición date -Rc, la corregí date -Ruasumiendo que eso es lo que quería decir de la descripción de la edición
muru

Gracias, recientemente comencé a recibir advertencias de apt sobre esto debido a la fecha generada en el TZ local y no en el UTC. Lo arreglé en mi propio script, pero olvidé editarlo aquí
happyskeptic

1
@KevinJohnson He actualizado la respuesta principal ahora con un ejemplo de ese archivo de mi repositorio local de apt
happyskeptic el

8

También puede configurar el servidor de origen local mediante nginx y reprogramar:

  1. Instalar paquetes debian

    sudo apt-get install reprepro nginx 
    
  2. crear directorios para reprogramar y editarlo

    sudo mkdir -p /srv/reprepro/ubuntu/{conf,dists,incoming,indices,logs,pool,project,tmp}
    
    $ cd /srv/reprepro/ubuntu/
    $ sudo chown -R `whoami` . # changes the repository owner to the current user
    

    / srv / reprepro / ubuntu / conf / distributions

    Origin: Your Name
    Label: Your repository name
    Codename: karmic
    Architectures: i386 amd64 source
    Components: main
    Description: Description of repository you are creating
    SignWith: YOUR-KEY-ID
    

    / srv / reprepro / ubuntu / conf / options

    ask-passphrase
    basedir .
    
  3. Inclúyalo en reprepro, compílelo

    $ reprepro includedeb karmic /path/to/my-package_0.1-1.deb \
    # change /path/to/my-package_0.1-1.deb to the path to your package
    
  4. Config nginx:

    /etc/nginx/sites-available/vhost-packages.conf

    server {
      listen 80;
      server_name packages.internal;
    
      access_log /var/log/nginx/packages-access.log;
      error_log /var/log/nginx/packages-error.log;
    
      location / {
        root /srv/reprepro;
        index index.html;
      }
    
      location ~ /(.*)/conf {
        deny all;
      }
    
      location ~ /(.*)/db {
        deny all;
      }
    }
    
  5. Optimizar el tamaño del cubo:

    /etc/nginx/conf.d/server_names_hash_bucket_size.conf

    server_names_hash_bucket_size 64;
    

Referencia al enlace de la guía de instalación


44
Si bien esto puede responder teóricamente la pregunta, sería preferible incluir aquí las partes esenciales de la respuesta y proporcionar el enlace para referencia.
gertvdijk

@elprup: debe haber olvidado actualizar esa respuesta :)
0xC0000022L

reprepor no es compatible con múltiples versiones del mismo paquete. Suena extraño, pero así es como funciona
reprepro

6

Es posible que desee echar un vistazo a apt-mirrory apt-cacher.

Aquí hay una guía sobre cómo instalarlo y usarlo.


Una respuesta tuya de 5 años se está marcando como LQ. Si se eliminaría, vaya a meta y solicite una recuperación. ¡Voté por mantenerme abierto , pero necesita una edición! ;-)
Fabby

5

Las instrucciones en la respuesta de @ BigSack y la publicación wiki oficial de Ubuntu no me funcionaron en Ubuntu 18.04, hasta que hice estos dos cambios:

  1. Genere un Packagesarchivo sin comprimir (al ejecutar esto, el directorio de trabajo debe estar donde se encuentran todos los paquetes)

    cd /usr/local/mydebs
    dpkg-scanpackages -m . > Packages
    
  2. Agregue la siguiente entrada en /etc/apt/sources.list

    deb [trusted=yes] file:/usr/local/mydebs ./
    

4

Hay varias razones por las que puede querer crear un repositorio local. La primera es que desea ahorrar en ancho de banda si tiene varias máquinas Ubuntu para actualizar. Por ejemplo, si tuviera 25 máquinas Ubuntu que necesitaran actualizarse al menos una vez por semana, ahorraría mucho ancho de banda porque podría hacer todo menos el repositorio localmente.

La mayoría de las organizaciones tienen un ancho de banda decente para sus puertas de enlace de red, pero este ancho de banda es un bien valioso que debe usarse con prudencia.

Muchas organizaciones todavía tienen enrutadores con límites de 10 MB o 100 MB en la puerta de enlace, pero conexiones de red de 1 GB internamente, por lo que el ancho de banda podría utilizarse mejor internamente. La segunda razón para crear su propio repositorio es que puede controlar qué aplicaciones se cargan en sus máquinas Ubuntu internas.

Puede eliminar cualquier aplicación que su organización no quiera usar en la red local del repositorio que actualiza las máquinas. Aún mejor, puede crear un cuadro de prueba y probar aplicaciones y versiones antes de permitir que se implementen en su red para garantizar la seguridad y la estabilidad.

Primero tiene que configurar un espejo, para ello necesita presionar Ctrl+ Alt+ Ten su teclado para abrir la Terminal. Cuando se abra, ejecute el siguiente comando.

apt-get install apt-mirror 

Una vez que haya configurado apt-mirror, puede comenzar la descarga del repositorio con este comando.

apt-mirror /etc/apt/mirror.list 1

Sigue leyendo

1 Fuente: Crear un repositorio de Ubuntu


lo siento, el enlace está muerto
xamiro

3

Para hacer un repositorio local sin conexión
1. haga accesible un directorio (al menos por root)

sudo mkdir / var / my-local-repo

  1. copie todos los archivos deb a este directorio.
  2. escanear el directorio

sudo dpkg-scanpackages / var / my-local-repo / dev / null> / var / my-local-repo / Packages

  1. agregar el repositorio local a las fuentes

echo "archivo deb: / var / my-local-repo ./"> /tmp/my-local.list

sudo mv /tmp/my-local.list /etc/apt/sources.list.d/my-local.list

sudo apt-get update


Más o menos lo mismo también está en el wiki oficial: Repositorios / Personal - Wiki de ayuda comunitaria
sdaau

1

Traté de usar apt-rdependscomo en la respuesta seleccionada, pero cuando intenté instalar el paquete desde mi repositorio local, se quejó de la falta de dependencias.

apt-rdependsno estaba enumerando algunas de las dependencias de mi paquete. Sospecho que tiene algo que ver con el hecho, que apt-cache showmuestra múltiples registros para ello.

En cambio, solía apt-cache depends, y eso hizo el truco:

Obtener una lista recursiva de dependencias

apt-cache depends <packagename> -i --recurse

-i: dependencias importantes solamente --recurse: recursivo

Convertirlo en una lista digerible

  • Eliminar símbolos y espacios: | tr -d "|,<,>, "
  • La eliminación depende: y depende previamente: | sed -e 's/^Depends://g' | sed -e 's/^PreDepends://g'
  • Ordenar la lista: | sort
  • Solo valores únicos: | uniq > list.txt

Comando completo:

apt-cache depends <packagename> -i --recurse | tr -d "|,<,>, " | sed -e \
's/^Depends://g' | sed -e 's/^PreDepends://g' | sort | uniq > list.txt

Descargar los paquetes

for i in $( cat list.txt ); do apt-get download $i; done;

Busque los paquetes y conviértalos en Paquetes.gz

dpkg-scanpackages . /dev/null | gzip -9c > Packages.gz

1
Podría ser una buena idea para hacer referencia a lo que responde que está hablando ...
anonymous2

-1

He terminado de usar apt-mirror.

Es bueno, pero necesita tener más espacio en el disco duro, ya que se sincronizará con el servidor repos.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.