Як створити локальний сховище APT?


103

Я хотів би створити власне локальне сховище у своїй локальній мережі, щоб машини в локальній мережі могли оновити та оновити з нього. Я хочу завантажити пакунки та зберігати їх на своєму локальному сервері, щоб я міг оновити, оновити, встановити тощо з нього, не користуючись Інтернетом.


2
Можливий дублікат: askubuntu.com/questions/974/…
stephenmyall

3
Я не думаю, що це дублікат. Що може зробити Maythux - це створити власний сервер репозиторіїв для використання з можливостями. Що Keryx робить, це замінити здатність як менеджера пакунків та створити зовнішні джерела для пакетів.
con-f-use

1
Можливий дублікат? - askubuntu.com/questions/9809/… або askubuntu.com/questions/3503/…
jrg

Відповіді:


80

З вікі довідки Ubuntu :

Існує 4 кроки зі створення простого сховища для себе

1.Встановіть dpkg-dev
2.Введіть пакунки в каталог
3.Створіть скрипт, який скануватиме пакунки та створить файл. Під час оновлення apt-get можна прочитати
4. Додайте рядок до свого source.list, вказуючи на ваше сховище

Встановіть dpkg-dev

Введіть термінал

sudo apt-get install dpkg-dev

Каталог

Створіть каталог, де ви будете зберігати ваші пакунки. Для цього прикладу ми будемо використовувати/usr/local/mydebs.

sudo mkdir -p /usr/local/mydebs

Тепер перемістіть ваші пакети в створений вами каталог.

Раніше завантажені пакети зазвичай зберігаються у вашій системі в /var/cache/apt/archivesкаталозі. Якщо ви встановили apt-cacher, ви матимете додаткові пакунки, що зберігаються в його каталозі / пакети.

Оновлення сценарію-mydebs

Це простий три вкладиші:

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

Виріжте та вставте вище в gedit та збережіть його як update-mydebs у ~ / bin. (tilde '~' означає ваш домашній каталог. Якщо ~ / bin не існує, створіть його: Ubuntu помістить цей каталог у ваш PATH. Це гарне місце для розміщення особистих скриптів). Далі зробіть сценарій виконуваним:

chmod u+x ~/bin/update-mydebs

How the script works:

dpkg-scanpackages розглядає всі пакунки в mydebs, а висновок стискається і записується у файл (Packages.gz), який оновлення apt-get може прочитати (див. нижче для посилань, що пояснює це з більшими подробицями). / dev / null - порожній файл; це заміна файлу заміщення, який містить деяку додаткову інформацію про пакети, яка в цьому випадку насправді не потрібна. Дивіться дебюринг (5), якщо ви хочете знати про це.

Sources.list

додайте рядок

deb file:/usr/local/mydebs ./

до вашого /etc/apt/sources.list, і ви закінчили.

Варіант CD

Ви можете записати каталог, що містить деби, на компакт-диск і використовувати його як сховище (добре для обміну між комп'ютерами). Щоб використовувати компакт-диск як сховище, просто запустіть

sudo apt-cdrom add

Використання сховища

Щоразу, коли ви кладете новий деб в каталог mydebs, запустіть

sudo update-mydebs
sudo apt-get update

Тепер вашими локальними пакетами можна керувати командами Synaptic, aptitude та apt: apt-get, apt-cache тощо. При спробі встановлення apt-get встановлення будь-яких залежностей буде вирішено для вас, якщо вони можуть бути виконані .

Погано зроблені пакети, ймовірно, не зможуть, але ви не пережили б пекло dpkg.


3
Чи можете ви пояснити синтаксис у рядку dpkg-scanpackages . /dev/null | gzip -9c > Packages.gz. Що /dev/nullтам роблять. Я також читав сторінку чоловіка, але це було не зовсім зрозуміло.
Саянтанкхан

@ blade19899 Мені потрібно трохи роз'яснення, будь ласка. Я хочу сховище з кількома вибраними пакетами, а не кожен пакет, який я коли-небудь торкався. Чи я правда, що ця методика дасть мені таку здатність? Мета полягає в тому, щоб створити сховище, яке група інсталяцій програмного забезпечення може використовувати в ізольованій локальній мережі, далеко від спокус, щоб вдало отримати непотрібне.
Уес Міллер

@WesMiller Я думаю, вам потрібно, я щойно відредагував його пост!
blade19899

@ blade19899 Вибачте, я не розумію вашої відповіді.
Уес Міллер

@WesMiller вам потрібен BigSack Я щойно відредагував його допис з питань граматики (я думаю, що його кошик деякий час) це не моя відповідь, але BigSack
blade19899

41

* Щоб створити офлайн-сховище через локальну мережу *

Встановіть локальний веб-сервер Apache

# apt-get install apache2

За замовчуванням пакунок Apache Debian створить веб-сайт у /var/wwwвашій системі. Для наших цілей це нормально, тому немає нічого більше робити. Ви можете легко протестувати, вказавши на свій улюблений веб-переглядач. http://localhostВи повинні побачити веб-сторінку після встановлення за замовчуванням, яка фактично зберігається в /var/www/index.html


каталозі репозиторіїв пакунків Debian, вибраному

для створення каталогу./var/www/debsдля цього. Під ним слід створити каталоги "архітектури", по одному для кожної архітектури, яку потрібно підтримувати. Якщо ви використовуєте лише один комп'ютер (або тип комп'ютера), вам знадобиться лише один - зазвичай "i386" для 32-бітних систем або "amd64" для 64-бітного. Якщо ви використовуєте якусь іншу архітектуру, я припускаю, що ви, напевно, вже знаєте про це. Тепер просто скопіюйте файли пакетів .deb для заданої архітектури у відповідні каталоги. Якщо ви зараз вкажете свій улюблений веб-браузер http://localhost/debs/amd64(наприклад), ви побачите список пакунків для 64-бітних систем.


