Как создать локальный репозиторий ubuntu. Создаём локальный репозиторий из deb-пакетов. Подпись локального репозитория своим ключом

06.12.2021

Вместо использования dpkg -i package_name.deb для установки, можно создать локальный репозиторий для пакетов, принесенных на флешке или другом носителе, а потом использовать synaptic/kynaptic (или apt-get install package_name).

1. Все действия лучше проводить как root

sudo su

2.Теперь установите пакет dpkg-dev. Он будет содержать утилиту dpkg-scanpackages, которая нам и нужна.

apt-get install dpkg-dev

3.Поместите все.deb пакеты в директорию например, /myrepo (причем не непосредственно в эту директорию, а в поддиректории, расположенные в этой директории)

4. Выполните

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

5. Теперь нужно внести новый репозиторий в /etc/apt/sources.list. Вставьте в /etc/apt/sources.list строчку (лучше вставить ближе к началу, т.к. apt-get (synaptic/kynaptic) ставит более высокий приоритет источнику, находящемуся раньше остальных)

deb file:/myrepo ./

6. Обновление списка репозиториев

apt-get update

Если изменится содержимое директории с пакетами, повторите шаги 1,4.

Для системных администраторов данная тема является чуть ли не первоочередной по важности. Ведь обычно любая организация, заботясь о безопасности и надёжности работы своих серверов и вообще сетей, разрабатывает и внедряет определённые политики безопасности. Которые, в свою очередь, предусматривают ограничения на доступ в открытый интернет для большинства клиентских машин из локальной сети. Однако и без этого никак нельзя, поскольку при их обслуживании необходимо проводить обновления программного обеспечения (ПО). Распространение этих обновлений при помощи сменных носителей очень неудобно, а при наличии большого числа компьютеров в обслуживаемой локальной сети практически невозможно. В данном случае, рациональным вариантом является организация локальных репозиториев пакетов, предварительно загруженных из Интернет. О двух основных подходах при решении данной задачи на примере систем Ubuntu будет далее изложено в данной статье.

Как работают репозитории пакетов в системах Linux?

Разработчики для поддержки своих дистрибутивов и комфортной работы пользователей снабжают (СУП) специальными ссылками. Они указывают на удалённые сервера, на которых хранятся самые актуальные и протестированные разработчиками пакеты ПО для данного дистрибутива. Благодаря этим ссылкам СУП «знает» когда и откуда загрузить и установить обновления пакетов. Эти ссылки могут указывать как на удалённый ресурс, так и на локальный. Во втором случае это может быть как другой компьютер в локальной сети, так и локальный накопитель и/или даже, если постараться - оптический привод.

Deb http://ru.archive.ubuntu.com/ubuntu/ bionic universe

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

Deb https://repos.codelite.org/ubuntu/ bionic universe

Это репозиторий, созданный разработчиком среды разработки CodeLite, специально для Ubuntu. И эта ссылка была добавлена в файл sources.list уже вручную самим пользователем-администратором компьютера. После чего становится возможной автоматическая установка актуальных и стабильных версий пакетов CodeLite, а также их обновление. А вот так может выглядеть ссылка на репозиторий, хранимый на оптическом носителе:

Deb cdrom:/ bionic main multiverse restricted universe

Как видно, ключевым словом, определяющим протокол доступа является значение, следующее после «deb». Для оптического носителя это «cdrom», а для доступа по сети - «https».
Получается, что источники репозиториев можно дополнять по собственному усмотрению, предварительно организовав соответствующим образом хранилище пакетов.

Использование прокси для организации локального репозитория

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

  • на какой-либо клиентской машине в обычном порядке запрашивается какой-либо пакет для установки/обновления через компьютер-сервер;
  • запрошенный пакет скачивается сервером, сохраняется в специально отведённом хранилище-кеше и далее становится доступным всем остальным клиентам;
  • в качестве распространителя пакетов клиентам выступает веб-сервер Apache, поэтому его установка обязательна.

Итак, для начала необходимо установить всё необходимое, т. е. веб-сервер и саму утилиту кеширования пакетов:

$ sudo apt-get install apache2 apt-cacher

При установке apt-cacher будет показан диалог настройки, в котором можно настроить нужное поведение утилиты, например задать автозапуск и работу в режиме демона. Также эти и некоторые другие важные настройки можно сделать (например с помощью редактора ) в конфигурационном файле /etc/default/apt-cacher . Для включения автозапуска apt-cacher нужно установить параметр AUTOSTART в значение «1»:

