Wie erstelle ich ein lokales APT-Repository?


103

Ich möchte mein eigenes lokales Repository in meinem LAN erstellen, damit Computer im LAN es aktualisieren und aktualisieren können. Ich möchte die Pakete herunterladen und auf meinem lokalen Server speichern, damit ich sie aktualisieren, aktualisieren, installieren usw. kann, ohne das Internet zu verwenden.



3
Ich denke nicht, dass es ein Duplikat ist. Maythux möchte einen eigenen Repository-Server für aptitude erstellen. Keryx ersetzt aptitude als Paketmanager und erstellt externe Quellen für Pakete.
con-f-use

Antworten:


80

Aus dem Ubuntu-Hilfe-Wiki :

Es gibt 4 Schritte, um ein einfaches Repository für sich selbst einzurichten

1.Installieren dpkg-dev
2.Legen Sie die Pakete in ein Verzeichnis.
3.Erstellen Sie ein Skript, das die Pakete durchsucht und eine Datei erstellt, die apt-get update lesen kann.
4. Fügen Sie Ihrer sources.list eine Zeile hinzu, die auf Ihr Repository verweist

Installieren Sie dpkg-dev

Geben Sie ein Terminal ein

sudo apt-get install dpkg-dev

Das Verzeichnis

Erstellen Sie ein Verzeichnis, in dem Sie Ihre Pakete aufbewahren. In diesem Beispiel verwenden wir/usr/local/mydebs.

sudo mkdir -p /usr/local/mydebs

Verschieben Sie nun Ihre Pakete in das soeben erstellte Verzeichnis.

Zuvor heruntergeladene Pakete werden in der Regel auf Ihrem System im /var/cache/apt/archivesVerzeichnis gespeichert . Wenn Sie apt-cacher installiert haben, werden zusätzliche Pakete im Verzeichnis / packages gespeichert.

Die Script Update-Mydebs

Es ist ein einfacher Drei-Liner:

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

Schneide das oben stehende aus und füge es in gedit ein und speichere es als update-mydebs in ~ / bin. (Die Tilde '~' bedeutet Ihr Home-Verzeichnis. Wenn ~ / bin nicht existiert, erstellen Sie es: Ubuntu legt dieses Verzeichnis in Ihrem PATH ab. Es ist ein guter Ort, um persönliche Skripte abzulegen.) Als nächstes machen Sie das Skript ausführbar:

chmod u+x ~/bin/update-mydebs

How the script works:

dpkg-scanpackages untersucht alle Pakete in mydebs, und die Ausgabe wird komprimiert und in eine Datei (Packages.gz) geschrieben, die apt-get update lesen kann (siehe unten für eine ausführliche Erläuterung). / dev / null ist eine leere Datei; Es ist ein Ersatz für eine Überschreibungsdatei, die einige zusätzliche Informationen zu den Paketen enthält, die in diesem Fall nicht wirklich benötigt werden. Siehe deb-override (5), wenn Sie mehr darüber wissen möchten.

Sources.list

füge die Zeile hinzu

deb file:/usr/local/mydebs ./

zu Ihrer /etc/apt/sources.list und Sie sind fertig.

CD-Option

Sie können das Verzeichnis mit den Debs auf eine CD brennen und dieses auch als Repository verwenden (gut für die gemeinsame Nutzung zwischen Computern). Um die CD als Repository zu verwenden, führen Sie einfach aus

sudo apt-cdrom add

Verwenden des Repository

Immer wenn Sie ein neues Deb in das Mydebs-Verzeichnis legen, führen Sie es aus

sudo update-mydebs
sudo apt-get update

Jetzt können Ihre lokalen Pakete mit den Befehlen Synaptic, aptitude und apt bearbeitet werden: apt-get, apt-cache usw. Wenn Sie versuchen, apt-get zu installieren, werden alle Abhängigkeiten für Sie aufgelöst, sofern sie erfüllt werden können .

Schlecht gemachte Pakete werden wahrscheinlich scheitern, aber Sie werden die Dpkg-Hölle nicht ertragen.