Створіть файл Packages.gz

Тепер нам потрібно створити файл каталогу для використання APT. Це робиться за допомогою утиліти під назвою "dpkg-scanpackages". Ось '

# cd /var/www/debs/

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




Зробіть сховище відомим APT.

Тепер залишається лише повідомити APT про ваше сховище. Це можна зробити, оновивши файл /etc/apt/sources.list. Вам потрібен такий запис:

deb http://localhost/debs/ amd64/

Я використовував власне ім’я хоста моєї системи замість localhost - таким чином код однаковий для всіх комп'ютерів моєї локальної мережі, але localhost буде добре, якщо ви працюєте лише на одному комп’ютері.
Тепер оновіть APT:

# apt-get update

2
Додавання цього рядка до /etc/apt/sources.list порушить оновлення, коли його немає в локальній мережі, чи не так?
Фелікс

2
Для Ubuntu 16.04 вам може знадобитися замінити /var/www/debsв цій відповіді на /var/www/html/debs. Або вам знадобляться додаткові кроки, щоб вручну редагувати конфігурацію apache в/etc/apache2
Ерік,

18

Створення автентифікованого сховища

Я переглянув відповіді тут і на інших сайтах, і у більшості з них (великий ІМХО) недолік у тому, що ви налаштовуєте несанкціонований сховище. Це означає, що вам потрібно працювати apt-getз --allow-unauthenticatedустановкою пакетів з нього. Це може становити загрозу безпеці, особливо в сценаріях, де пакунки, які ви встановлюєте, не всі можуть бути зі свого локального сховища.

Зауважте, що я не пояснював, як зробити це доступним через локальну мережу, але це досить загальна конфігурація за допомогою Apache або nginx (див. Інші відповіді тут).

Налаштування каталогу repo

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

Потім додайте такий рядок до sources.list:

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

Додавання та видалення пакетів

видалити пакети

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

додайте пакети

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

тепер запустіть наступний скрипт, який генерує файли Packages, Release та InRelease та підписує їх своїм приватним ключем 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

Приклад Зміст файлу конф / розподілу

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

Посилання

https://wiki.debian.org/RepositoryFormat

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

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


@Phillip ваша редакція використана date -Rc, я виправив її, date -Ruприпускаючи, що це ви мали на увазі під описом редагування
muru

Дякую, я лише нещодавно почав отримувати попередження від влучного про це через дату, яка створюється в місцевому TZ, а не UTC. Я зафіксував це за власним сценарієм, але забув тут відредагувати
happyyskeptic

1
@KevinJohnson Я оновив головну відповідь зараз на прикладі цього файлу з мого місцевого
підходящого

8

Ви також можете налаштувати локальний вихідний сервер за допомогою nginx та reprepro:

  1. Встановіть пакети debian

    sudo apt-get install reprepro nginx 
    
  2. скласти каталоги для reprepro та редагувати його

    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 / розповсюдження

    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 / параметри

    ask-passphrase
    basedir .
    
  3. Включіть його в репрез, побудуйте його

    $ 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. Налаштування 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. Оптимізуйте розмір відра:

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

    server_names_hash_bucket_size 64;
    

Посилання на посібник із встановлення


4
Хоча це теоретично може відповісти на питання, бажано було б сюди включити істотні частини відповіді та надати посилання для довідки.
gertvdijk

