Comment créer un référentiel APT local?

96

Je souhaite créer mon propre référentiel local sur mon réseau local, afin que les machines du réseau local puissent se mettre à jour et se mettre à niveau. Je souhaite télécharger les packages et les stocker sur mon serveur local afin que je puisse mettre à jour, mettre à niveau, installer, etc. sans utiliser Internet.

    
posée grooveplex 31.07.2012 - 11:15
la source

10 réponses

39

* Pour créer un référentiel hors ligne sur un réseau local *

Installer un serveur Web Apache local

# apt-get install apache2

Par défaut, le paquet Apache de Debian configure un site Web sous /var/www sur votre système. Pour nos besoins, c'est bien, il n'y a donc aucune raison de faire autre chose. Vous pouvez facilement le tester en pointant votre navigateur favori sur http://localhost . La page Web de post-installation par défaut devrait être affichée, elle-même stockée dans /var/www/index.html .


Créer un répertoire de référentiel de paquets Debian

a choisi de créer un répertoire /var/www/debs pour cela. Sous celui-ci, vous devez créer des répertoires "architecture", un pour chaque architecture à prendre en charge. Si vous utilisez un seul ordinateur (ou type d’ordinateur), vous n’avez besoin que d’un seul ordinateur - généralement «i386» pour les systèmes 32 bits ou «amd64» pour 64 bits. Si vous utilisez une autre architecture, je suppose que vous êtes probablement déjà au courant de cela. Maintenant, copiez simplement les fichiers de package ".deb" pour une architecture donnée dans les répertoires appropriés. Si vous pointez maintenant votre navigateur Web favori sur http://localhost/debs/amd64 (par exemple), vous verrez une liste des packages pour les systèmes 64 bits.


Créer un fichier Packages.gz

Nous devons maintenant créer un fichier catalogue à utiliser par APT. Ceci est fait avec un utilitaire appelé "dpkg-scanpackages". Voici les commandes que j'utilise pour mettre à jour les paquets AMD64 sur mon réseau local:

# cd /var/www/debs/

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




Faire connaître le référentiel à APT

Il ne reste maintenant qu’à informer APT de votre référentiel. Pour cela, vous devez mettre à jour votre fichier /etc/apt/sources.list. Vous aurez besoin d'une entrée comme celle-ci:

deb http://localhost/debs/ amd64/

J'ai utilisé le nom d'hôte réel de mon système au lieu de localhost. Ainsi, le code est le même pour tous les ordinateurs de mon réseau local, mais localhost fera l'affaire si vous utilisez un seul ordinateur.
Maintenant, mettez à jour APT:

# apt-get update
    
réponse donnée user61928 05.09.2012 - 14:43
la source
76

À partir du wiki de l'aide sur Ubuntu :

There are 4 steps to setting up a simple repository for yourself

1.Install dpkg-dev
2.Put the packages in a directory
3.Create a script that will scan the packages and create a file apt-get update can read
4. Add a line to your sources.list pointing at your repository

Install dpkg-dev

Type in a terminal

sudo apt-get install dpkg-dev

The Directory

Create a directory where you will keep your packages. For this example, we'll use /usr/local/mydebs.

sudo mkdir -p /usr/local/mydebs

Now move your packages into the directory you've just created.

Previously downloaded Packages are generally stored on your system in the /var/cache/apt/archives directory. If you have installed apt-cacher you will have additional packages stored in its /packages directory.

The Script update-mydebs

It's a simple three liner:

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

