Создание локального репозитория ubuntu. Создание "правильного" локального репозитория (не зеркало)

💖 Нравится? Поделись с друзьями ссылкой

Недавно наткнулся на утилиту reprepro . Она помогает создавать локальный репозиторий deb-based дистрибутивов. Тут та меня осенило. Я давно собираю пакеты которых нет в официальных архивах потому каждый раз прогибаться по ним и устанавливать стало в падлу и я решил создать раздел с хранящимися там репозиториями таких пакетов. Так что бы при смене системы просто под монтировать его и пользать по надобности. Вещь как мне кажется полезнее чем сохранять кеш из apt-get.


Кратко о reprepro
Необходимо создать директорию для репозитория. У меня выбор падает на /repository потому для работы нужны права суперпользователя. А в принцепе если права записи на этот каталог будут только у администратора то есть большая вероятность что никто посторонний не сможет навредить вашему "архиву"
# mkdir /repository
переходим туда:
Создаем папку /repository/conf/ для конфигурационных файлов
# mkdir /repository/conf

Создаем файл , добавляя нужные секции (подробнее об этом можно почитать в выводе команды man reprepro в разделе CONFIG FILES)
# mousepad /repository/conf/distributions
В оригинале текста объяснения автор предоставляет такой пример этого файла


Origin: Debian
Suite: testing
AlsoAcceptFor: unstable experimental
Codename: lenny
Version: 5.0
Architectures: i386 source
Components: main contrib non-free
UDebComponents: main contrib non-free
Description: my local repository
где:
Origin - Имя дистрибутива = Debian
Suite - ветка = testing
AlsoAcceptFor - позволяет "засовывать" в репозиторий тестинга пакеты для других веток = unstable experimental, если опция не указана, то будет ругаться вот так при попытке добавить пакеты из анстэбл/экспериментал веток.
Codename - кодовое имя ветки = lenny
Version - версия ветки = 5.0
Architectures - архитектуры, у меня x86 процессор, соответственно есть i386, также иногда закидываю в репозиторий исходники, поэтому есть source
Components - разделы ветки, куда можно поместить deb-пакеты, а также исходники = main contrib non-free (можно еще насоздавать, сколько угодно)
UDebComponents - разделы ветки, куда можно поместить udeb-пакеты (бывают и такие) = main contrib non-free (лучше, когда совпадают со строкой выше)
Description - краткое словесное описание репозитория = например, my local repository

Если каталог репозиторий не являеться текущим то в строке команды прописывают так называемую BASEDIR опции -b BASEDIR (в моем случае BASEDIR=/repository ).

После создания файла /repository/conf/distributions инициализацируем репозиторий
# reprepro export
# reprepro createsymlinks

Можно репозиторий заполнять пакетами. Для этого существует множество команд и опций, подробнее о которых можно узнать в man reprepro
Наиболее употребляемые

Добавление deb-пакета в репозиторий.
В общем виде выглядит так:
# reprepro -b BASEDIR -C РАЗДЕЛ includedeb ВЕТКА /путь/до/файла/имя_файла.deb
Как я и описывал раньше это пример добавления пакета не из каталога с репозиторием, а из произвольного каталога. Если вы находитесь в каталоге репозитория то команда выглядит так же но без -b BASEDIR
К примеру, для добавления пакета foo_1.0.deb , находящегося в папке /home/user/debian , в раздел main ветки lenny команда будет иметь следующий вид
# reprepro -b /repository -C main includedeb lenny /home/user/debian/foo_1.0.deb

Удаление deb-пакета из репозитория
Для удаления одного deb-пакета из указанной ветки репозитория нужно дать такую команду
# reprepro remove ветка имя_пакета

К примеру, для рассмотренного пакета foo_1.0.deb , находящегося в ветке lenny даем такую команду:
# reprepro remove lenny foo

Для использования репозитория нужно добавить его в файл /etc/apt/sources.list в виде следующей строки (в общем виде):
deb file:///путь_к_папке_репозитория/ ветка разделы

Что для нашего примера будет выглядеть так:
deb file:///repository/ lenny main contrib non-free

Это базовое что я считаю достаточно в моем случае. Статья оригинала находиться

Как известно, в Ubuntu реализовано централизованное хранение информации обо всех основных программах в одном месте, для более удобного поиска и последующей их установки. Этим местом является менеджер пакетов Synaptic. (Система -> Администрирование -> Менеджер пакетов Synaptic) Для инсталляции программы вам необходимо её только найти в списке и отметить для установки, далее программа будет автоматически скачана из интернета и установлена.

