Come creare un repository APT locale?


103

Vorrei creare il mio repository locale sulla mia LAN, in modo che le macchine sulla LAN possano aggiornarsi e aggiornarsi da esso. Voglio scaricare i pacchetti e archiviarli sul mio server locale in modo da poter aggiornare, aggiornare, installare, ecc. Da esso senza utilizzare Internet.



3
Non penso sia un duplicato. Ciò che Maythux vuole realizzare è creare il proprio server di repository da usare con aptitude. Quello che fa Keryx è sostituire aptitude come gestore dei pacchetti e creare fonti esterne per i pacchetti.
con-f-use

Risposte:


80

Dalla wiki della Guida di Ubuntu :

Ci sono 4 passaggi per impostare un repository semplice per te

1.Installare dpkg-dev
2.Mettere i pacchetti in una directory
3.Creare uno script che scansionerà i pacchetti e creerà un file apt-get update può leggere
4. Aggiungi una linea al tuo sources.list che punta al tuo repository

Installa dpkg-dev

Digita un terminale

sudo apt-get install dpkg-dev

La directory

Crea una directory dove manterrai i tuoi pacchetti. Per questo esempio, useremo/usr/local/mydebs.

sudo mkdir -p /usr/local/mydebs

Ora sposta i tuoi pacchetti nella directory che hai appena creato.

I pacchetti precedentemente scaricati vengono generalmente memorizzati sul tuo sistema nella /var/cache/apt/archivesdirectory. Se hai installato apt-cacher avrai dei pacchetti aggiuntivi memorizzati nella sua directory / pacchetti.

Lo script update-mydebs

Sono tre semplici linee:

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

Taglia e incolla quanto sopra in gedit e salvalo come update-mydebs in ~ / bin. (la tilde '~' indica la tua home directory. Se ~ / bin non esiste, creala: Ubuntu inserirà quella directory nel tuo PERCORSO. È un buon posto per inserire script personali). Quindi, rendere eseguibile lo script:

chmod u+x ~/bin/update-mydebs

How the script works:

dpkg-scanpackages esamina tutti i pacchetti in mydebs e l'output viene compresso e scritto in un file (Packages.gz) che apt-get update può leggere (vedi sotto per un riferimento che spiega questo in modo estremamente dettagliato). / dev / null è un file vuoto; è un sostituto di un file di sostituzione che contiene alcune informazioni aggiuntive sui pacchetti, che in questo caso non sono realmente necessarie. Vedi deb-override (5) se vuoi saperlo.

sources.list

aggiungi la linea

deb file:/usr/local/mydebs ./

nel tuo /etc/apt/sources.list e il gioco è fatto.

Opzione CD

Puoi masterizzare la directory contenente i debs su un CD e usarlo anche come repository (buono per la condivisione tra computer). Per usare il CD come repository, esegui semplicemente

sudo apt-cdrom add

Utilizzando il repository

Ogni volta che inserisci un nuovo deb nella directory mydebs, esegui

sudo update-mydebs
sudo apt-get update

Ora i tuoi pacchetti locali possono essere manipolati con Synaptic, aptitude e i comandi apt: apt-get, apt-cache, ecc. Quando tenti di apt-get install, tutte le dipendenze verranno risolte per te, purché possano essere soddisfatte .

I pacchetti mal realizzati probabilmente falliranno, ma non avrai resistito all'inferno di dpkg.


3
Potresti spiegare la sintassi sulla linea dpkg-scanpackages . /dev/null | gzip -9c > Packages.gz. Cosa /dev/nullci fa li. Ho letto anche la pagina man, ma non era abbastanza chiaro.
sayantankhan,

@ blade19899 Ho bisogno di un piccolo chiarimento, per favore. Voglio un repository con solo alcuni pacchetti selezionati, non tutti i pacchetti che abbia mai toccato. Ho ragione che questa tecnica mi darà quell'abilità? L'obiettivo qui è quello di avere un repository che un gruppo di installazione di software può usare su una LAN isolata, lontano dalle tentazioni di recuperare i non necessari.
Wes Miller,

@WesMiller Penso che tu abbia bisogno di aver appena modificato il suo post!
blade19899,

@ blade19899 Mi dispiace, non capisco la tua risposta.
Wes Miller,