3
Könnten Sie die Syntax in der Zeile erklären dpkg-scanpackages . /dev/null | gzip -9c > Packages.gz. Was ist da /dev/nulllos ? Ich habe auch die Manpage gelesen, aber es war nicht ganz klar.
sayantankhan

@ Blade19899 Ich brauche ein bisschen Klarstellung, bitte. Ich möchte ein Repository mit nur wenigen ausgewählten Paketen, nicht jedem Paket, das ich jemals berührt habe. Habe ich Recht, dass mir diese Technik diese Fähigkeit verleiht? Ziel ist es, ein Repository zu haben, das eine Softwareinstallationsgruppe in einem isolierten LAN verwenden kann, weit weg von der Versuchung, das Unnötige in den Griff zu bekommen.
Wes Miller

@WesMiller Ich glaube du brauchst ich habe gerade seinen Beitrag bearbeitet!
Blade19899

@ blade19899 Es tut mir leid, ich verstehe deine Antwort nicht.
Wes Miller

@WesMiller du brauchst BigSack Ich habe gerade seinen Beitrag für Grammatikprobleme bearbeitet (ich denke, es ist eine Weile her) Dies ist nicht meine Antwort, aber BigSacks
Blade19899

41

* So erstellen Sie ein Offline-Repository über LAN *

Installieren Sie einen lokalen Apache-Webserver

# apt-get install apache2

Standardmäßig richtet das Apache-Paket von Debian eine Website unter /var/wwwauf Ihrem System ein. Für unsere Zwecke ist das in Ordnung, es gibt also keinen Grund, mehr zu tun. Sie können es ganz einfach testen, indem Sie Ihren bevorzugten Browser auf zeigen. http://localhostSie sollten die Standard-Webseite nach der Installation sehen, die tatsächlich im /var/www/index.html


Verzeichnis

zum Erstellen eines Debian-Paket-Repository gespeichert ist, das Sie zum Erstellen eines Verzeichnisses ausgewählt haben/var/www/debsdafür. Darunter sollten Sie "Architektur" -Verzeichnisse erstellen, eines für jede zu unterstützende Architektur. Wenn Sie nur einen Computer (oder einen Computertyp) verwenden, benötigen Sie nur einen - normalerweise "i386" für 32-Bit-Systeme oder "amd64" für 64-Bit. Wenn Sie eine andere Architektur verwenden, gehe ich davon aus, dass Sie dies wahrscheinlich bereits wissen. Kopieren Sie nun einfach die ".deb" -Paketdateien für eine bestimmte Architektur in die entsprechenden Verzeichnisse. Wenn Sie jetzt beispielsweise mit Ihrem bevorzugten Webbrowser auf zeigen http://localhost/debs/amd64, wird eine Liste der Pakete für 64-Bit-Systeme angezeigt .


Erstellen einer Packages.gz-Datei

Nun müssen wir eine Katalogdatei erstellen, die APT verwenden kann. Dies geschieht mit einem Dienstprogramm namens "dpkg-scanpackages". Hier'

# cd /var/www/debs/

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




Machen Sie das Repository APT bekannt.

Jetzt müssen Sie APT nur noch über Ihr Repository informieren. Sie tun dies, indem Sie Ihre Datei /etc/apt/sources.list aktualisieren. Sie benötigen einen Eintrag wie diesen:

deb http://localhost/debs/ amd64/

Ich habe den tatsächlichen Hostnamen meines Systems anstelle von localhost verwendet. Auf diese Weise ist der Code für alle Computer in meinem LAN gleich. Localhost ist jedoch in Ordnung, wenn Sie nur einen Computer ausführen.
Aktualisieren Sie jetzt APT:

# apt-get update

2
Wenn Sie diese Zeile zu /etc/apt/sources.list hinzufügen, werden Aktualisierungen abgebrochen, wenn Sie nicht im LAN sind, nicht wahr?
Felix

2
Für Ubuntu 16.04 müssen Sie /var/www/debsin dieser Antwort möglicherweise durch ersetzen /var/www/html/debs. Oder du benötigst zusätzliche Schritte, um deine Apache-Konfiguration in/etc/apache2
Erik

18

Erstellen eines authentifizierten Repository

