Jak utworzyć lokalne repozytorium APT?

103

Chciałbym zbudować własne lokalne repozytorium w mojej sieci LAN, aby komputery w sieci LAN mogły się z niego aktualizować i aktualizować. Chcę pobrać pakiety i przechowywać je na moim lokalnym serwerze, aby móc z niego aktualizować, aktualizować, instalować itp. Bez korzystania z Internetu.

grooveplex
źródło
2
Powiel możliwe: askubuntu.com/questions/974/...
stephenmyall
3
Nie sądzę, że to duplikat. To, co maythux chce osiągnąć, to stworzenie własnego serwera repozytorium do użytku z aptitude. Keryx zastępuje aptitude jako menedżer pakietów i tworzy zewnętrzne źródła dla pakietów.
con-f-use

Odpowiedzi:

80

Z wiki pomocy Ubuntu :

Aby utworzyć proste repozytorium, musisz wykonać 4 kroki

1. dpkg-dev
Zainstaluj 2. Umieść pakiety w katalogu
3. Utwórz skrypt, który przeskanuje pakiety i utworzy plik, który apt-get update może odczytać
4. Dodaj wiersz do źródeł.list wskazujący na twoje repozytorium

Zainstaluj dpkg-dev

Wpisz terminal

sudo apt-get install dpkg-dev

Katalog

Utwórz katalog, w którym będziesz przechowywać swoje paczki. W tym przykładzie użyjemy/usr/local/mydebs.

sudo mkdir -p /usr/local/mydebs

Teraz przenieś swoje paczki do właśnie utworzonego katalogu.

Wcześniej pobrane pakiety są zazwyczaj przechowywane w systemie w /var/cache/apt/archiveskatalogu. Jeśli zainstalowałeś apt-cacher, będziesz mieć dodatkowe pakiety przechowywane w katalogu / packages.

Skrypt update-mydebs

To prosty trzyliniowy:

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

Wytnij i wklej powyższe do gedit i zapisz jako update-mydebs w ~ / bin. (tylda „~” oznacza katalog domowy. Jeśli ~ / bin nie istnieje, utwórz go: Ubuntu umieści ten katalog w ŚCIEŻCE. To dobre miejsce na osobiste skrypty). Następnie spraw, aby skrypt był wykonywalny:

chmod u+x ~/bin/update-mydebs

How the script works:

dpkg-scanpackages przegląda wszystkie pakiety w mydebs, a dane wyjściowe są kompresowane i zapisywane w pliku (Packages.gz), który można odczytać z aktualizacji apt-get (patrz poniżej odnośnik wyjaśniający to bardzo rozdzierająco). / dev / null jest pustym plikiem; zastępuje plik zastępujący, który zawiera dodatkowe informacje o pakietach, które w tym przypadku nie są tak naprawdę potrzebne. Zobacz deb-override (5), jeśli chcesz o tym wiedzieć.

Lista źródeł

dodaj linię

deb file:/usr/local/mydebs ./

na /etc/apt/sources.list i gotowe.

Opcja CD

Możesz nagrać katalog zawierający debaty na dysk CD i użyć go również jako repozytorium (dobre do udostępniania między komputerami). Aby użyć dysku CD jako repozytorium, wystarczy uruchomić

sudo apt-cdrom add

Korzystanie z repozytorium

Za każdym razem, gdy umieszczasz nowy deb w katalogu mydebs, uruchom

sudo update-mydebs
sudo apt-get update

Teraz można manipulować pakietami lokalnymi za pomocą poleceń Synaptic, aptitude i apt: apt-get, apt-cache itp. Gdy spróbujesz zainstalować apt-get, wszelkie zależności zostaną rozwiązane, o ile można je spełnić .

Źle wykonane pakiety prawdopodobnie zawiodą, ale nie znosisz piekła dpkg.