@WesMiller hai bisogno di BigSack Ho appena modificato il suo post per problemi di grammatica (penso che sia un po 'scomodo) questa non è la mia risposta, ma BigSack's
blade19899

41

* Per creare un repository offline su LAN *

Installare un server web Apache locale

# apt-get install apache2

Per impostazione predefinita, il pacchetto Apache di Debian creerà un sito Web /var/wwwsul proprio sistema. Per i nostri scopi, va bene, quindi non c'è motivo di fare altro. Puoi facilmente testarlo puntando il tuo browser preferito su http://localhostDovresti vedere la pagina web di post-installazione predefinita che è effettivamente memorizzata in /var/www/index.html


Crea una directory di repository di pacchetti Debian

scelta per creare una directory/var/www/debsper questo. Sotto di esso, è necessario creare directory di "architettura", una per ogni architettura che è necessario supportare. Se stai utilizzando un solo computer (o tipo di computer), ne avrai bisogno solo uno, in genere "i386" per sistemi a 32 bit o "amd64" per 64 bit. Se stai usando qualche altra architettura, suppongo che probabilmente già lo sai. Ora basta copiare i file del pacchetto ".deb" per una data architettura nelle directory appropriate. Se ora punti il ​​tuo browser preferito http://localhost/debs/amd64(ad esempio) vedrai un elenco dei pacchetti per i sistemi a 64 bit.


Creare un file Packages.gz

Ora dobbiamo creare un file catalogo da utilizzare per APT. Questo viene fatto con un'utilità chiamata "dpkg-scanpackages". Qui'

# cd /var/www/debs/

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




Rendi noto il repository ad APT

Ora l'unica cosa che resta da fare è far sapere ad APT il tuo repository. Puoi farlo aggiornando il tuo file /etc/apt/sources.list. Avrai bisogno di una voce come questa:

deb http://localhost/debs/ amd64/

Ho usato il nome host effettivo del mio sistema invece di localhost - in questo modo il codice è lo stesso per tutti i computer sulla mia LAN, ma localhost andrà benissimo se stai utilizzando un solo computer.
Ora aggiorna APT:

# apt-get update

2
L'aggiunta di quella linea a /etc/apt/sources.list interromperà gli aggiornamenti quando non si trova nella LAN, non è vero?
Felix,

2
Per Ubuntu 16.04, potrebbe essere necessario sostituire /var/www/debsquesta risposta con /var/www/html/debs. Oppure avrai bisogno di ulteriori passaggi per modificare manualmente la configurazione di apache in/etc/apache2
Erik

18

Creazione di un repository autenticato

Ho dato un'occhiata alle risposte qui e su altri siti e la maggior parte ha lo svantaggio (IMHO grande) che stai configurando un repository non autenticato. Ciò significa che è necessario eseguire apt-getcon --allow-unauthenticatedper installare i pacchetti da esso. Questo può essere un rischio per la sicurezza, specialmente negli script in cui i pacchetti che stai installando potrebbero non provenire tutti dal tuo repository locale.

Nota che non ho spiegato qui come renderlo disponibile sulla LAN, ma questa è una configurazione abbastanza generica usando Apache o nginx (vedi le altre risposte qui).

Imposta la directory repo

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

Quindi aggiungi una riga come questa a sources.list:

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

Aggiunta e rimozione di pacchetti

rimuovere i pacchetti

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

aggiungere pacchetti

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

ora esegui il seguente script che genera i file Packages, Release e InRelease e li firma con la tua chiave privata 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

Esempio Contenuto del file conf / distributions

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

link

https://wiki.debian.org/RepositoryFormat

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

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


@Fillip usato per la tua modifica date -Rc, l'ho corretto date -Rusupponendo che fosse quello che volevi dire dalla descrizione della modifica
muru,

Grazie, solo di recente ho iniziato a ricevere avvisi da apt su questo a causa della data generata nella TZ locale e non in UTC. Ho risolto il problema con la mia sceneggiatura, ma ho dimenticato di modificarlo qui
happyskeptic,

1
@KevinJohnson Ho aggiornato la risposta principale ora con un esempio di quel file dal mio repository apt locale
happyskeptic

8

È inoltre possibile configurare il server di origine locale da nginx e reprepro:

  1. Installa i pacchetti debian

    sudo apt-get install reprepro nginx 
    
  2. crea delle directory per reprepro e modificale

    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 / distribuzioni

    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 / opzioni

    ask-passphrase
    basedir .
    
  3. Includilo in reprepro, crealo

    $ 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. Ottimizza la dimensione della benna:

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

    server_names_hash_bucket_size 64;
    

Riferimento al link della guida all'installazione


4
Sebbene ciò possa teoricamente rispondere alla domanda, sarebbe preferibile includere qui le parti essenziali della risposta e fornire il collegamento come riferimento.
gertvdijk,

@elprup: devi aver dimenticato di aggiornare quella risposta :)
0xC0000022L

