123 votes

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

J'aimerais créer mon propre référentiel local sur mon réseau local, afin que les machines du réseau puissent effectuer des mises à jour et des mises à niveau à partir de celui-ci. Je veux télécharger les paquets et les stocker sur mon serveur local afin de pouvoir effectuer des mises à jour, des mises à niveau, des installations, etc. à partir de celui-ci, sans utiliser Internet.

95voto

TCHdvlp Points 195

De la Wiki d'aide Ubuntu :

La mise en place d'un référentiel simple se fait en 4 étapes

1.Installer dpkg-dev
2. mettre les paquets dans un répertoire
3. créer un script qui va analyser les paquets et créer un fichier qu'apt-get update peut lire.
4. Ajoutez une ligne à votre sources.list pointant vers votre dépôt

Installer dpkg-dev

Tapez dans un terminal

sudo apt-get install dpkg-dev

L'annuaire

Créez un répertoire où vous conserverez vos paquets. Pour cet exemple, nous utiliserons /usr/local/mydebs.

sudo mkdir -p /usr/local/mydebs

Déplacez maintenant vos paquets dans le répertoire que vous venez de créer.

Les paquets précédemment téléchargés sont généralement stockés sur votre système dans le répertoire suivant le site /var/cache/apt/archives répertoire. Si vous avez installé apt-cacher, vous aurez des paquets supplémentaires stockés dans son répertoire /packages dans son répertoire /packages.

Le script update-mydebs

C'est un simple trois lignes :

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

Coupez et collez ce qui précède dans gedit, et sauvegardez-le en tant que update-mydebs dans le fichier ~/bin. (le tilde '~' signifie votre répertoire personnel. Si ~/bin n'existe pas n'existe pas, créez-le : Ubuntu mettra ce répertoire dans votre PATH. C'est un bon endroit pour mettre des scripts personnels). Ensuite, rendez le scripts exécutable :

chmod u+x ~/bin/update-mydebs

How the script works:

dpkg-scanpackages examine tous les paquets de mydebs, et la sortie est compressée et écrite dans un fichier (Packages.gz) qu'apt-get update peut lire (voir ci-dessous pour une référence qui explique cela en détails). /dev/null est un fichier vide ; c'est un substitut d'un fichier d'un fichier de remplacement qui contient des informations supplémentaires sur les paquets. paquets, ce qui n'est pas vraiment nécessaire dans ce cas. Voir deb-override(5) si vous voulez en savoir plus.

Sources.list

ajouter la ligne

deb file:/usr/local/mydebs ./

à votre /etc/apt/sources.list, et vous avez terminé.

Option CD

Vous pouvez graver le répertoire contenant les debs sur un CD et l'utiliser en tant que et l'utiliser également comme référentiel (idéal pour le partage entre ordinateurs). Pour utiliser le comme référentiel, exécutez simplement

sudo apt-cdrom add

Utilisation du référentiel

Chaque fois que vous mettez un nouveau deb dans le répertoire mydebs, exécutez

sudo update-mydebs
sudo apt-get update

Maintenant, vos paquets locaux peuvent être manipulés avec Synaptic, aptitude et les commandes apt : apt-get, apt-cache, etc. Lorsque vous essayez de faire un apt-get d'installer, toutes les dépendances seront résolues pour vous, tant qu'elles peuvent être satisfaites.

Les paquets mal faits échoueront probablement, mais vous n'aurez pas enduré l'enfer de dpkg.

45voto

* Pour créer un dépôt hors ligne sur le réseau local *.

Installer un serveur web Apache local

# apt-get install apache2

Par défaut, le paquet Apache de Debian configurera un site web sous /var/www sur votre système. Pour nos besoins, c'est très bien, il n'y a donc aucune raison de faire quelque chose de plus. Vous pouvez facilement le tester en faisant pointer votre navigateur préféré sur http://localhost Vous devriez voir la page web de post-installation par défaut qui est en fait stockée dans le fichier /var/www/index.html

Créer un répertoire du dépôt 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 que vous devez prendre en charge. Si vous n'utilisez qu'un seul ordinateur (ou type d'ordinateur), vous n'en aurez besoin que d'un seul -- typiquement "i386" pour les systèmes 32 bits ou "amd64" pour 64 bits. Si vous utilisez une autre architecture, je suppose que vous êtes déjà au courant. Il ne vous reste plus qu'à copier les fichiers de paquets ".deb" pour une architecture donnée dans les répertoires appropriés. Si vous pointez maintenant votre navigateur web préféré sur http://localhost/debs/amd64 (par exemple), vous verrez une liste des paquets pour les systèmes 64 bits.

Créer un fichier Packages.gz

Maintenant, nous devons créer un fichier de 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 LAN :

# cd /var/www/debs/

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

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

Maintenant, la seule chose qui reste à faire est de faire connaître à APT votre référentiel. Vous faites cela en mettant à 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 - de cette façon, le code est le même pour tous les ordinateurs de mon réseau local, mais localhost fera l'affaire si vous n'utilisez qu'un seul ordinateur.
Maintenant, mettez à jour APT :

# apt-get update

28voto

Paul W Homer Points 2044

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

J'ai jeté un coup d'oeil aux réponses ici et sur d'autres sites et la plupart ont le (gros IMHO) inconvénient que vous mettez en place un référentiel non authentifié. Cela signifie que vous devez exécuter apt-get con --allow-unauthenticated pour installer des paquets à partir de celui-ci. Cela peut constituer un risque pour la sécurité, notamment dans les scripts où les paquets que vous installez peuvent ne pas tous provenir de votre dépôt local.

Notez que je n'ai pas couvert ici la façon de le rendre disponible sur le réseau local, mais c'est une configuration assez générique utilisant Apache ou nginx (voir les autres réponses ici).

Configurer le répertoire repo

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 paquets

supprimer les paquets

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

ajouter des paquets

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

https://wiki.debian.org/RepositoryFormat

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

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

9voto

elprup Points 191

Vous pouvez également configurer un serveur source local par nginx et reprepro :

  1. Installer les paquets debian

    sudo apt-get install reprepro nginx 
  2. créer des répertoires pour reprepro et l'éditer

    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. L'inclure dans reprepro, le construire

    $ 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. Configurer 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 seau :

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

    server_names_hash_bucket_size 64;

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

8voto

Wowfunhappy Points 181

Les instructions dans La réponse de @BigSack y Le post officiel du wiki d'Ubuntu ne fonctionnait pas pour moi sur Ubuntu 18.04, jusqu'à ce que je fasse ces deux changements :

  1. Générer un fichier simple, non compressé Packages (lors de l'exécution de ce fichier, le répertoire de travail doit être l'endroit où se trouvent tous les paquets)

    cd /usr/local/mydebs
    dpkg-scanpackages -m . > Packages
  2. Ajoutez l'entrée suivante dans /etc/apt/sources.list

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

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X