Основные программы, которые могут пригодиться при работе в ОС Ubuntu, хранятся в так называемом репозитории на официальном сервере Ubuntu. Каждый раз, когда вы отмечаете для установки ту или иную программу в менеджере пакетов Synaptic, она сперва скачивается.

Но что делать, если у вас очень медленный или дорогой интернет, или может у вас вообще отсутствует доступ во всемирную сеть, или вы просто не хотите зависеть от подключения к интернету работая в Linux Ubuntu? Можно, конечно, скачать все необходимые программы (пакеты) по одной, а потом вручную устанавливать, но кто знает, какая программа вам пригодится в дальнейшем?

Решением данной проблемы является создание локального репозитория, т.е. полной или частичной копии официального репозитория у себя на жестком диске. Таким образом, однажды скачав весь репозиторий, у вас больше не будет зависимости от интернета.

Итак, приступим.

1. Для создания копии (среза) репозитория у себя на жестком диске, существует специальная программа: debmirror. Соответственно, для начала вам её необходимо установить из того же менеджера пакетов Synaptic

или набрав команду в терминале:

sudo apt-get install debmirror

2. Создаём папку в домашней дирректории, в которой будет храниться срез репозитория (или даже несколько), к примеру, назовём её Repositories.

Перейдём в папку Repositories:

и создадим в ней файл скрипта с именем archive.ubuntulinux.org.sh:

gedit archive.ubuntulinux.org.sh

Вставляем в этот файл следующее:

#!/bin/bash -x
/usr/bin/debmirror --nosource -m --passive --host=archive.ubuntulinux.org \
--root=ubuntu --method=ftp --progress \
--dist=hardy,hardy-security,hardy-updates,hardy-backports \
--ignore-release-gpg --section=main,restricted,multiverse,universe \
--arch=i386 /полный/путь/к/папке/куда/нужно/скачать/репозиторий/

полный путь у вас должен выглядеть примерно следующим образом: /home/aidsoid/Repositories/ru.archive.ubuntu.com/

и сохраняем его. После сохранения нужно сделать файл запускаемым (chmod +x archive.ubuntulinux.org.sh).

Приведённый выше пример будет выкачивать репозиторий для Ubuntu 8.04 (Hardy Heron), если вы всё еще используете старую версию Ubuntu 7.10 (Gutsy Gibbon), то вам необходимо немного подправить этот скрипт, в частности, необходимо изменить значения параметра --dist с hardy на gutsy. Также следует обратить внимание на параметр --arch, который указывает на архитектуру вашего компьютера, значение i386 говорит о том, что будут скачаны пакеты для компьютера с архитектурой x86. Этот параметр также может принимать значение amd64 для 64-битных AMD или Intel компьютеров.

4. Ну вот, собственно говоря и всё, теперь можно запускать скрипт на выполнение, для этого в консоли, находясь в папке Repositories, наберите следующую команду:

./archive.ubuntulinux.org.sh

Скрипт начнёт свою работу. Весь репозиторий занимает около 20-30 Гигабайт, так что перед скачиванием обеспечьте свободное место на диске. В любой момент можно безболезненно прервать работу скрипта, нажатием сочетания кнопок Ctrl+C. При повторном запуске скрипта, он продолжит скачивание недокачанных пакетов. Также повторный запуск скрипта позволит обновить ваш локальный репозиторий, т.е. проверяется наличие новых версий программ и они также выкачиваются.

Примечание: пользователей Ubuntu 7.10 ожидает один маленький подводный камень, пользователям Ubuntu 8.04 беспокоиться не о чем. Существует ошибка в debmirror’е, из-за которой при повторном запуске скрипта удаляется папка pool из локального репозитория. Её необходимо исправить перед запуском скрипта. Описание ошибки тут: https://bugs.launchpad.net/ubuntu/+source/debmirror/+bug/136634

Лечится ошибка просто:
$ sudo gedit /usr/bin/debmirror
заменяете в редакторе строку local $/="\n\n"; на local $/="\n"; и сохраняете файл. Теперь обновление репозитория пройдёт без происшествий.

5. После того как скрипт скачается (это может занять длительное время), вы сможете использовать его, добавив deb строку в источники приложений. (Система -> Администрирование -> Источники приложений)

deb строка должна указывать на папку с репозиторием и выглядит примерно следующим образом:
deb file:///home/aidsoid/Repositories/ru.archive.ubuntu.com/ hardy main restricted multiverse universe

В данной статье мы рассмотрим, как создать новый пустой Git репозиторий. Мы создадим локальный репозиторий, а также рассмотрим, как создать удаленный репозиторий на примере Github.

Как создать новый пустой репозиторий