reprepor non supporta più versioni dello stesso pacchetto. Sembra strano, ma è così che funziona
reprepro

6

Potresti voler dare un'occhiata a apt-mirrore apt-cacher.

Ecco una guida su come installarlo e usarlo.


Una tua risposta di 5 anni viene contrassegnata come LQ. Se verrà eliminato, vai su meta e richiedi un ripristino. Ho votato per tenermi aperto , ma ha bisogno di una modifica! ;-)
Fabby,

5

Le istruzioni nella risposta di @ BigSack e nel post wiki ufficiale di Ubuntu non hanno funzionato per me su Ubuntu 18.04, fino a quando non ho apportato queste due modifiche:

  1. Genera un Packagesfile semplice, non compresso (quando si esegue questo, la directory di lavoro deve trovarsi dove si trovano tutti i pacchetti)

    cd /usr/local/mydebs
    dpkg-scanpackages -m . > Packages
    
  2. Aggiungi la seguente voce in /etc/apt/sources.list

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

4

Esistono diversi motivi per cui potresti voler creare un repository locale. Il primo è che vuoi risparmiare sulla larghezza di banda se hai più macchine Ubuntu da aggiornare. Ad esempio, se avessi 25 macchine Ubuntu che necessitavano tutte dell'aggiornamento almeno una volta alla settimana, risparmierai in modo significativo la larghezza di banda perché potresti fare tutto tranne il repository localmente.

La maggior parte delle organizzazioni ha una larghezza di banda decente per i propri gateway di rete, ma questa larghezza di banda è un bene prezioso che deve essere usato con saggezza.

Molte organizzazioni hanno ancora router con limiti da 10 MB o 100 MB al gateway, ma connessioni di rete da 1 GB internamente, quindi la larghezza di banda potrebbe essere meglio utilizzata internamente. Il secondo motivo per creare il proprio repository è che puoi controllare quali applicazioni sono caricate sui tuoi computer Ubuntu interni.

È possibile rimuovere tutte le applicazioni che l'organizzazione non desidera utilizzare sulla rete locale dal repository che aggiorna i computer. Ancora meglio, è possibile creare una casella di prova e testare applicazioni e versioni prima di consentire loro di implementare la propria rete garantendo sicurezza e stabilità.

Devi prima impostare un mirror, per farlo devi solo premere Ctrl+ Alt+ Tsulla tastiera per aprire Terminale. Quando si apre, esegui il comando seguente.

apt-get install apt-mirror 

Dopo aver configurato apt-mirror, è possibile avviare il download del repository con questo comando.

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

Continuare a leggere

1 fonte: creare un repository Ubuntu


scusa, il link è morto
xamiro,

3

Per rendere un repository locale offline
1. rendere accessibile una directory (almeno per root)

sudo mkdir / var / my-local-repo

  1. copia tutti i file deb in questa directory.
  2. scansiona la directory

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

  1. aggiungere il repository locale alle fonti

echo "file 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


La stessa cosa più o meno è anche sulla wiki ufficiale: Repository / Personal - Community Help Wiki
sdaau

1

Ho provato ad usare apt-rdependscome nella risposta selezionata, ma quando ho provato ad installare il pacchetto dal mio repository locale, mi sono lamentato delle dipendenze mancanti.

apt-rdependsnon elencavo alcune delle dipendenze per il mio pacchetto. Ho il sospetto che abbia qualcosa a che fare con il fatto, che apt-cache showmostra più record per questo.

Invece ho usato apt-cache depends, e quello ha fatto il trucco:

Ottenere un elenco ricorsivo di dipendenze

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

-i: solo dipendenze importanti --recurse: ricorsivo

Trasformalo in un elenco digeribile

  • Rimozione di simboli e spazi: | tr -d "|,<,>, "
  • La rimozione dipende: & PreDepends: | sed -e 's/^Depends://g' | sed -e 's/^PreDepends://g'
  • Ordinamento dell'elenco: | sort
  • Solo valori univoci: | 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

Scarica i pacchetti

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

Cerca i pacchetti e trasformali in Packages.gz

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

1
Potrebbe essere una buona idea fare riferimento alla risposta di cui stai parlando ...
anonymous2

-1

Ho finito di usare apt-mirror.

Va bene, ma è necessario disporre di più spazio sul disco rigido in quanto si sincronizzerà con il server repository.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.