Ubuntu создать зеркало репозитория rsync
Наличие локального хранилища может быть очень полезным. Можно использовать rsync для создания зеркала репозитория, но это приводит к загрузке всех выпусков, даже более старых, и включает файлы для архитектур, которые могут не понадобиться.
apt-mirror позволяет выборочно выбирать части хранилища. mirrorkit предоставляет интерфейс для apt-mirror.
Каков наилучший способ создания зеркала локального хранилища для отдельных частей архивов Ubuntu?
Например, можно пожелать включить:
Основной, Ограниченный, Вселенная, Мультивселенная, Все Ubuntu и Lubuntu, но исключая другие производные, такие как Kubuntu и Xubuntu.
Только AMD64 и i386, но исключают другие архитектуры.
Только верная Тар, но не точный пингвин или утопический единорог.
Можно пожелать настроить процесс так, чтобы он загружался с локального зеркала, а не из основных архивов.
Как я могу создать локальный репозиторий, используя apt-mirror и mirrorkit для выбранной архитектуры, выпуска или варианта Ubuntu?
Исключить Kubuntu? Вы имеете в виду исключить ISO-образы Kubuntu или исключить какой-либо пакет, который используется Kubuntu? Например, исключите ISO-образы Kubuntu и Xubuntu. Возможно, их очень много (Precise Kubuntu ARM, Precise Kubuntu i386, Quantal Kubuntu ARM, Quantal Kubuntu i386 . ), и первоначальная загрузка зеркала может быть завершена быстрее без этих ISO. Но если это всего лишь несколько гигабайт, возможно, это не так важно. ISO-файлы размещаются отдельно от пакетов. Таким образом, вы можете использовать apt-mirror, как обычно, для зеркалирования репозиториев пакетов, и использовать какой-то другой инструмент для ISO. Тогда возникает вопрос о нахождении подходящих фильтров исключения для этого инструмента (скажем, rsync). «Вы можете использовать apt-mirror, как обычно». Извините, я не знаю, как это сделать. Это именно то, что я хотел бы объяснить.Репозиторий компакт-дисков и программный репозиторий представляют собой два отдельных компонента (у них даже есть отдельные страницы Launchpad: cdmirrors и archivemirrors ). Поэтому их отражение - это две разные задачи. Кроме того, хотя различные версии имеют разные папки в репозитории CD, они совместно используют программный репозиторий. Таким образом, вы можете выборочно отражать изображения по вкусу, но не по программному обеспечению. Для хранилища программного обеспечения вы можете выборочно зеркалировать на основе:
- релиз ( trusty , precise и т.д.)
- архитектура ( amd64 , i386 и т.д.)
- тип пакета (двоичный [ deb ] против исходного [ deb-src ])
- Каналы ( trusty , trusty-updates , trusty-backports и т.д.)
- участки ( main , multiverse и т.д.)
Для зеркалирования хранилища программного обеспечения используйте apt-mirror .
apt-mirror настроен с помощью /etc/apt/mirror.list . Он имеет формат, очень похожий на sources.list . В файле конфигурации, установленном пакетом, есть несколько закомментированных параметров, в которых перечислены их значения по умолчанию. При желании вы можете раскомментировать и изменить их.
Чтобы отразить репозиторий, вам нужно добавить строку, mirror.list как для sources.list :
По умолчанию зеркалируется только архитектура хоста, поэтому, если вы используете 64-битную версию Ubuntu, amd64 будет отображаться только зеркальная копия. Вам нужно добавить еще одну строку формы:
И для пакетов с исходным кодом:
Если вы ищете достаточно полное зеркало, эти строки будут минимальными (я бы также рекомендовал -updates канал):
Наконец, вам нужно добавить clean строку, чтобы пакеты, которые больше не доступны в хранилище, были отфильтрованы для удаления:
Структура репозитория Ubuntu в основном аналогична Debian'у, описание на русском языке можно найти здесь [1].
Если вы хотите сделать небольшой репозиторий из тех файлов, которые у вас уже есть — вам сюда [2] (команда dpkg-scanpackages). Если вы хотите "раскидать" файлы по иерархичной структуре pool'а, можно воспользоваться утилитой reprepro [3].
Debian использует «Проталкивающее Зеркалирование», Ubuntu также использует эту технологию [4].
Есть два типа репозиториев [5]:
Полные архивы занимают около 320 Гб и постепенно увеличиваются. Обновляются минимум один раз в 24 часа, но не чаще чем раз в 4 часа.
Релизы Ubuntu занимают около 40 Гб и остаются относительно неизменными в размерах. Обычно обновляются несколько раз в год с проверкой каждые 24 часа.
4.10 | Warty Warthog |
5.04 | Hoary Hedgehog |
5.10 | Breezy Badger |
6.06 LTS | Dapper Drake |
6.10 | Edgy Eft |
7.04 | Feisty Fawn |
7.10 | Gutsy Gibbon |
8.04 LTS | Hardy Heron |
8.10 | Intrepid Ibex |
9.04 | Jaunty Jackalope |
9.10 | Karmic Koala |
10.04 LTS | Lucid Lynx |
10.10 | Maverick Meerkat |
11.04 | Natty Narwhal |
11.10 | Oneiric Ocelot |
12.04 LTS | Precise Pangolin |
12.10 | Quantal Quetzal |
13.04 | Raring Ringtail |
13.10 | Saucy Salamander |
14.04 | Trusty Tahr |
Большая часть обновлений репозитория — изменения в тестируемом дистрибутиве (сейчас это 13.10).
Существует несколько способов создания зеркала репозитория. Ниже рассмотрены rsync и debmirror. Несмотря на кажущуюся простоту, зеркалирование rsync'ом менее управляемо, чем debmirror, который ещё и имеет все преимущества rsync'а.
С помощью rsync можно создать полное зеркало репозитория Ubuntu.
Следуя официальным рекомендациям [6], чтобы пользователи имели меньше шансов получить ошибку "file not found", необходимо в начале обновить пакеты, потом информацию о них, и только после этого удалить устаревшие пакеты ("Two Staging mirroring").
Для постоянного применения рекомендуется следующий скрипт:
- При ручном запуске, можно добавить к каждой команде --verbose --progress — это даст более информативный вывод в ходе копирования.
- В случае использования --progress, может пройти много времени перед первым выводом на экран. Это нормально для зеркало такого размера. (задержка настолько большая, что дождаться удалось только при синхронизации отдельных директорий)
- Использование --compress не должно сказаться на процессе копирования файлов, но значительно ускоряет процесс начальной передачи списка файлов при использовании --progress, который занимает много времени.
- Если добавить к каждой команде строку, указанную ниже, то будут скопированы только пакеты для i386, amd64 и исходные коды:
На странице [7] дан скрипт, который перезапускает rsync в случае сбоя, и после завершения копирования высылает письмо со статистикой. Объединим его со скриптом выше ("Two stage rsync"):
Создайте каталог /var/log/mirror, и выставьте соответствующие права на него, чтобы скрипт мог писать в него лог. Не забудьте поменять "/path/to/your/mirror/" и путь к интерпретатору bash в первой строке скрипта (путь в вашей системе можно узнать командой whereis bash).
Если не нужно поднимать всё зеркало, можно воспользоваться утилитой debmirror, которая позволяет выбрать дистрибутивы, архитектуры и секции. Представляет из себя скрипт, написанный на perl'е.
Debmirror'у можно указать не загружать исходные коды, что сэкономит место. А если не закачивать пакеты для тестируемого дистрибутива, то сильно уменьшится объём изменений в репозитории.
Debmirror разбивает работу на три шага:
- Загружает индексные файлы Packages.gz (или .bz2) и Sources.gz (или .bz2);
- Удаляет неизвестные файлы (опция --nocleanup позволяет пропустить этот шаг);
- Сканируются файлы Packages и Sources для построения полного списка файлов, на которые они ссылаются. Также к списку добавляются некоторые другие файлы. После debmirror проверяет наличие каждого файла в локальном зеркале и его соответствие размеру (или опционально md5sum). Недостающие файлы загружаются.
Список секций (--dist=) можно посмотреть на вышестоящем зеркале, в папке "ubuntu/dists/".
Пример для релиза 10,04, архитектуры i386 и amd64 и исходных кодов. Копирование с помощью rsync. Путь "/mirror_ubuntu" поменяйте на нужный:
Патчим debmirror согласно инструкции [8], после чего можно запускать debmirror с опцией --nopkgbz2.
Если создавать в Ubuntu копию репозитория Debian, то debmirror будет ругаться на отсутствие ключей.
Ключи нужно добавить. Устанавливаем пакет debian-archive-keyring:
После этого у нас появится GnuPG архив ключей Debian в /usr/share/keyrings/. Импортируем их от имени того же пользователя, от которого будет запущен debmirror (процесс хорошо описан в man debmirror):
Если же debmirror запущен в той операционной системе, где нет возможности установить GnuPG архив ключей Debian, можно их добавлять вручную по их ID (также описано в man debmirror):
Минимальная конфигурация Apache2 для выдачи файлов и формирования списков файлов (по мотивам статьи Защищаем Apache 2. Шаг за шагом):
Не забудьте поменять ServerAdmin и DocumentRoot. Необходимо создать каталог /var/log/apache, в который разрешить запись пользователю, из под которого будет запущен сервер Apache.
по сравнению с оригинальным файлом, изменена только опция IndexOptions.
Конфигурационный файл для FreeBSD, но должно работать и в других системах, нужно только убрать опцию server.event-handler.
Внутри репозитория можно сделать симлинк «ubuntu», смотрящий на директорию, в которой он расположен, чтобы при обращении к файлам с содержащимся /ubuntu/ не выдавалось 404.Если репозиторий один, то конфигурацию можно поместить в /etc/nginx/sites-enabled/default :
Если у вас своя сеть, в которой есть DNS сервер, можно "схитрить" и назначить на имена «*.archive.ubuntu.com» и "security.ubuntu.com" ip-адрес вашего репозитория. Так как сервер действует только в вашей сети, эти изменения получат только ваши клиенты. При установке дистрибутива будет достаточно указать страну "Россия", чтобы Ubuntu выставила в качестве репозитория "ru.archive.ubuntu.com" который, благодаря "хитрости", будет ссылаться на ip-адрес вашего локального репозитория. Адреса, на которые обращается уже установленная система, можно посмотреть в файле /etc/apt/sources.list.
В файл конфигурации named.conf прописываем:
Создаём файлы с зонами. Вместо "admin.my.domain." подставьте ваш e-mail, заменив символ "@" на точку. Вместо «192.168.1.1» подставьте ip-адрес вашего сервера с репозиторием. Такой файл, если указать его для любой зоны, будет "возвращать" пользователю ip-адрес «192.168.1.1» на саму зону и любые поддомены.
применяем настройки командой
Для того, чтобы быть в курсе официальных новостей, можно подписаться на рассылку [10].
Можно собирать следующую статистику:
- Загрузка канала (upload, download);
- Версии ОС (apt при закачке "подписывается", например: "Ubuntu APT-HTTP/1.3 (0.7.20.2ubuntu6)" — это 9.04)
- Количество уникальных ip-адресов за сутки
Текст доступен на условиях лицензии Creative Commons Attribution/Share-Alike
Краткое описание руководства
Репозиторий — это хранилище пакетов с программным обеспечением. Подробности о репозиториях можно прочитать в соответствующей статье.
Собственный репозиторий нужен для установки программ на компьютеры, не имеющие доступа в интернет. Если доступ в интернет у вас есть, и вы хотите сэкономить время и трафик при установке программ на множество компьютеров, то лучше использовать кэширование (проксирование) репозиториев.- По возможности тут будут собраны все основные способы зеркалирования, создания и распространения репозиториев.
Получение репозиториев
- описание.
Способ №1. При помощи debmirror
Способ №2. При помощи ubuntu-repository.exe
Многих также интересует вопрос «Какой размер репозитория ubuntu» и «как удалить старые версии пакетов репозитория ubuntu»?
0.Требования к запуску программы. Практически такие же как и у автора программы.
Ubuntu 10.10 - Нужен пакет Mono. Запускать можно через консоль «mono ubuntu-repository.exe».1.Как узнать размер скачиваемого репозитория? Моя программа позволяет в интерактивной форме узнать размеры репозитория и отдельных его частей.
Выбираете компоненты распространения (вторая колонка).2. Как скачать Ubuntu репозиторий? Данная программа может скачать ubuntu репозиторий с опциональным выбором его частей.
Выбираете компоненты распространения (вторая колонка).3. Как удалить устаревшие пакеты из скачанного репозитория? Такой вопрос часто возникает когда вы несколько раз обновили репозиторий с помощью другой программы, но она забыла удалить устаревшие пакеты. А по причине огромного размера репозитория сделать это вручную очень-очень долго.
Нажать кнопку «Обзор» и выбрать корневую папку репозитория. (в ней должны быть папки «dists» и «pool») Нажать кнопку «Удалить старые пакеты». Дождаться окончания сканирования пакетов в репозитории (окно может зависнуть, потому что ещё не успел распаралелить процессы), и дождаться окончания сканирования пакетов в папке «pool» (Процесс ещё более долгий… :( ) Откроется окошко о результатах предварительного сканирования. Согласившись с вопросом о начале Удаления, ждём окончания работы программы. Находятся все Packages.gz в файле Release в корне репозитория и из каждого архива вынимаются все ссылки на файлы. Потом для каждого файла из первого списка ищется соответствие во втором списке. Если находится, то файл не трогается. Если не находится, то файл физически удаляется.Данная функция программы тоже полностью Portable.
-Исправлена ошибка при удалении старых пакетов (удалялся один пакет)
+При удалении старых пакетов пустые папки теперь удаляются
Создание "доверенного" репозитория
- Описание, зачем это нужно.
Распространение репозитория
- описание.
Прокси репозитория
Репозиторий на CD/DVD
APTonCD
Вручную через debmirror
Описана последовательность действий для lucid (10.04) в других версиях некоторые шаги могут не понадобиться или наоборот - потребоваться что-то ещё.
1. Скачиваем зеркало с сайта: (в созданый для этого каталог, ессно)
Если надо сырцы убираем ключ —nosource.
Если не надо amd64 убираем соответственно ,amd64
или через консоль
После этого в домашнем каталоге появится файл
/ubuntu_packages_popularity.txt, в котором содержится список пакетов, отсортированный по убыванию популярности. На следующем шаге мы подсунем его debpartial. Таким образом, все самые необходимые пакеты окажутся на первых двух-трех DVD.
4. Готовим каталоги дисков:
Соответственно, если нужен amd64 то замените слово i386 на него. Если на предыдущем шаге вы создали список популярности пакетов, то нужно указать debpartial обрабатывать пакеты по порядку в соответствии с ним - добавьте опцию –include-from=имя файла
5. Создаём скрипт ruby для копирования пакетов по дискам.
Любым текстовым редактором. Вот его содержимое, которое необходимо туда скопировать:
Я не нашёл, как делать спойлеры в этой вики, сверните кто-нибудь этот код под спойлер, плиз!
6. Распихиваем пакеты по дискам вышесозданным скриптом:
И так далее. Зависит от того, сколько у вас создалось каталогов-дисков в ls ubuntu-dvd/
7. Создаём идентификаторы дисков чтобы apt(synaptic) не ругался:
В этих каталогах надо создать файл info со следующим содержанием:
Можно написать что-нибудь свое. Номер DVD-X соответственно менять.
8. И наконец последний шаг. Закатываем пакеты в образы:
Чтобы потом не запутаться надо где-то отметить дату копирования зеркала и архитектуру.
Не забывайте изменять цифры дисков в процессе создания образов и копирования.
Для автоматизации выдрать всё используемое из истории команд bash и вписать в один файл-скрипт.
Если что-то из ваших скриптов не запускается не забывайте про chmod +x filename
При нехватке места на диске можно немного сэкономить место, используя симлинки вместо копирования. Однако они могут некорректно прочитаться. Таким вот образом:
Внимательно смотрим на выхлоп раби скрипта. В идеале должно быть что-то подобное:
Т.е. все файлы у нас скопировались нормально.
Долгой жизни и процветания. — darkshvein 08.08.2010 12:14
FIXME - тут старая статья - пока не измененная
Если нужно создать локальный репозиторий, то делаем следующее.
Устанавливаем пакет dpkg-dev (содержит нужную нам утилиту dpkg-scanpackages)
Создаём директорию, в которой будут храниться deb-пакеты. Например
Копируем туда все свои пакеты и пакеты из кэша (их там может не быть, но в любом случае, лишним не будет)
Переходим в нашу новую директорию с пакетами и собираем файл Packages.gz (хранит список пакетов и информацию о них, необходим для работы пакетных менеджеров с репозиторием)
Теперь можно скопировать директорию Packages на любой носитель, например флешку (если это нужно)
И в любое место добавляем нужную строку. В общем виде путь выглядит так: deb file:/путь/к/пакетам ./ . Примеры:
Также репозиторий можно добавить с помощью Synaptic: Система - Администрирование - Источники приложений - ПО сторонних производителей - Добавить.
При тестировании плейбуков на чистой Ubuntu (а как же еще?) самые большие накладные расходы по времени (субъективно) и уж точно самые большие по трафику уходят на установку пакетов из системного репозитория. Особенно это заметно, когда видишь, что один и тот же тест Travis CI прогоняет в 1.5 раза быстрее.
Tl;dr: не делайте локальный репозиторий через apt-mirror для мелких задач, не стоит оно того. Вместо этого нужно поднять кеширующий сервер через apt-cacher-ng.
Настройка apt-mirror
Для синхронизации локального репозитория с основным вариант один - apt-mirror . Официальный сайт считает нас умными, поэтому все его инструкции заключаются в 3 строчках:
Все действительно почти так просто. Почти.
Выбор самого быстрого репозитория
Пакета нет в репозитории Ubuntu, поэтому качаем из репозитория Debian В результате вы получите список из 3 самых быстрых (по пингу) репозиториев:
Конфигурация
Это же в виде команд:
Добавляем в cron задание по обновлению репозитория, я буду запускать в 1 ночи:
Настраиваем nginx на отдачу репозитория, у меня конфиг такой:
Все готово, осталось запустить apt-mirror и подождать денек: у меня выкачивалось 142 Гб. Причем обновления тоже будут весить ощутимо, как я понял: через день я запустил apt-mirror еще раз, он скачал 1.5 Гб.
После этого можете сменить системные репозитории в ваших локальных убунтах и наслаждаться скоростью.
date = “Ошибка” slug = “Ошибка/why-you-should-not-use-apt-mirror-for-ansible-tests-in-docker” Хотя нет, насладиться сразу конечно не получилось. По какой-то причине (наверное причина в месте на диске), apt-mirror выкачивает только amd64 пакеты, из-за чего apt-get update ругается:
Казалось бы ничего страшного, но уверен, что в тестах ненулевой код выхода apt-get будет все останавливать, поэтому придется чинить.
Решение напрашивается: явно указывать в sources.list , что в репозитории только amd64 пакеты, то есть вместо:
С настройкой apt-mirror закончили, перейдем к использованию в тестах.
Переключение Docker контейнера на локальный apt репозиторий
- [Плохой способ] Подмена через DNS
- [Хороший способ] Подмена /etc/apt/sources.list
Я выбрал хороший. Делается это монтированием файла на место /etc/apt/sources.list :
Чтобы не тащить с собой артефакты, файл создается командой.
После этого проверяем, это должно отработать нормально:
Если readlink выдает ошибку readlink: illegal option -- f , тогда вы скорее всего сидите на MacOS и вам нужно сделать brew install coreutils и прописать в переменную PATH то, что он просит.
Сравнение скорости
Я потратил около 4 часов на то, чтобы настроить локальные репозитории, посмотрим, сколько я сэкономил времени. Скорость инета у меня 30 мбит.
Я сравнил отработку time molecule test на 3 ansible ролях, вот результаты:
Роль | Стандартный репозиторий | Локальный репозиторий | Travis CI: |
---|---|---|---|
ansible-role-common | 8:04 | 6:18 | 4:32 |
ansible-role-mysql | 3:41 | 3:22 | 3:46 |
ansible-role-zsh | 3:29 | 2:54 | 4:08 |
Как видно, прирост небольшой, всего 20-30%. UPD 26.02.2017: на при написании статьи про apt-cacher-ng я перепроверил результаты и разница сократилась до 10-20%.
Тут надо заметить, что в test входит проверка идемпотентности, где никакие пакеты не ставятся. Тогда я сравнил время выполнения ‘molecule converge’ для ansible-role-mysql и получил немного лучшие результаты: 2:30 против 3:17, это уже почти в 2 раза быстрее.
Роль | Стандартный репозиторий | Локальный репозиторий |
---|---|---|
ansible-role-common | 8:15 | 6:09 |
ansible-role-mysql | 3:17 | 2:30 |
ansible-role-zsh | 4:05 | 2:43 |
Выводы по поводу apt-mirror
Результаты меня немного расстроили. Оказалось, что поразительного прироста в скорости, на который я надеялся, не будет.
Плюсы:
- один раз потратил время, чтобы при каждом тесте ждать меньше
- уменьшает желание тестировать не на чистой машине
- интернет-канал не занимается в рабочее время
Минусы
- эффект слабый, 20-30%
- сложности с пробросом файла sources.list
- уход от стандартной конфигурации Gitlab CI
- разные конфиги для Travis CI и Gitlab CI
На основе этого сделал для себя вывод: это подходит только для локального постоянного применения, в остальных случаях минусы перевешивают.
Что-то тут не так…
После этого я задумался: а как делают “большие”? Из серьезных решений для локальных репозиториев я знаю только Artifactory. Пошел посмотреть, как у них обстоят дела с зеркалами и нашел: они умеют быть зеркалом, но не рекоменуют их так использовать, т.к. это неэффективно. Вместо этого они предлагают пользоваться ими как кеширующим сервером. Такие дела…
UPD 26.02.2017: перешел на использование apt-cacher-ng, в моем случае он лучше по всем параметрам, подробности читайте в продолжении
Читайте также: