Vraag Hoe maak je een lokale APT-repository aan?


Ik zou graag mijn eigen lokale repository op mijn LAN willen bouwen, zodat machines op het LAN dit kunnen bijwerken en upgraden. Ik wil de pakketten downloaden en ze opslaan op mijn lokale server, zodat ik deze kan bijwerken, upgraden, installeren, enz. Zonder het internet te gebruiken.


92
2017-07-31 09:15


oorsprong


Mogelijke duplicaten:askubuntu.com/questions/974/... - stephenmyall
Ik denk niet dat het een duplicaat is. Wat maythux wil bereiken, is zijn eigen repository-server maken voor gebruik met aptitude. Wat Keryx doet is aptitude vervangen als pakketbeheerder en externe bronnen voor pakketten maken. - con-f-use
Mogelijk duplicaat? - askubuntu.com/questions/9809/... of askubuntu.com/questions/3503/... - jrg♦


antwoorden:


Van de Ubuntu Help wiki:

Er zijn 4 stappen om zelf een eenvoudige repository op te zetten

1.Install dpkg-dev
     2.Zet de pakketten in een map
     3. Maak een script waarmee de pakketten worden gescand en een bestand wordt gemaakt dat apt-get update kan lezen
     4. Voeg een regel toe aan je sources.list die naar je repository wijst

Installeer dpkg-dev

Typ een terminal

sudo apt-get install dpkg-dev

De map

Maak een map waarin u uw pakketten bewaart. Voor deze   we zullen bijvoorbeeld gebruiken /usr/local/mydebs.

sudo mkdir -p /usr/local/mydebs

Verplaats nu uw pakketten naar de map die u zojuist hebt aangemaakt.

Eerder gedownloade pakketten worden over het algemeen op uw systeem opgeslagen   de /var/cache/apt/archives directory. Als je hebt geïnstalleerd   apt-cacher: je hebt extra pakketten opgeslagen in zijn / pakketten   directory.

De script-update-mydebs

Het is een eenvoudige drie voering:

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

Knip en plak het bovenstaande in gedit en sla het op als update-mydebs in   ~ / Bin. (de tilde '~' betekent je thuismap. Als ~ / bin niet   bestaan, maak het: Ubuntu zal die map in je PATH plaatsen. Het is een   goede plek om persoonlijke scripts te plaatsen). Maak vervolgens het script uitvoerbaar:

chmod u+x ~/bin/update-mydebs

How the script works:

dpkg-scanpackages kijkt naar alle pakketten in mydebs, en de uitvoer wordt gecomprimeerd en geschreven naar een bestand (Packages.gz) dat apt-get   update kan lezen (zie hieronder voor een referentie waarin dit wordt uitgelegd   ondragelijke details). / dev / null is een leeg bestand; het is een vervanging   voor een override-bestand dat wat extra informatie bevat over de   pakketten, die in dit geval niet echt nodig zijn. Zie deb-override (5)   als je er meer over wilt weten.

sources.list

voeg de regel toe

deb file:/usr/local/mydebs ./

naar je /etc/apt/sources.list, en je bent klaar.

CD-optie

Je kunt de map met de debs naar een CD branden en die als gebruiken   een repository ook (goed voor het delen tussen computers). Om de te gebruiken   CD als een repository, gewoon uitvoeren

sudo apt-cdrom add

De repository gebruiken

Telkens als u een nieuwe deb in de mydebs-map plaatst, voert u uit

sudo update-mydebs
sudo apt-get update

Nu kunnen uw lokale pakketten worden gemanipuleerd met Synaptic, aptitude en   de apt-commando's: apt-get, apt-cache, enz. Wanneer u probeert apt-get te krijgen   installeren, afhankelijkheden worden voor u opgelost, zolang ze maar   kan worden voldaan.

Slecht gemaakte pakketten zullen waarschijnlijk falen, maar je zult het niet volgehouden hebben   dpkg hel.