@elprup: ти, мабуть, забув оновити цю відповідь :)
0xC0000022L

reprepor не підтримує декілька версій одного пакету. Це звучить дивно, але саме так працює
репрепро

6

Ви можете захотіти поглянути на apt-mirrorі apt-cacher.

Ось посібник щодо її встановлення та використання.


Ваша відповідь на 5 років позначена як LQ. Якщо його буде видалено, перейдіть до мета і попросіть видалити. Я проголосував за те, щоб залишатись відкритим , але це потребує редагування! ;-)
Fabby

5

Інструкції у відповіді @ BigSack та офіційному вікі-повідомленні Ubuntu не працювали для мене на Ubuntu 18.04, поки я не змінив ці дві зміни:

  1. Створіть звичайний, нестиснений Packagesфайл (при виконанні цього робочий каталог повинен бути там, де розташовані всі пакунки)

    cd /usr/local/mydebs
    dpkg-scanpackages -m . > Packages
    
  2. Додайте наступний запис у /etc/apt/sources.list

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

4

З кількох причин ви можете створити локальне сховище. Перший полягає в тому, що ви хочете заощадити на пропускній здатності, якщо у вас є кілька апаратів Ubuntu для оновлення. Наприклад, якщо у вас було 25 машин Ubuntu, які потребували оновлення щонайменше раз на тиждень, ви значно заощадили б пропускну здатність, оскільки ви могли робити все, крім репозиторію локально.

Більшість організацій мають гідну пропускну здатність для своїх мережевих шлюзів, але ця пропускна здатність є дорогоцінним товаром, який потрібно використовувати розумно.

Багато організацій все ще мають маршрутизатори з обмеженням 10 Мб або 100 МБ на шлюзі, але мережеві з'єднання 1 Гб внутрішньо, щоб пропускну здатність можна було краще використовувати внутрішньо. Друга причина створення власного сховища полягає в тому, що ви можете контролювати, які програми завантажуються на ваші внутрішні машини Ubuntu.

Ви можете видалити будь-які програми, які ваша організація не хоче використовувати в локальній мережі, із сховища, яке оновлює машини. Ще краще, ви можете створити тестове поле та тестувати додатки та версії, перш ніж ви дозволите їх розгортанню у вашу мережу, забезпечуючи безпеку та стабільність.

Спочатку потрібно встановити дзеркало, для цього потрібно просто натиснути Ctrl+ Alt+ Tна клавіатурі, щоб відкрити термінал. Коли він відкриється, запустіть команду нижче.

apt-get install apt-mirror 

Після того, як ви налаштуєте дзеркало apt, ви можете розпочати завантаження сховища за допомогою цієї команди.

apt-зеркало /etc/apt/mirror.list 1

Читайте далі

1 Джерело: Створіть сховище Ubuntu


вибачте, посилання мертве
xamiro

3

Щоб створити офлайн-локальний сховище
1. зробіть доступним dir (принаймні за коренем)

sudo mkdir / var / my-local-repo

  1. скопіюйте всі файли deb в цей каталог.
  2. сканувати каталог

sudo dpkg-scanpackages / var / my-local-repo / dev / null> / var / my-local-repo / Пакети

  1. додати локальний сховище до джерел

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


Більш-менш те ж саме є і на офіційній вікі: Репозиторії / Особисті - Довідка спільноти Wiki
sdaau

1

Я намагався використовувати, apt-rdependsяк у вибраній відповіді, але коли я намагався встановити пакет із мого локального сховища, він скаржився на відсутність залежності.

apt-rdependsне перераховував деякі залежності для мого пакету. Я підозрюю, що це має щось спільне з тим фактом, що apt-cache showпоказує кілька записів.

Натомість я використав apt-cache depends, і це зробив трюк:

Отримання рекурсивного списку залежностей

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

-i: лише важливі залежності --recurse: рекурсивні

Перетворіть його на перетравний список

  • Видалення символів та пробілів: | tr -d "|,<,>, "
  • Видалення залежить: & PreDepends: | sed -e 's/^Depends://g' | sed -e 's/^PreDepends://g'
  • Сортування списку: | sort
  • Тільки унікальні значення: | uniq > list.txt

Повна команда:

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

Завантажте пакети

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

Скануйте пакети та перетворіть їх на Packages.gz

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

1
Можливо, буде гарною ідеєю для посилання, на яку відповідь ви говорите ...
anonymous2

-1

Я зробив це за допомогою дзеркала-влучних.

Це добре, але вам потрібно мати більше місця на жорсткому диску, оскільки він буде синхронізуватися з сервером repos.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.