Ich habe mir die Antworten hier und auf anderen Websites angesehen und die meisten haben den (meiner Meinung nach großen) Nachteil, dass Sie ein nicht authentifiziertes Repository einrichten. Das heißt , Sie ausführen müssen apt-getmit --allow-unauthenticatedPaketen aus , es zu installieren. Dies kann ein Sicherheitsrisiko darstellen, insbesondere bei Skripten, bei denen die von Ihnen installierten Pakete möglicherweise nicht alle aus Ihrem lokalen Repository stammen.

Beachten Sie, dass ich hier nicht beschrieben habe, wie man es über das LAN verfügbar macht, aber das ist eine ziemlich allgemeine Konfiguration unter Verwendung von Apache oder Nginx (siehe die anderen Antworten hier).

Richten Sie das Repo-Verzeichnis ein

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

Fügen Sie dann eine Zeile wie die folgende hinzu sources.list:

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

Pakete hinzufügen und entfernen

Pakete entfernen

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

Pakete hinzufügen

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

Führen Sie nun das folgende Skript aus, das die Dateien Packages, Release und InRelease generiert und mit Ihrem privaten gpg-Schlüssel signiert:

#!/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

Beispiel Inhalt der Datei conf / distributions

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

Links

https://wiki.debian.org/RepositoryFormat

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

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


@Phillip Dein Edit wurde verwendet date -Rc, ich habe es korrigiert, um date -Ruanzunehmen, dass es das ist, was Du aus der Edit-Beschreibung gemeint hast
muru

Danke, ich habe erst kürzlich angefangen, Warnungen von apt zu erhalten, da das generierte Datum in der lokalen Zeitzone und nicht in UTC liegt. Ich habe es in meinem eigenen Skript behoben, aber vergessen, es hier zu bearbeiten
happyskeptic

1
@ KevinJohnson Ich habe die Hauptantwort jetzt mit einem Beispiel dieser Datei aus meinem lokalen
Apt

8

Sie können den lokalen Quellserver auch mit nginx und reprepro einrichten:

  1. Installieren Sie Debian-Pakete

    sudo apt-get install reprepro nginx 
    
  2. erstelle Verzeichnisse für reprepro und bearbeite sie

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

    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. Fügen Sie es in reprepro ein und erstellen Sie es

    $ 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. Eimergröße optimieren:

    /etc/nginx/conf.d/servernamen_hash_bucket_size.conf

    server_names_hash_bucket_size 64;
    

Verweis auf Install Guide Link


4
Während dies theoretisch die Frage beantworten mag, wäre es vorzuziehen , die wesentlichen Teile der Antwort hier aufzunehmen und den Link als Referenz bereitzustellen.
Gertvdijk

@elprup: Sie müssen vergessen haben, diese Antwort zu aktualisieren :)
0xC0000022L

reprepor unterstützt nicht mehrere Versionen desselben Pakets. Es hört sich seltsam an, aber so funktioniert
reprepro

6

Vielleicht möchten Sie einen Blick auf apt-mirrorund werfen apt-cacher.

Hier finden Sie eine Anleitung zur Installation und Verwendung.


Eine 5 Jahre alte Antwort von Ihnen wird als LQ gekennzeichnet. Wenn es gelöscht werden würde, gehen Sie zu Meta und fragen Sie nach einem Wiederherstellen. Ich habe dafür gestimmt , offen zu bleiben , aber es muss noch bearbeitet werden! ;-)
Fabby

5

Die Anweisungen in der Antwort von @ BigSack und in Ubuntus offiziellem Wiki-Beitrag haben unter Ubuntu 18.04 nicht funktioniert, bis ich diese beiden Änderungen vorgenommen habe:

  1. Generieren Sie eine einfache, nicht komprimierte PackagesDatei (bei der Ausführung muss sich das Arbeitsverzeichnis befinden, in dem sich alle Pakete befinden).

    cd /usr/local/mydebs
    dpkg-scanpackages -m . > Packages
    
  2. Fügen Sie den folgenden Eintrag in hinzu /etc/apt/sources.list

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

4

