web-dev-qa-db-fra.com

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

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 de pouvoir les mettre à jour, mettre à niveau, installer, etc. sans utiliser Internet.

100
user61928

* 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 configurera un site Web sous /var/www sur votre système. Pour notre propos, 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 s'afficher, elle-même stockée dans /var/www/index.html.


Créez 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 n'utilisez qu'un seul ordinateur (ou type d'ordinateur), vous n'en aurez besoin que d'un seul: 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. 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 que APT peut utiliser. 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 n'exécutez qu'un seul ordinateur.
Maintenant, mettez à jour APT:

# apt-get update
41
user61928

Depuis le wiki d'aide Ubunt :

Il y a 4 étapes pour créer un référentiel simple pour vous-même

1.Installer dpkg-dev
2. Mettez les paquets dans un répertoire
3.Créez un script qui analysera les paquets et créera un fichier que apt-get update peut lire
4. Ajouter une ligne à votre sources.list pointant sur votre référentiel

Installez dpkg-dev

Tapez un terminal

Sudo apt-get install dpkg-dev

Le répertoire

Créez un répertoire dans lequel vous garderez vos paquets. Pour cet exemple, nous utiliserons /usr/local/mydebs.

Sudo mkdir -p /usr/local/mydebs

Maintenant, déplacez vos paquets dans le répertoire que vous venez de créer.

Les packages précédemment téléchargés sont généralement stockés sur votre système dans le répertoire /var/cache/apt/archives. Si vous avez installé apt-cacher, vous aurez des paquets supplémentaires stockés 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, puis enregistrez-le sous update-mydebs dans ~/bin. (Le tilde '~' signifie votre répertoire personnel. Si ~/bin 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 script exécutable:

chmod u+x ~/bin/update-mydebs

How the script works:

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

Sources.list

ajouter la ligne

deb file:/usr/local/mydebs ./

sur 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 également comme référentiel (idéal pour le partage entre ordinateurs). Pour utiliser le CD en tant que référentiel, lancez simplement

Sudo apt-cdrom add

Utiliser le référentiel

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

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 d'installer apt-get, toutes les dépendances seront résolues pour vous, à condition qu'elles puissent être satisfaites. .

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

79
BigSack

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

J'ai jeté un coup d'œil aux réponses ici et sur d'autres sites et la plupart ont le désavantage (grand IMHO) de configurer 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 constituer 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 c’est une configuration assez générique utilisant Apache ou nginx (voir les autres réponses ici).

Configurez le répertoire du dépôt

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

supprime les packages

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

ajoute des packages

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

lance 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

15
happyskeptic

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

  1. Installer les paquets Debian

    Sudo apt-get install reprepro nginx 
    
  2. faire 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 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

8
elprup

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

Voici un guide sur comment installer et l'utiliser.

5
con-f-use

Il est possible que vous souhaitiez créer un référentiel local pour plusieurs raisons. La première est que vous souhaitez économiser sur la bande passante si vous devez mettre à jour plusieurs machines Ubuntu. Par exemple, si vous avez 25 machines Ubuntu devant toutes être mises à jour au moins une fois par semaine, vous économiserez beaucoup de bande passante, car vous pourriez tout faire localement, à l'exception du référentiel.

La plupart des organisations ont une bande passante décente pour leurs passerelles réseau, mais cette bande passante est un produit précieux qui doit être utilisé à bon escient.

De nombreuses entreprises ont toujours des routeurs avec des limites de 10 ou 100 Mo au niveau de la passerelle, mais des connexions réseau de 1 Go en interne afin d'optimiser l'utilisation de la bande passante en interne. La deuxième raison de la création de votre propre référentiel est que vous pouvez contrôler les applications chargées sur vos machines Ubuntu internes.

Vous pouvez supprimer toutes les applications que votre organisation ne souhaite pas utiliser sur le réseau local du référentiel qui met à jour les ordinateurs. Mieux encore, vous pouvez créer une boîte de test et tester des applications et des versions avant de les autoriser à se déployer sur votre réseau, garantissant sécurité et stabilité.

Vous devez d’abord installer un miroir. Pour ce faire, il vous suffit d’appuyer sur Ctrl+Alt+T sur votre clavier pour ouvrir Terminal. Quand il s'ouvre, lancez la commande ci-dessous.

apt-get install apt-mirror 

Une fois que vous avez configuré apt-mirror, vous pouvez lancer le téléchargement du référentiel avec cette commande.

apt-mirror /etc/apt/mirror.list1

Lire la suite

1 Source: créer un référentiel Ubunt

4
Mitch

Les instructions dans réponse de BigSack et publication officielle sur le wiki d'Ubunt ne fonctionnaient pas pour moi sur Ubuntu 18.04, jusqu'à ce que je fasse ces deux modifications:

  1. Générez un fichier Packages simple et non compressé (lors de l’exécution de ce dernier, le répertoire de travail doit être là où se trouvent tous les packages).

    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 ./
    
4
Wowfunhappy

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

Sudo mkdir/var/mon-local-repo

  1. copier tous les fichiers deb dans ce répertoire.
  2. scanner le répertoire

Sudo dpkg-scanpackages/var/mon-rep-local/dev/null>/var/mon-rep-local/Packages

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

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

3
user61928

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 montre plusieurs enregistrements pour cela.

Au lieu de cela, j'ai utilisé apt-cache depends, et c'est ce qui a joué:

Obtenir une liste récursive de dépendances

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

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

le transformer en une liste digestible

  • Suppression des symboles et des espaces: | tr -d "|,<,>, "
  • Supprimer Depends: & PreDepends: | sed -e 's/^Depends://g' | sed -e 's/^PreDepends://g'
  • Tri de la liste: | sort
  • Seules des 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 paquets et les transformer en packages.gz

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