Создайте пустую директорию для вашего будущего репозитория и перейдите в нее:

Mkdir myproject cd myproject

Теперь, чтобы создать в нашей директории новый репозиторий, выполните команду:

Git init

В результате будет создан новый локальный пустой репозиторий. На экран будет выведено сообщение вида:

Initialized empty Git repository in /path/to/myproject/.git/

В директории myproject появится скрытая папка .git . Ее можно увидеть, выполнив команду ls -al

Как создать репозиторий из существующих файлов

Предположим, что у вас уже есть какой-то проект, для которого вы хотите создать Git репозиторий. Создание репозитория выполняется точно также, как описано выше. Перейдите в папку проекта:

Cd myproject

Создайте репозиторий:

Git init

Теперь можно добавить все файлы в индекс и сделать первый коммит:

Git add -A git commit -m "First commit."

Как создать удаленный репозиторий (на примере Github)

Вы создали локальный репозиторий, теперь, например, вам нужно добавить его на Github, тем самым вы фактически создадите удаленный репозиторий.

Перейдите на https://githib.com и войдите в свой аккаунт. Нажмите кнопку New repository (Новый репозиторий). На открывшейся странице введите имя репозитория (Repository name ) и нажмите кнопку Create repository .

В своем локальном репозитории теперь выполните команду:

Git remote add origin https://github.com/username/myproject.git

Данная команда добавит удаленный репозиторий с именем origin , который указывает на ваш Github-репозиторий . Пока мы только добавили запись об удаленном репозитории.

Теперь можно выполнить команду git push , чтобы отправить все ваши изменения на удаленный репозиторий:

Git push -u origin master

Вам нужно будет ввести логин и пароль аккаунта в Github. Результат команды будет примерно следующим:

$ git push -u origin master Username for "https://github.com": [email protected] Password for "https://[email protected]@github.com": Counting objects: 4, done. Delta compression using up to 4 threads. Compressing objects: 100% (2/2), done. Writing objects: 100% (4/4), 252 bytes | 252.00 KiB/s, done. Total 4 (delta 0), reused 0 (delta 0) remote: remote: Create a pull request for "master" on GitHub by visiting: remote: https://github.com/username/myproject/pull/new/master remote: To https://github.com/username/myproject.git * master -> master Branch "master" set up to track remote branch "master" from "origin".

В команде git push мы использовали ключ -u . Данный ключ используется для того, чтобы связать локальную ветку master с удаленной origin/master (в нашем случае удаленной ветки не существовало, она автоматически была создана). Так как связь установлена, то последующие выполнения git push из ветки мастер можно выполнять без указания веток. То есть вместо git push origin master ), можно просто выполнять команду git push .

Для того, чтоб можно было если вдруг что случится с системой Linux не скачивать программы заново, а установить из того что уже скачали.

Вот я и подумал, как бы сделать так чтоб эти самые скачанные программы мы могли бы устанавливать самым обычным образом при помощи команды apt-get ? Размышляя о этом я пришёл к мысли о том, а почему бы с этих самых пакетов не создать локальный репозиторий? Подумал, погуглил, взял главный инструмент системного администратора, админский бубен и начал делать.

Итак deb-пакеты у меня находятся там же где я их и оставил, до того как в качестве эксперимента переустановил систему, а именно в домашней директории в папке deb . У меня это /home/dante/deb , я описывал все это , у Вам же та директория куда Вы сохранили пакеты. Открываем терминал и переходим в папку с deb-пакетами. В моём случае в терминале команда выглядит так:

cd /home/dante/deb

Вы же должны ввести путь к своим deb-пакетам.
После того как Вы перешли в папку с сохранёнными deb-пакетами. Вводим следующую команду:

sudo apt-ftparchive packages ./ |gzip -9 > Packages.gz

Далее вводим пароль и ожидаем пока будет создан фаил Packages.gz
Теперь наш репозиторий практически задан, осталось его добавить в source.list . Обратно беремся за терминал. Открываем файл:

sudo nano /etc/apt/sources.list

У меня данный файл выглядит так:

deb file:///home/dante/deb ./
# deb cdrom:/ oneiric main restricted

# See http://help.ubuntu.com/community/UpgradeNotes for how to upgrade to
# newer versions of the distribution.
deb http://archive.ubuntu.com/ubuntu oneiric main restricted
deb-src http://archive.ubuntu.com/ubuntu oneiric restricted main multiverse universe #Added by software-properties

## Major bug fix updates produced after the final release of the
## distribution.
deb http://archive.ubuntu.com/ubuntu oneiric-updates main restricted
deb-src http://archive.ubuntu.com/ubuntu oneiric-updates restricted main multiverse universe #Added by software-properties