$ sudo nano /etc/default/apt-cacher . . . # Set to 1 to run apt-cacher as a standalone daemon, set to 0 if you are going # to run apt-cacher from /etc/inetd or in CGI mode (deprecated). Alternatively, # invoking "dpkg-reconfigure apt-cacher" should do the work for you. # AUTOSTART=1 . . .

$ sudo nano /etc/apt-cacher/apt-cacher.conf . . . ## Uncomment and set the IP range ## allowed_hosts = 192.168.1.105 - 192.168.1.125 #denied_hosts = . . .

Как можно видеть, просто указывается диапазон нужных IP-адресов. После сохранения сделанных настроек необходимо перезапустить веб-сервер Apache:

$ sudo service apache2 restart

$ sudo systemctl restart apache2

Теперь необходимо указать клиентам, куда им нужно обращаться для установки пакетов и обновлений. Для этого на клиентских машинах нужно создать файл /etc/apt/apt.conf.d/01proxy с помощью того же редактора nano:

$ sudo nano /etc/apt/apt.conf.d/01proxy

И добавить в него строку со следующей инструкцией:

Acquire::http::Proxy "http://192.168.1.100:3142";

Здесь в качестве адреса сервера, на котором установлен и работает apt-cacher указывается 192.168.1.100. Конечно, это может быть любой другой адрес, настроенный для этого сервера.

Теперь можно проверить работу локального репозитория (а точнее удалённого, но доступного через прокси), выполнив команду обновления данных о доступных пакетах:

$ sudo apt-get update

APT-MIRROR – полноценный локальный репозиторий

Данный способ является более «продвинутым» по сравнению с использованием apt-cache. Поскольку предполагает наличие полноценного хранилища пакетов прямо на локальном компьютере/сервере или в локальной сети. Но сначала такое хранилище необходимо создать, загрузив в него все необходимые пакеты. Как и в случае с apt-cache , в качестве распространителя пакетов выступает веб-сервер . Порядок настройки локального репозитория при помощи утилиты apt-mirror следующий:

  1. установка необходимых пакетов: apt-mirror и apache2;
  2. создание локального хранилища и настройка источников для загрузки, загрузка пакетов в хранилище;
  3. открытие доступа к готовому хранилищу для клиентов;
  4. настройка клиентов для использования локального репозитория.

Итак, установка необходимых утилит и пакетов:

$ sudo apt-get install apache2 apt-mirror

$ sudo mkdir /localrepo

Теперь в конфигурационном файле /etc/apt/mirror.list нужно отредактировать строку с инструкцией «set base_path». Указав в ней только что созданный каталог для хранилища:

$ sudo nano /etc/apt/mirror.list ############ config ################## # set base_path /localrepo

Далее, в этом же файле можно добавить необходимые репозитории, с которых будут загружены пакеты. Можно скопировать все стандартный репозитории из /etc/apt/sources.list .
Сохранив настройки можно запустить загрузку пакетов командой:

$ sudo apt-mirror

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

После того, как локальный репозиторий будет полностью загружен, его содержимое должно быть примерно следующим:

$ ls /localmirror mirror skel var

Для последующего удобства настройки клиентов полезно создать на хранилище, которое содержится в каталоге mirror:

$ cd /localrepo $ sudo ln -s /localrepo/mirror/us.archive.ubuntu.com/ubuntu/ ubuntu

Теперь ссылка ubuntu будет использоваться для задания репозиториев на стороне клиентов с помощью редатирования файла /etc/apt/sources.list:
Открыв этот файл (с использованием команды ) с помощью редактора nano, нужно теперь добавить в него следующие репозитории:

Deb http://192.168.1.100/ubuntu trusty universe deb http://192.168.1.100/ubuntu trusty main restricted deb http://192.168.1.100/ubuntu trusty-updates main restricted . . .

Здесь адрес 192.168.1.100 - это IP-адрес компьютера, на котором был создан и настроен локальный репозиторий.
Теперь, для работы с пакетами можно использовать обычные команды apt:

$ sudo apt-get update $ sudo apt-get install имя_пакета

Заключение

В заключение следует напомнить, что способы организации локальных репозиториев, описанные выше подходят для систем на базе формата debian-пакетов. Для систем, основанных на RPM следует использовать другие инструменты.

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter .

Постепенный перевод предприятия на 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 : Прошу прощения за отсутствие прилагаемых изображений, но в данном случае считаю их наличие просто неуместным.

    Для того, чтоб можно было если вдруг что случится с системой 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-пакеты на одном компьютере, а устанавливаем их на другой.

    Как известно, в 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