Cut and paste the above into gedit, and save it as update-mydebs in ~/bin. (the tilde '~' means your home directory. If ~/bin does not exist, create it: Ubuntu will put that directory in your PATH. It's a good place to put personal scripts). Next, make the script executable:

chmod u+x ~/bin/update-mydebs

How the script works:

dpkg-scanpackages looks at all the packages in mydebs, and the output is compressed and written to a file (Packages.gz) that apt-get update can read (see below for a reference that explains this in excruciating detail). /dev/null is an empty file; it is a substitute for an override file which holds some additional information about the packages, which in this case is not really needed. See deb-override(5) if you want to know about it.

Sources.list

add the line

deb file:/usr/local/mydebs ./

to your /etc/apt/sources.list, and you're done.

CD Option

You can burn the directory containing the debs to a CD and use that as a repository as well (good for sharing between computers). To use the CD as a repository, simply run

sudo apt-cdrom add

Using the Repository

Whenever you put a new deb in the mydebs directory, run

sudo update-mydebs
sudo apt-get update

Now your local packages can be manipulated with Synaptic, aptitude and the apt commands: apt-get, apt-cache, etc. When you attempt to apt-get install, any dependencies will be resolved for you, as long as they can be met.

Badly made packages will probably fail, but you won't have endured dpkg hell.

    
réponse donnée BigSack 16.08.2012 - 13:45
la source
13

Création d'un référentiel authentifié

J'ai examiné les réponses ici et sur d'autres sites et la plupart ont le désavantage (gros IMHO) que vous configurez un référentiel non authentifié. Cela signifie que vous devez exécuter apt-get avec --allow-unauthenticated pour installer les packages à partir de celui-ci. Cela peut être un risque pour la sécurité, en particulier dans les scripts où les packages que vous installez ne proviennent peut-être pas tous de votre référentiel local.

Notez que je n'ai pas expliqué ici comment le rendre disponible sur le réseau local, mais il s'agit d'une configuration assez générique utilisant Apache ou nginx (voir les autres réponses ici).

Configurez le répertoire du référentiel

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

Ajoutez ensuite une ligne comme celle-ci à sources.list :

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

Ajout et suppression de packages

supprimer les packages

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

ajouter des packages

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

exécutez maintenant le script suivant qui génère les fichiers Packages, Release et InRelease et les signe avec votre clé privée 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

Exemple de contenu du fichier conf / distributions

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

Liens

lien

lien

lien

    
réponse donnée happyskeptic 15.05.2016 - 09:33
la source
8

Vous pouvez également configurer le serveur source local avec nginx et reprepro:

  1. Installer les paquets Debian

    sudo apt-get install reprepro nginx 
    
  2. créer des répertoires pour reprepro et le modifier

    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. Incluez-le dans reprepro, construisez-le

    $ 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. Optimiser la taille du compartiment:

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

    server_names_hash_bucket_size 64;
    

Référence au Lien vers le guide d'installation

    
réponse donnée elprup 03.07.2013 - 11:18
la source
5

Vous voudrez peut-être jeter un oeil sur apt-mirror et apt-cacher .

Voici un guide sur la comment installer et l'utiliser.

    
réponse donnée con-f-use 31.07.2012 - 13:02
la source
4

There are several reasons you may want to create a local repository. The first is that you want to save on bandwidth if you have multiple Ubuntu machines to update. For example if you had 25 Ubuntu machines that all needed updating at least once a week, you would significantly save bandwidth because you could do all but the repository locally.

Most organizations have decent bandwidth for their network gateways but this bandwidth is a precious commodity that needs to be used wisely.

Many organizations still have routers with 10MB or 100MB limits at the gateway but 1 GB network connections internally so bandwidth could be better used internally. The second reason for creating your own repository is that you can control what applications are loaded on your internal Ubuntu machines.

You can remove any applications your organization does not want to use on the local network from the repository that updates the machines. Even better, you can create a test box and test applications and versions before you allow them to roll out into your network assuring security and stability.

You first have to setup a mirror, to do that you need to Just press Ctrl+Alt+T on your keyboard to open Terminal. When it opens, run the command below.

apt-get install apt-mirror 

Once you have your set up apt-mirror you can start your download of the repository with this command.

apt-mirror /etc/apt/mirror.list1

Lire la suite

1 Source: Créer un référentiel Ubuntu

    
réponse donnée Mitch 17.08.2012 - 00:29
la source
3

Pour créer un référentiel local hors connexion
1. rendre un répertoire accessible (au moins par la racine)

sudo mkdir /var/my-local-repo

  1. copie tous les fichiers deb dans ce répertoire.
  2. analyser le répertoire

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

  1. ajouter le référentiel local aux sources

echo "deb file:/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

    
réponse donnée user61928 05.09.2012 - 14:32
la source
1

J'ai essayé d'utiliser apt-rdepends comme dans la réponse sélectionnée, mais lorsque j'ai essayé d'installer le paquet à partir de mon référentiel local, il s'est plaint des dépendances manquantes.

apt-rdepends ne listait pas certaines des dépendances de mon paquet. Je suppose que cela a quelque chose à voir avec le fait que apt-cache show affiche plusieurs enregistrements pour cela.

À la place, j'ai utilisé apt-cache depends , ce qui a fait l'affaire:

Obtention d'une liste récursive de dépendances

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

-i : dépendances importantes uniquement --recurse : récursif

Transformez-le en une liste digestible

  • Suppression des symboles & espaces: | tr -d "|,<,>, "
  • Supprimer Depends: & PreDepends: | sed -e 's/^Depends://g' | sed -e 's/^PreDepends://g'
  • Tri de la liste: | sort
  • Seules les valeurs uniques: | uniq > list.txt

Commande complète:

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

Télécharger les packages

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

Rechercher les packages et les convertir en packages.gz

dpkg-scanpackages . /dev/null | gzip -9c > Packages.gz
    
réponse donnée Simon 08.06.2016 - 15:55
la source
1

Les instructions de la réponse de BigSack ci-dessus - et de la l'article original du wiki qu'il a cité - ne fonctionnait pas pour moi avant d'avoir apporté deux modifications:


1) J'ai généré un fichier plat "Packages" au lieu d'une version gzip:

dpkg-scanpackages -m . > Packages


2) J'ai ajouté [trusted=yes] à l'entrée du référentiel dans sources.list,

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


Je pense que le n ° 2 est simplement dû au fait que le wiki Ubuntu est obsolète. Je ne sais pas pourquoi le n ° 1 était nécessaire, mais comme je ne pouvais le trouver documenté nulle part ailleurs, je voulais m'assurer que la solution était accessible au public.

    
réponse donnée Wowfunhappy 28.04.2018 - 20:33
la source
-1

J'ai déjà utilisé apt-mirror.

C’est bien, mais vous devez disposer de plus d’espace sur le disque dur car il sera synchronisé avec le serveur de mise en pension.

    
réponse donnée Caterpillar 31.07.2012 - 13:25
la source

Lire d'autres questions sur les étiquettes