BigSack
źródło
3
Czy możesz wyjaśnić składnię w wierszu dpkg-scanpackages . /dev/null | gzip -9c > Packages.gz. Co /dev/nulltam robisz Przeczytałem też stronę podręcznika, ale nie było to całkiem jasne.
sayantankhan
@ blade19899 Potrzebuję trochę wyjaśnienia. Chcę repozytorium z kilkoma wybranymi pakietami, a nie z każdym pakietem, którego kiedykolwiek dotknąłem. Czy mam rację, że ta technika da mi tę umiejętność? Tutaj celem jest posiadanie repozytorium, z którego grupa instalująca oprogramowanie może korzystać w odizolowanej sieci LAN, z dala od pokus, aby apt-get niepotrzebne.
Wes Miller
@WesMiller Myślę, że potrzebujesz właśnie edytowałem jego post!
blade19899
@ blade19899 Przykro mi, nie rozumiem twojej odpowiedzi.
Wes Miller
@WesMiller u need BigSack Właśnie zredagowałem jego post dla problemów gramatycznych (myślę, że jego bin przez jakiś czas) to nie jest moja odpowiedź, ale BigSack's
blade19899
41

* Aby utworzyć repozytorium offline przez sieć LAN *

Zainstaluj lokalny serwer Apache Webserver

# apt-get install apache2

Domyślnie pakiet Apache Debiana utworzy stronę internetową w /var/wwwtwoim systemie. Dla naszych celów to w porządku, więc nie ma powodu, aby robić cokolwiek więcej. Możesz go łatwo przetestować, wskazując swoją ulubioną przeglądarkę na. http://localhostPowinieneś zobaczyć domyślną stronę poinstalacyjną, która jest faktycznie przechowywana w /var/www/index.html


Utwórz katalog repozytorium pakietów Debiana,

aby utworzyć katalog/var/www/debsdla tego. Pod nim powinieneś utworzyć katalogi „architektury”, po jednym dla każdej architektury, którą musisz obsługiwać. Jeśli używasz tylko jednego komputera (lub typu komputera), potrzebujesz tylko jednego - zwykle „i386” dla systemów 32-bitowych lub „amd64” dla 64-bitowych. Jeśli używasz innej architektury, zakładam, że prawdopodobnie już o tym wiesz. Teraz wystarczy skopiować pliki pakietu „.deb” dla danej architektury do odpowiednich katalogów. Jeśli teraz wskażesz swoją ulubioną przeglądarkę internetową http://localhost/debs/amd64(na przykład), zobaczysz listę pakietów dla systemów 64-bitowych.


Utwórz plik Packages.gz

Teraz musimy utworzyć plik katalogu do użycia przez APT. Odbywa się to za pomocą narzędzia o nazwie „dpkg-scanpackages”. Tutaj'

# cd /var/www/debs/

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




Poinformuj APT o repozytorium

Teraz pozostaje tylko powiadomić APT o swoim repozytorium. Robisz to, aktualizując plik /etc/apt/sources.list. Będziesz potrzebować takiego wpisu:

deb http://localhost/debs/ amd64/

Użyłem rzeczywistej nazwy hosta mojego systemu zamiast localhost - w ten sposób kod jest taki sam dla wszystkich komputerów w mojej sieci LAN, ale localhost da sobie radę, jeśli używasz tylko jednego komputera.
Teraz zaktualizuj APT:

# apt-get update

źródło
2
Dodanie tej linii do /etc/apt/sources.list spowoduje uszkodzenie aktualizacji, gdy nie będzie w sieci LAN, prawda?
Felix,
2
W przypadku Ubuntu 16.04 może być konieczne zastąpienie /var/www/debsw tej odpowiedzi hasłem /var/www/html/debs. Lub będziesz potrzebować dodatkowych kroków, aby ręcznie edytować konfigurację apache w/etc/apache2
Erik
18

Tworzenie uwierzytelnionego repozytorium

Spojrzałem na odpowiedzi tutaj i na innych stronach, a większość z nich ma (IMHO dużą) wadę, że tworzysz nieuwierzytelnione repozytorium. Oznacza to, że trzeba uruchomić apt-getz --allow-unauthenticatedinstalacji pakietów z niego. Może to stanowić zagrożenie bezpieczeństwa, szczególnie w skryptach, w których instalowane pakiety mogą nie pochodzić z lokalnego repozytorium.

Zauważ, że nie opisałem tutaj, jak udostępnić go przez sieć LAN, ale jest to dość ogólna konfiguracja za pomocą Apache lub nginx (zobacz inne odpowiedzi tutaj).

Skonfiguruj katalog repo

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

Następnie dodaj taką linię do sources.list:

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

Dodawanie i usuwanie pakietów

usuń paczki

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

dodaj pakiety

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

teraz uruchom następujący skrypt, który generuje pliki Packages, Release i InRelease i podpisuje je kluczem prywatnym 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

Przykład Zawartość pliku conf / dystrybucji

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

Spinki do mankietów

https://wiki.debian.org/RepositoryFormat

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

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

happyskeptic
źródło
@Phillip Twoja edycja używany date -Rc, poprawiłem go date -Ruprzy założeniu, że to, co masz na myśli z opisem edycji
Muru
Dzięki, dopiero niedawno zacząłem otrzymywać ostrzeżenia od apt z tego powodu, ponieważ data wygenerowania była w lokalnej TZ, a nie UTC. Naprawiłem to we własnym skrypcie, ale zapomniałem go edytować tutaj
happyskeptic
1
@KevinJohnson Zaktualizowałem główną odpowiedź teraz przykładem tego pliku z mojego lokalnego apt repo
happyskeptic
8

Możesz także skonfigurować lokalny serwer źródłowy za pomocą nginx i reprezentpro:

  1. Zainstaluj pakiety debian

    sudo apt-get install reprepro nginx 
    
  2. twórz katalogi dla reprezentpro i edytuj je

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

    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. Uwzględnij w reprezentpro, zbuduj

    $ 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. Konfiguracja 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. Zoptymalizuj rozmiar łyżki:

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

    server_names_hash_bucket_size 64;
    

Odsyłacz do Przewodnika instalacji

elprup
źródło
4
Chociaż teoretycznie może to odpowiedzieć na pytanie, lepiej byłoby zawrzeć tutaj istotne części odpowiedzi i podać odnośnik.
gertvdijk
@elprup: musiałeś zapomnieć zaktualizować tę odpowiedź :)
0xC0000022L
reprezentpor nie obsługuje wielu wersji tego samego pakietu. Brzmi dziwnie, ale tak właśnie działa reprezentpro
maxadamo,
6

Możesz rzucić okiem na apt-mirrori apt-cacher.

Oto przewodnik, jak go zainstalować i używać.

dezorientować
źródło
Twoja 5-letnia odpowiedź jest oznaczana jako LQ. Jeśli zostanie usunięty, przejdź do meta i poproś o cofnięcie usunięcia. Głosowałem za pozostaniem otwartym , ale wymaga edycji! ;-)
Fabby
5

Instrukcje w odpowiedzi @ BigSack i oficjalnym wpisie wiki Ubuntu nie działały dla mnie na Ubuntu 18.04, dopóki nie wprowadziłem tych dwóch zmian:

  1. Wygeneruj prosty, nieskompresowany Packagesplik (podczas jego wykonywania katalog roboczy musi znajdować się w miejscu, w którym znajdują się wszystkie pakiety)

    cd /usr/local/mydebs
    dpkg-scanpackages -m . > Packages
    
  2. Dodaj następujący wpis w /etc/apt/sources.list

    deb [trusted=yes] file:/usr/local/mydebs ./
    
Wowfunhappy
źródło
4

Istnieje kilka powodów, dla których warto utworzyć lokalne repozytorium. Pierwszym jest to, że chcesz zaoszczędzić na przepustowości, jeśli masz wiele maszyn Ubuntu do aktualizacji. Na przykład, jeśli miałeś 25 maszyn Ubuntu, z których wszystkie wymagały aktualizacji przynajmniej raz w tygodniu, znacznie zaoszczędziłeś przepustowość, ponieważ możesz zrobić wszystko oprócz repozytorium lokalnie.

Większość organizacji ma przyzwoitą przepustowość dla swoich bram sieciowych, ale ta przepustowość jest cennym towarem, z którego należy mądrze korzystać.

Wiele organizacji nadal ma w bramie routery z limitami 10 MB lub 100 MB, ale połączenia sieciowe 1 GB wewnętrznie, więc przepustowość można lepiej wykorzystać wewnętrznie. Drugim powodem tworzenia własnego repozytorium jest to, że możesz kontrolować, które aplikacje są ładowane na wewnętrzne maszyny Ubuntu.

Możesz usunąć dowolne aplikacje, których Twoja organizacja nie chce używać w sieci lokalnej, z repozytorium, które aktualizuje komputery. Co więcej, możesz utworzyć pole testowe oraz przetestować aplikacje i wersje, zanim zezwolisz im na wdrożenie w sieci, zapewniając bezpieczeństwo i stabilność.

Najpierw musisz skonfigurować lustro, aby to zrobić, wystarczy nacisnąć Ctrl+ Alt+ Tna klawiaturze, aby otworzyć terminal. Kiedy się otworzy, uruchom poniższe polecenie.

apt-get install apt-mirror 

Po skonfigurowaniu apt-mirror możesz rozpocząć pobieranie repozytorium za pomocą tego polecenia.

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

Czytaj

1 Źródło: Utwórz repozytorium Ubuntu

Mitch
źródło
przepraszam, link nie działa
xamiro,
3

Aby utworzyć lokalne repozytorium offline
1. Udostępnij katalog (przynajmniej root)

sudo mkdir / var / my-local-repo

  1. skopiuj wszystkie pliki deb do tego katalogu.
  2. skanuj katalog

sudo dpkg-scanpackages / var / my-local-repo / dev / null> / var / my-local-repo / Packages

  1. dodaj lokalne repozytorium do źródeł

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


źródło
Mniej więcej to samo znajduje się na oficjalnej wiki: Repozytoria / Osobiste - Społeczność Wiki Wiki
sdaau
1

Próbowałem użyć apt-rdependsjak w wybranej odpowiedzi, ale kiedy próbowałem zainstalować pakiet z mojego lokalnego repozytorium, narzekałem na brakujące zależności.

apt-rdependsnie wyświetlał niektórych zależności dla mojego pakietu. Podejrzewam, że ma to coś wspólnego z faktem, że apt-cache showpokazuje wiele rekordów.

Zamiast tego użyłem apt-cache dependsi to załatwiło sprawę:

Uzyskiwanie rekurencyjnej listy zależności

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

-i: tylko ważne zależności --recurse: rekurencyjne

Zamień go w strawną listę

  • Usuwanie symboli i spacji: | tr -d "|,<,>, "
  • Usuwanie Depends: i PreDepends: | sed -e 's/^Depends://g' | sed -e 's/^PreDepends://g'
  • Sortowanie listy: | sort
  • Tylko unikalne wartości: | uniq > list.txt

Pełne polecenie:

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

Pobierz pakiety

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

Wyszukaj pakiety i zmień je w Packages.gz

dpkg-scanpackages . /dev/null | gzip -9c > Packages.gz
Szymon
źródło
1
Być może dobrym pomysłem jest wskazanie odpowiedzi, o której mówisz ...
anonimowy2
-1

Zrobiłem to używając apt-mirror.

Jest dobry, ale musisz mieć więcej miejsca na dysku twardym, ponieważ będzie on synchronizowany z serwerem repos.

Gąsienica
źródło