Как создать локальный репозиторий APT?
Я хотел бы создать свой локальный репозиторий в своей локальной сети, чтобы машины в локальной сети могли обновляться и обновляться с него. Я хочу загрузить пакеты и сохранить их на своем локальном сервере, чтобы я мог обновлять, обновлять, устанавливать и т. Д. С него, не используя Интернет.
11 ответов
*Сделать автономный репозиторий по локальной сети *
Установите локальный веб-сервер 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. Вот команды, которые я использую для обновления пакетов AMD64 в моей локальной сети:
# 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
Есть 4 шага для создания простого репозитория для себя
1.Install
dpkg-dev
2. Поместите пакеты в каталог
3.Создайте скрипт, который будет сканировать пакеты и создать файл apt-get update, который можно прочитать
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.
Создание аутентифицированного репозитория
Я посмотрел ответы здесь и на других сайтах, и у большинства из них (ИМХО большой) недостаток в том, что вы настраиваете хранилище без аутентификации. Это означает, что вам нужно бежать 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
Инструкции в ответе @BigSack и официальном вики-сообщении Ubuntu не работали для меня в Ubuntu 18.04, пока я не сделал эти два изменения:
Создать простой, несжатый
Packages
файл (при выполнении этого рабочий каталог должен находиться там, где находятся все пакеты)cd /usr/local/mydebs dpkg-scanpackages -m . > Packages
Добавьте следующую запись в
/etc/apt/sources.list
deb [trusted=yes] file:/usr/local/mydebs ./
Возможно, вы захотите взглянуть на apt-mirror
а также apt-cacher
,
Вот руководство о том, как установить и использовать его.
Вы также можете настроить локальный исходный сервер с помощью nginx и prepro:
Установить пакеты Debian
sudo apt-get install reprepro nginx
создайте каталоги для редактора и редактируйте его
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 .
Включите его в репрепро, соберите
$ 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
Конфиг 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; } }
Оптимизировать размер ковша:
/etc/nginx/conf.d/server_names_hash_bucket_size.conf
server_names_hash_bucket_size 64;
Ссылка на руководство по установке Ссылка
Есть несколько причин, по которым вы можете захотеть создать локальный репозиторий. Во-первых, вы хотите сэкономить на пропускной способности, если у вас есть несколько машин с Ubuntu для обновления. Например, если бы у вас было 25 компьютеров с Ubuntu, которые все нуждались в обновлении, по крайней мере, один раз в неделю, вы бы значительно сэкономили пропускную способность, потому что вы могли делать все, кроме хранилища локально.
Большинство организаций имеют достаточную пропускную способность для своих сетевых шлюзов, но эта пропускная способность является ценным товаром, который необходимо использовать с умом.
Во многих организациях все еще есть маршрутизаторы с ограничениями 10 МБ или 100 МБ на шлюзе, но сетевые подключения 1 ГБ внутренне, так что пропускная способность могла бы лучше использоваться внутренне. Вторая причина создания собственного репозитория заключается в том, что вы можете контролировать, какие приложения загружаются на ваших внутренних компьютерах с Ubuntu.
Вы можете удалить любые приложения, которые ваша организация не хочет использовать в локальной сети, из хранилища, которое обновляет машины. Более того, вы можете создать тестовую коробку и тестировать приложения и версии, прежде чем разрешить их развертывание в сети, обеспечивая безопасность и стабильность.
Сначала вы должны настроить зеркало, для этого вам просто нужно нажать Ctrl+Alt+T на клавиатуре, чтобы открыть терминал. Когда он откроется, выполните команду ниже.
apt-get install apt-mirror
После того как вы настроили apt-mirror, вы можете начать загрузку репозитория с помощью этой команды.
apt-mirror /etc/apt/mirror.list1
1 Источник: создание репозитория Ubuntu.
Я пытался использовать 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. сделать каталог доступным (по крайней мере, root)
sudo mkdir / var / my-local-repo
- Скопируйте все файлы deb в этот каталог.
- сканировать каталог
sudo dpkg-scanpackages / var / my-local-repo / dev / null> / var / my-local-repo / Пакеты
- добавить локальный репозиторий к источникам
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
Проверьте OpenRepo (https://github.com/openkilt/openrepo)
Этот проект с открытым исходным кодом работает как веб-сервер. Вы можете загружать на него пакеты, и он будет размещать их в вашей локальной сети для обновления с других серверов.
Я сделал с помощью apt-mirror.
Это хорошо, но вам нужно больше места на жестком диске, поскольку он будет синхронизироваться с сервером репозитория.