Как создать локальный репозиторий APT?


103

Я хотел бы создать свой локальный репозиторий в своей локальной сети, чтобы машины в локальной сети могли обновляться и обновляться с него. Я хочу загрузить пакеты и сохранить их на своем локальном сервере, чтобы я мог обновлять, обновлять, устанавливать и т. Д. С него, не используя Интернет.


2
Возможное дублирование: askubuntu.com/questions/974/…
stephenmyall

3
Я не думаю, что это дубликат. Maythux хочет создать собственный сервер репозитория для использования с aptitude. Keryx заменяет aptitude в качестве менеджера пакетов и создает внешние источники для пакетов.
con-f-use

1
Возможный дубликат? - askubuntu.com/questions/9809/… или askubuntu.com/questions/3503/…
jrg

Ответы:


80

Из справочной вики Ubuntu :

Есть 4 шага для создания простого репозитория для себя

1.Install dpkg-dev
2.Put пакеты в каталоге
3.Create скрипт , который будет проверять пакеты и создать файл обновления APT-GET можно прочитать
4. Добавьте строку в sources.list , указывая на вашем хранилище

Установите dpkg-dev

Введите в терминале

sudo apt-get install dpkg-dev

Справочник

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

sudo mkdir -p /usr/local/mydebs

Теперь переместите ваши пакеты в каталог, который вы только что создали.

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

Скрипт обновления-mydebs

Это простой три лайнера:

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

Вырежьте и вставьте вышеперечисленное в gedit и сохраните его как update-mydebs в ~ / bin. (тильда '~' означает ваш домашний каталог. Если ~ / bin не существует, создайте его: Ubuntu поместит этот каталог в вашу PATH. Это хорошее место для размещения личных сценариев). Затем сделайте скрипт исполняемым:

chmod u+x ~/bin/update-mydebs

How the script works:

dpkg-scanpackages просматривает все пакеты в mydebs, и выходные данные сжимаются и записываются в файл (Packages.gz), который может прочитать обновление apt-get (см. ниже ссылку, которая объясняет это в мучительных подробностях). / dev / null - пустой файл; он заменяет файл переопределения, который содержит некоторую дополнительную информацию о пакетах, которая в этом случае на самом деле не нужна. Смотрите deb-override (5), если вы хотите знать об этом.

sources.list

добавить строку

deb file:/usr/local/mydebs ./

на ваш /etc/apt/sources.list, и все готово.

CD вариант

Вы можете записать каталог, содержащий debs, на CD и использовать его как хранилище (хорошо для совместного использования между компьютерами). Чтобы использовать компакт-диск в качестве хранилища, просто запустите

sudo apt-cdrom add

Использование репозитория

Всякий раз, когда вы помещаете новый deb в каталог 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 Мне нужно немного разъяснений, пожалуйста. Мне нужен репозиторий с несколькими избранными пакетами, а не с каждым, к которому я когда-либо прикасался. Я прав, что эта техника даст мне эту способность? Цель здесь - создать репозиторий, который группа установки программного обеспечения может использовать в изолированной ЛВС, вдали от соблазнов apt-get ненужного.
Уэс Миллер

@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 (см. Другие ответы здесь).

Настройте каталог репо

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

Пример Содержимое файла conf / distribution

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

Спасибо, я только недавно начал получать предупреждения от apt об этом из-за даты, сгенерированной в местном TZ, а не в UTC. Я исправил это в своем собственном сценарии, но не забудьте отредактировать его здесь
happyskeptic

1
@KevinJohnson Я обновил основной ответ теперь, используя пример этого файла из моего локального репо
happyskeptic

8

Вы также можете настроить локальный исходный сервер с помощью nginx иprepro:

  1. Установить пакеты Debian

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

    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 / убунт / 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 / убунту / 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

contepor не поддерживает несколько версий одного и того же пакета. Звучит странно, но именно так репрепро работает
maxadamo

6

Возможно, вы захотите взглянуть на apt-mirrorи apt-cacher.

Вот руководство о том, как установить и использовать его.


Ваш 5-летний ответ помечается как LQ. Если он будет удален, зайдите в meta и попросите восстановить его. Я проголосовал, чтобы оставить открытым , но это требует редактирования! ;-)
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-mirror, вы можете начать загрузку репозитория с помощью этой команды.

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

Читать дальше

1 Источник: создание репозитория Ubuntu.


извините, ссылка не работает
xamiro

3

Чтобы сделать автономный локальный репозиторий
1. сделать каталог доступным (по крайней мере, root)

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


Более или менее то же самое есть и на официальной вики: Репозитории / Личные - 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

Я сделал с помощью apt-mirror.

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.