Es gibt verschiedene Gründe, warum Sie ein lokales Repository erstellen möchten. Das erste ist, dass Sie Bandbreite sparen möchten, wenn Sie mehrere Ubuntu-Rechner aktualisieren müssen. Wenn Sie zum Beispiel 25 Ubuntu-Rechner hatten, die alle mindestens einmal pro Woche aktualisiert werden mussten, würden Sie erheblich Bandbreite sparen, da Sie alle bis auf das Repository lokal ausführen könnten.

Die meisten Unternehmen verfügen über eine angemessene Bandbreite für ihre Netzwerk-Gateways, diese Bandbreite ist jedoch ein kostbares Gut, das mit Bedacht eingesetzt werden muss.

Viele Organisationen haben noch Router mit 10 MB oder 100 MB am Gateway, aber 1 GB Netzwerkverbindungen intern, damit die Bandbreite intern besser genutzt werden kann. Der zweite Grund für das Erstellen eines eigenen Repositorys besteht darin, dass Sie steuern können, welche Anwendungen auf Ihren internen Ubuntu-Computern geladen werden.

Sie können alle Anwendungen, die Ihre Organisation nicht im lokalen Netzwerk verwenden möchte, aus dem Repository entfernen, das die Computer aktualisiert. Noch besser ist, dass Sie eine Testbox erstellen und Anwendungen und Versionen testen können, bevor Sie sie in Ihr Netzwerk einspielen lassen, um Sicherheit und Stabilität zu gewährleisten.

Sie müssen zuerst einen Spiegel einrichten. Drücken Sie dazu einfach Ctrl+ Alt+ Tauf Ihrer Tastatur, um das Terminal zu öffnen. Führen Sie beim Öffnen den folgenden Befehl aus.

apt-get install apt-mirror 

Sobald Sie apt-mirror eingerichtet haben, können Sie mit diesem Befehl den Download des Repository starten.

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

Weiter lesen

1 Quelle: Erstellen Sie ein Ubuntu-Repository


Entschuldigung, der Link ist tot
xamiro

3

So
erstellen Sie ein lokales Offline-Repository: 1. Ermöglichen Sie den Zugriff auf ein Verzeichnis (mindestens von root).

sudo mkdir / var / my-local-repo

  1. Kopieren Sie alle Deb-Dateien in dieses Verzeichnis.
  2. Scannen Sie das Verzeichnis

sudo dpkg-scanpackages / var / mein-lokales-repo / dev / null> / var / mein-lokales-repo / Packages

  1. Fügen Sie den Quellen das lokale Repository hinzu

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


Das mehr oder weniger Gleiche gibt es auch im offiziellen Wiki: Repositories / Personal - Community Help Wiki
sdaau

1

Ich habe versucht, apt-rdependswie in der ausgewählten Antwort zu verwenden, aber als ich versuchte, das Paket von meinem lokalen Repository zu installieren, beklagte es sich über fehlende Abhängigkeiten.

apt-rdependshabe einige der Abhängigkeiten für mein Paket nicht aufgelistet. Ich vermute, es hat etwas damit zu tun, dass apt-cache showmehrere Datensätze dafür angezeigt werden.

Stattdessen habe ich verwendet apt-cache depends, und das hat den Trick gemacht:

Eine rekursive Liste der Abhängigkeiten erhalten

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

-i: nur wichtige Abhängigkeiten --recurse: rekursiv

Verwandle es in eine verdauliche Liste

  • Symbole und Leerzeichen entfernen: | tr -d "|,<,>, "
  • Entfernen von Depends: & PreDepends: | sed -e 's/^Depends://g' | sed -e 's/^PreDepends://g'
  • Liste sortieren: | sort
  • Nur eindeutige Werte: | uniq > list.txt

Vollständiger Befehl:

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

Laden Sie die Pakete herunter

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

Scannen Sie nach den Paketen und machen Sie sie zu Packages.gz

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

1
Könnte eine gute Idee sein , zu verweisen , welche Antwort Sie sprechen ...
anonymous2

-1

Ich habe Apt-Mirror verwendet.

Es ist gut, aber Sie müssen mehr Festplattenspeicher haben, da es mit dem Repos-Server synchronisiert wird.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.