73
2017-08-16 11:45



Zou je de syntaxis op de regel kunnen uitleggen? dpkg-scanpackages . /dev/null | gzip -9c > Packages.gz. Wat is /dev/null daar aan het doen. Ik las ook de man-pagina, maar het was niet helemaal duidelijk. - sayantankhan
@ blade19899 Ik heb een beetje verduidelijking nodig, alstublieft. Ik wil een repository met slechts een paar geselecteerde pakketten erin, niet elk pakket dat ik ooit heb aangeraakt. Heb ik gelijk dat deze techniek mij dat vermogen zal geven? Het doel is hier om een ​​repository te hebben die een software-installatiegroep kan gebruiken op een geïsoleerd LAN, ver weg van de verleidingen om apt-get the onnodig te krijgen. - Wes Miller
@WesMiller Ik denk dat je nodig hebt Ik heb net zijn bericht bewerkt! - blade19899
@ blade19899 Het spijt me, ik begrijp uw antwoord niet. - Wes Miller
@WesMiller je hebt BigSack nodig Ik heb net zijn post bewerkt voor grammaticale problemen (ik denk dat het een tijdje in de buidel is) dit is niet mijn antwoord, maar BigSack's - blade19899


*Een offline repository maken via LAN * 

Installeer een lokale Apache-webserver

# apt-get install apache2

Standaard zal het Apache-pakket van Debian een website opzetten onder /var/www op uw systeem. Voor onze doeleinden is dat prima, dus er is geen reden om meer te doen. U kunt het eenvoudig testen door uw favoriete browser naar te wijzen http://localhostU zou de standaard webpagina na installatie moeten zien die daadwerkelijk is opgeslagen in /var/www/index.html


Maak een Repianory Directory voor Debian-pakketten

ervoor gekozen om een ​​map te maken /var/www/debs voor deze. Daaronder zou je 'architectuur'-mappen moeten maken, één voor elke architectuur die je moet ondersteunen. Als u slechts één computer (of een ander type computer) gebruikt, hebt u er maar één nodig, meestal 'i386' voor 32-bits systemen of 'amd64' voor 64 bits. Als je een andere architectuur gebruikt, neem ik aan dat je dit waarschijnlijk al weet. Kopieer nu de ".deb" -pakketbestanden voor een gegeven architectuur naar de juiste mappen. Als u nu uw favoriete webbrowser naar verwijst http://localhost/debs/amd64 (bijvoorbeeld) u ziet een lijst van de pakketten voor 64-bits systemen.


Maak een package.gz-bestand

Nu moeten we een catalogusbestand maken dat APT kan gebruiken. Dit gebeurt met een hulpprogramma genaamd "dpkg-scanpackages". Dit zijn de opdrachten die ik gebruik om de AMD64-pakketten op mijn LAN bij te werken:

# cd /var/www/debs/

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




Maak de repository bekend aan APT

Nu is het enige wat je nog moet doen, APT op de hoogte stellen van je repository. Dit doet u door uw /etc/apt/sources.list bestand bij te werken. Je hebt een bericht zoals dit nodig:

deb http://localhost/debs/ amd64/

Ik gebruikte de eigenlijke hostnaam van mijn systeem in plaats van localhost - op deze manier is de code hetzelfde voor alle computers op mijn LAN, maar localhost doet het prima als je slechts één computer gebruikt.
Update APT nu:

# apt-get update

38
2017-09-05 12:43



Door die regel toe te voegen aan /etc/apt/sources.list worden updates verbroken als ze niet in het LAN staan, is het niet? - Felix
Voor Ubuntu 16.04 moet u mogelijk vervangen /var/www/debs in dit antwoord met /var/www/html/debs. Of u heeft extra stappen nodig om uw apache-configuratie handmatig te bewerken in /etc/apache2 - Erik


Een geauthenticeerde repository maken

Ik heb de antwoorden hier en op andere sites bekeken en de meeste hebben het (IMHO grote) nadeel dat u een niet-geverifieerde repository opzet. Dit betekent dat je moet rennen apt-get met --allow-unauthenticated om pakketten van te installeren. Dit kan een beveiligingsrisico vormen, met name in scripts waarin de pakketten die u installeert mogelijk niet allemaal afkomstig zijn van uw lokale repository.

Merk op dat ik hier niet heb besproken hoe het beschikbaar te maken via het LAN, maar dat is redelijk generieke configuratie met behulp van Apache of Nginx (zie de andere antwoorden hier).

Stel de repomap in

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

Voeg vervolgens een regel zoals deze toe aan sources.list:

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

Pakketten toevoegen en verwijderen

verwijder pakketten

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

pakketten toevoegen

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

voer nu het volgende script uit dat de Pakketten, Release en InRelease-bestanden genereert en ondertekent ze met uw persoonlijke gpg-sleutel:

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

Voorbeeld Inhoud van bestand conf / distributies

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


13
2018-05-15 07:33



@Phillip je bewerking gebruikt date -Rc, Ik heb het gecorrigeerd date -Ru ervan uitgaande dat dat is wat u bedoelde met de bewerkingsbeschrijving - muru
@muru Rechts. Bedankt dat je dit hebt gezien. - Phillip
Bedankt, ik ben pas sinds kort begonnen met het ontvangen van waarschuwingen van apt vanwege de gegenereerde datum in de lokale TZ en niet in UTC. Ik heb het in mijn eigen script opgelost maar vergeet het hier te bewerken - happyskeptic
@KevinJohnson Ik heb het hoofdantwoord nu bijgewerkt met een voorbeeld van dat bestand van mijn lokale apt-repo - happyskeptic


U kunt ook de lokale bronserver instellen via nginx en reprepro:

  1. Debian-pakketten installeren

    sudo apt-get install reprepro nginx 
    
  2. maak mappen voor reprepro en bewerk het

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

    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. Neem het op in reprepro, bouw het op

    $ 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. Grootte van bucket optimaliseren:

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

    server_names_hash_bucket_size 64;
    

Referentie naar Installeer Guide Link


7
2017-07-03 09:18



Hoewel dit theoretisch de vraag kan beantwoorden, het zou de voorkeur hebben om de essentiële delen van het antwoord hier op te nemen, en geef de link voor referentie. - gertvdijk
Goed advies, ik zal het antwoord bijwerken. Bedankt. - elprup
@elprup: je moet vergeten zijn om dat antwoord te updaten :) - 0xC0000022L


Misschien wil je eens een kijkje nemen apt-mirror en apt-cacher .

Hier is een gids over hoe installeren en gebruik het.


5
2017-07-31 11:02



Een 5-jarig antwoord van jou wordt gemarkeerd als LQ. Als het zou worden verwijderd, ga dan naar meta en vraag om het ongedaan maken van de verwijdering. Ik heb gestemd openhouden, maar het heeft een bewerking nodig! ;-) - Fabby


Er zijn verschillende redenen waarom u mogelijk een lokale repository wilt maken.   De eerste is dat je wilt besparen op bandbreedte als je meerdere hebt   Ubuntu-machines om bij te werken. Bijvoorbeeld als u 25 Ubuntu-machines had   dat alles minstens één keer per week moest worden bijgewerkt, zou je aanzienlijk   bespaar bandbreedte omdat je alles behalve de repository lokaal zou kunnen doen.

De meeste organisaties hebben behoorlijke bandbreedte voor hun netwerkgateways   maar deze bandbreedte is een kostbaar goed dat moet worden gebruikt   verstandig.

Veel organisaties hebben nog steeds routers met limieten van 10 MB of 100 MB op de   gateway, maar 1 GB netwerkverbindingen intern, zodat de bandbreedte kan zijn   intern beter gebruikt. De tweede reden om je eigen te maken   repository is dat je kunt bepalen welke applicaties worden geladen   uw interne Ubuntu-machines.