## team. Also, please note that software in universe WILL NOT receive any
## review or updates from the Ubuntu security team.
deb http://archive.ubuntu.com/ubuntu oneiric universe
deb http://archive.ubuntu.com/ubuntu oneiric-updates universe

## N.B. software from this repository is ENTIRELY UNSUPPORTED by the Ubuntu
## team, and may not be under a free licence. Please satisfy yourself as to
## your rights to use the software. Also, please note that software in
## multiverse WILL NOT receive any review or updates from the Ubuntu
## security team.
deb http://archive.ubuntu.com/ubuntu oneiric multiverse
deb http://archive.ubuntu.com/ubuntu oneiric-updates multiverse

## N.B. software from this repository may not have been tested as
## extensively as that contained in the main release, although it includes
## newer versions of some applications which may provide useful features.
## Also, please note that software in backports WILL NOT receive any review
## or updates from the Ubuntu security team.
deb http://archive.ubuntu.com/ubuntu oneiric-backports main restricted universe multiverse
deb-src http://archive.ubuntu.com/ubuntu oneiric-backports main restricted universe multiverse #Added by software-properties

deb http://archive.ubuntu.com/ubuntu oneiric-security main restricted
deb-src http://archive.ubuntu.com/ubuntu oneiric-security restricted main multiverse universe #Added by software-properties
deb http://archive.ubuntu.com/ubuntu oneiric-security universe
deb http://archive.ubuntu.com/ubuntu oneiric-security multiverse

## Uncomment the following two lines to add software from Canonical"s
## "partner" repository.
## This software is not part of Ubuntu, but is offered by Canonical and the
## respective vendors as a service to Ubuntu users.
deb http://archive.canonical.com/ubuntu oneiric partner
deb-src http://archive.canonical.com/ubuntu oneiric partner

## This software is not part of Ubuntu, but is offered by third-party
## developers who want to ship their latest software.
deb http://extras.ubuntu.com/ubuntu oneiric main
deb http://archive.ubuntu.com/ubuntu/ oneiric-proposed restricted main multiverse universe
deb-src http://archive.ubuntu.com/ubuntu/ oneiric-proposed restricted main multiverse universe
deb-src http://extras.ubuntu.com/ubuntu oneiric main

Для того чтобы добавить нашу папку с deb-пакетами в источники приложений нам необходимо добавить следующую строчку.

deb file:///home/dante/deb ./

Добавлять её лучше в самый верх файла, так как система сначала опрашивает те репозитории которые находятся в начале. Что я как Вы уже увидели я и сделал. У вас путь к папке может быть иной, только не забудьте в конце ./

Все репозиторий добавлен. Можете посмотреть на это в источнике приложений. Теперь Вам осталось лишь обновить списки пакетов. Сделать это можно в терминале при помощи команды:

sudo apt-get update

Вот теперь Мы можем устанавливать программы из своего репозитория который мы создали из сохранённых deb-пакетов. Это ещё и достаточно удобно если мы скачивали deb-пакеты на одном компьютере, а устанавливаем их на другой.

Постепенный перевод предприятия на GNU/Linux порождает необходимость соответствующих изменений в инфраструктуре. Сегодня мы решаем проблему глобального обновления клиентских машин путем создания локального репозитория. Процесс изначально документировался как памятка на будущее, потому заранее прошу прощенья за возможные несуразности в тексте. Итак.
Для начала следует определиться, посредством чего лучше сделать это. Интернеты выделяют двух фаворитов rsync и debmirror . Выбрал последний, ввиду его большей гибкости.

1. Получение ключей

Для создания зеркала репозитория необходимо получить ключ «Ubuntu Archive Automatic Signing Key ». Для этого в терминале от суперюзера вводим:
gpg --no-default-keyring --keyring trustedkeys.gpg --recv-keys 437D05B5

2. Подготовка пространства

Создаем папку для репозитория:
sudo mkdir /path/to/repository
Важно! Потрудитесь проследить за наличием свободного места в указанном пути. Даже две архитектуры i386 и amd64 займут приличное его количество.

3. Получение пакетов

Зеркалирование проходит в три этапа:
  • Удаление неизвестных файлов (отключается опцией --nocleanup ниже);
  • Построение списка по индексным архивам и проверка на наличие в локальном репозитории.Для реализации вышеперечисленного создадим файл repo_update.sh со следующим содержанием.
  • #!/bin/sh
    #Это конфигурация нашего репозитория. В зависимости от параметров, указанных
    #здесь, мы получим нужное нам его содержимое.

    #Опция cleanup. Включена по умолчанию. После закачки пакетов удаляет ранние
    #версии. Для отключения опции необходим параметр --nocleanup
    clean=--nocleanup
    #Опция source. Закачивает исходные коды пакетов. Если вы не пользуетесь
    #исходными кодами для изучения и модификации приложений (что свойственно для
    #бинарных дистрибутивов), смело ставьте опцию --no-source
    src=--source

    #Host. Имя сервера, откуда мы берем пакеты.
    servername=mirror.yandex.ru

    #Root. Корневая директория на выбранном нами сервере.
    rdir=/ubuntu

    #Имя релиза Ubuntu. Настройки для 10.04 версии.
    release=lucid,lucid-backports,lucid-proposed,lucid-security,lucid-updates

    #Секции.
    section=main,restricted,universe,multiverse

    #Протокол синхронизации. Debmirror поддерживает следующие способы: http,
    #hftp, ftp, rsync
    sync_protocol=rsync

    #Архитектура. Если используются исключительно 32 или 64х битные системы.
    #Одну из архитектур можно убрать. Также если используются иные архитектуры,
    #их следует добавить.
    arch=i386,amd64

    #Местоположение репозитория. Указывайте локальную папку, созданную. в п 2.
    path=/path/to/repository

    Debmirror --progress --verbose $clean $src --md5sums --host=$servername --root=$rdir \
    --dist=$release -s=$section --method=$sync_protocol -a=$arch $path

    Теперь поместим его в директорию /usr/local/bin и сделаем исполняемым.
    chmod +x repo_update.sh
    sudo cp repo_update.sh /usr/local/bin/

    Далее запустим получившийся скрипт и дождемся завершения процесса. Процесс достаточно долгий. Время выполнения сильно зависит от ширины вашего интернет-канала.
    sudo /usr/local/bin/repo_update.sh
    Внимание! Размер скачиваемого переваливает за десятки гигабайт, а казеный интернет редко бывает безлимитным. Более того, debmirror чувствителен к стабильности соединения, 120 секунд простоя и все придется начинать сначала.

    4. Настройка web-сервера

    Дабы не совершать лишних плясок с бубном выберем протокол http , как традиционный метод предоставления доступа к репозиторию. Выбор web-сервера остается за Вами. Из фаворитов ngnix , apache и lighttpd , выбрал последний ввиду отсутствия опыта работы с оным (приятное с полезным, да). Итак.

    Установка сервера.

    Sudo apt-get install lighttpd
    Здесь все просто. Если Вы не планируете использовать в качестве www директории отличную от умолчания, то сервер в настройке не нуждается. Все, что сам нужно сделать, это создать символьную ссылку в директории /var/www
    ln -s /path/to/repository /var/www/ubuntu

    Проверим доступность репозитория из браузера: http:///ubuntu/

    5. Настройка клиентов

    Здесь мы применим маленькую хитрость. Дабы не вносить изменений в /etc/apt/sources.list  (мало ли что случится). Добавим в файл /etc/hosts пару строчек.
    ru.archive.ubuntu.com
    security.ubuntu.com
    Примечание. При наличии DNS сервера можно все это прописать в нем, а на сервере репозитория прописать истинные адреса вышеупомянутых имен.

    6. Автоматизация

    А теперь самое сладкое. Заставим все это крутиться самостоятельно.
    6.1 Серверная часть
    В пункте #3 мы создавали скрипт, при помощи которого получали пакеты. Настроим его автозапуск средствами демона cron .
    sudo crontab -e

    В который добавим заветную строчку:

    0 0 * * * /usr/local/bin/repo_update.sh
    Теперь ежедневно в 0:00 наш скрипт будет делать за нас всю рутинную работу.

    6.2 Клиентская часть
    На клиентах создадим скрипт system_upd.sh в директории /usr/local/bin следующего содержания:
    #!/bin/sh
    apt-get -y update && apt-get -y upgrade && apt-get -y clean

    Не забудем сделать его исполняемым.
    sudo chmod +x /usr/local/bin/system_upd.sh

    После чего открываем cron :
    sudo crontab -e

    И добавляем строчку:
    40 17 * * * /usr/local/bin/system_upd.sh

    Теперь каждый день в 17:40 система будет опрашивать наш репозиторий на предмет наличия обновлений и обновляться, если таковые будут найдены.

    Внимание! При работе с crontab следует не забывать, что после строчек с заданиями обязательно должна быть пустая строка, которая обозначается знаком "# ".
    p.s : Прошу прощения за отсутствие прилагаемых изображений, но в данном случае считаю их наличие просто неуместным.

    Рассказать друзьям