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

103

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.

grooveplex
la source
2
Duplication possible: askubuntu.com/questions/974/…
stephenmyall le
3
Je ne pense pas que ce soit un doublon. Ce que maythux veut accomplir, c'est créer son propre serveur de référentiel à utiliser avec aptitude. Keryx remplace aptitude en tant que gestionnaire de paquets et crée des sources externes pour les paquets.
con-f-use

Réponses:

80

À partir du wiki d'aide Ubuntu :

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

1.Installez dpkg-dev
2.Placez les packages dans un répertoire
3.Créez un script qui analysera les packages et créerez un fichier que apt-get update peut lire
4. Ajoutez une ligne à votre source.list pointant vers 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 allons utiliser/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 /var/cache/apt/archivesrépertoire. 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 une référence expliquant cela de manière extrêmement détaillée). / 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, tant qu'elles peuvent être satisfaites .

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

BigSack
la source
3
Pourriez-vous expliquer la syntaxe sur la ligne dpkg-scanpackages . /dev/null | gzip -9c > Packages.gz. Que /dev/nullfait-il là J'ai lu la page de manuel aussi, mais ce n'était pas très clair.
sayantankhan
@ blade19899 J'ai besoin d'un petit éclaircissement, s'il vous plaît. Je veux un référentiel avec seulement quelques paquets sélectionnés, pas tous les paquets que j'ai jamais touchés. Ai-je raison de penser que cette technique me donnera cette capacité? L'objectif ici est de disposer d'un référentiel qu'un groupe d'installation de logiciels peut utiliser sur un réseau local isolé, loin des tentations d'apt-get les inutiles.
Wes Miller
@WesMiller Je pense que tu as besoin je viens de modifier son post!
blade19899
@ blade19899 Je suis désolé, je ne comprends pas votre réponse.
Wes Miller
@WesMiller u besoin de BigSack Je viens de modifier son message pour les problèmes de grammaire (je pense que c'est un peu le casier), ce n'est pas ma réponse, mais celle de
BigSack
41

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

Installez un serveur Web Apache local

# apt-get install apache2

Par défaut, le paquet Apache de Debian créera un site Web sous /var/wwwsur 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 sur votre navigateur favori. http://localhostVous devriez voir la page Web de post-installation par défaut qui est actuellement stockée dans /var/www/index.html


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

choisi pour créer un répertoire./var/www/debspour ça. 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’en aurez alors 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 vers 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 pourra utiliser. Ceci est fait avec un utilitaire appelé "dpkg-scanpackages". Ici'

# cd /var/www/debs/

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




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

Il ne reste plus 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

la source
2
Ajouter cette ligne à /etc/apt/sources.list interrompra les mises à jour si vous ne vous trouvez pas sur le réseau local, n'est-ce pas?
Felix
2
Pour Ubuntu 16.04, vous devrez peut-être remplacer /var/www/debsdans cette réponse par /var/www/html/debs. Ou vous aurez besoin d'étapes supplémentaires pour éditer manuellement votre configuration d'Apache dans/etc/apache2
Erik
18

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-getavec --allow-unauthenticatedpour installer des 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).

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 packages

enlever 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

Maintenant, lancez 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

https://wiki.debian.org/RepositoryFormat

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

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

heureux sceptique
la source
@Phillip votre modification utilisée date -Rc, je l'ai corrigée en date -Rusupposant que c'est ce que vous entendiez par la description de la modification
muru
Merci, j'ai récemment commencé à recevoir des avertissements d'apt à ce sujet en raison de la date générée se trouvant dans la zone TZ locale et non de l'heure UTC. Je l'ai corrigé dans mon propre script mais j'oublie de l'éditer ici
happyskeptic
1
@KevinJohnson J'ai mis à jour la réponse principale maintenant avec un exemple de ce fichier de mon rapport d'apt local
happyskeptic
8

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 au lien du guide d'installation

elprup
la source
4
Bien que cela puisse théoriquement répondre à la question, il serait préférable d’inclure ici les parties essentielles de la réponse et de fournir le lien à titre de référence.
gertvdijk
@elprup: vous devez avoir oublié de mettre à jour cette réponse :)
0xC0000022L
reprepor ne prend pas en charge plusieurs versions du même package. Cela semble étrange, mais c’est ainsi que fonctionne
reprepro
6

Vous voudrez peut-être jeter un coup d'œil sur apt-mirroret apt-cacher.

Voici un guide sur la façon de l’installer et de l’utiliser.

embrouiller
la source
Une de vos réponses datant de 5 ans est désignée par LQ. Si cela devait être supprimé, allez à la méta et demandez-lui un undelete. J'ai voté pour rester ouvert , mais il faut une édition! ;-)
Fabby
5

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

  1. Générer un Packagesfichier brut, non compressé (lors de l'exécution, le répertoire de travail doit être où se trouvent tous les packages)

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

    deb [trusted=yes] file:/usr/local/mydebs ./
    
Wowfunhappy
la source
4

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 les touches Ctrl+ et Alt+ Tde 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.list 1

Continuer à lire

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

Mitch
la source
désolé, le lien est mort
xamiro
3

Pour créer un référentiel local hors ligne
1. rendez 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-repo-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


la source
La même chose est plus ou moins la même chose sur le wiki officiel: Repositories / Personal - Wiki d'Aide de la Communauté
sdaau
1

J'ai essayé d'utiliser apt-rdependscomme 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-rdependsne listait pas certaines des dépendances de mon paquet. Je suppose que cela a quelque chose à voir avec le fait, qui apt-cache showmontre plusieurs enregistrements pour cela.

Au lieu de cela j'ai utilisé apt-cache depends, et cela a fait le tour:

Obtenir une liste récursive de dépendances

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

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

Faites-en une liste digeste

  • Suppression des symboles et des espaces: | tr -d "|,<,>, "
  • Suppression dépend: & pré-dépendances: | 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 forfaits

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
Simon
la source
1
Peut-être une bonne idée de faire référence à la réponse dont vous parlez ...
anonymous2
-1

J'ai fait en utilisant apt-mirror.

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

chenille
la source