U kunt alle toepassingen verwijderen die uw organisatie niet wil gebruiken   op het lokale netwerk vanuit de repository die de machines bijwerkt.   Sterker nog, je kunt een testbox maken en applicaties testen en   voordat u ze in uw netwerk kunt laten verzekeren   veiligheid en stabiliteit.

Je moet eerst een spiegel instellen, daarvoor moet je gewoon op drukken    Ctrl+alt+T op je toetsenbord om te openen   Terminal. Wanneer het opent, voert u de onderstaande opdracht uit.

apt-get install apt-mirror 

Zodra u uw set-up apt-mirror hebt, kunt u uw download starten   de repository met deze opdracht.

apt-mirror /etc/apt/mirror.list1

Lees verder

1Bron:Maak een Ubuntu Repository


4
2017-08-16 22:29



sorry, link is dood - xamiro
@xamiro bedankt. Link gefixeerd. - Mitch♦


Om een ​​offline lokale repository te maken 
1. maak een map toegankelijk (tenminste door root)

sudo mkdir / var / my-local-repo

  1. kopieer alle deb-bestanden naar deze map.
  2. scan de map

sudo dpkg-scanpakketten / var / mijn-lokale-repo / dev / null>   / Var / mijn-local-repo / Arrangementen

  1. voeg de lokale repository toe aan bronnen

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


3
2017-09-05 12:32



Het min of meer hetzelfde staat ook op de officiële wiki: Repositories / Persoonlijk - Community Help Wiki - sdaau


Ik probeerde het te gebruiken apt-rdepends zoals in het geselecteerde antwoord, maar toen ik probeerde het pakket vanuit mijn lokale repository te installeren, klaagde het over ontbrekende afhankelijkheden.

apt-rdepends was niet een lijst van de afhankelijkheden voor mijn pakket. Ik vermoed dat het iets te maken heeft met het feit, dat apt-cache show toont er meerdere records voor.

In plaats daarvan gebruikte ik apt-cache depends, en dat heeft de truc gedaan:

Een recursieve lijst van afhankelijkheden krijgen

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

-i: alleen belangrijke afhankelijkheden --recurse: recursief

Verander het in een verteerbare lijst

  • Symbolen en spaties verwijderen: | tr -d "|,<,>, "
  • Afhankelijk van: & PreDepends verwijderen: | sed -e 's/^Depends://g' | sed -e 's/^PreDepends://g'
  • De lijst sorteren: | sort
  • Alleen unieke waarden: | uniq > list.txt

Opdracht voltooien:

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

Download de pakketten

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

Scan naar de pakketten en verander het in Packages.gz

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

1
2018-06-08 13:55



Misschien een goed idee om te verwijzen naar welk antwoord je het hebt ... - anonymous2


De instructies in BigSack's antwoord boven - en de originele wikipost hij citeerde van - werkte niet voor mij totdat ik twee veranderingen maakte:


1) Ik heb een plat "Packages" -bestand gegenereerd in plaats van een gzip-versie:

dpkg-scanpakketten -m. > Pakketten


2) Ik heb toegevoegd [trusted=yes] naar de vermelding van de repo in sources.list,

deb [Vertrouwde = yes] bestand: / usr / local / mydebs.


Ik vermoed dat # 2 eenvoudigweg een kwestie is van het verouderd zijn van de Ubuntu-wiki. Ik weet niet zeker waarom # 1 noodzakelijk was, maar omdat ik het nergens anders kon vinden, wilde ik ervoor zorgen dat de oplossing voor het publiek beschikbaar was.


0
2018-04-28 18:33





Ik heb gedaan met apt-mirror.

Het is goed, maar je moet meer ruimte op de harde schijf hebben omdat het synchroniseert met de repos-server.


-1
2017-07-31 11:25