Специализированные репозитории для Debian своими руками. Самый полный мануал

Хабр, привет!

Сегодня говорим о Debian. Debian не нуждается в представлении — это один из самых популярных и востребованных дистрибутивов Linux. Несмотря на широкую доступность в интернете, крупные предприятия сталкиваются с проблемой использования дистрибутива в изолированных контурах обслуживания, что требует поднятия зеркала репозиториев внутри.

Однако в случае с Debian поднятие полного зеркала может осложняться объемом репозиториев — там по-настоящему много пакетов, включая и те, что обычно не нужны на серверах, например игры. Помимо этого, официальной поддержки Debian не существует, а работать как-то нужно. Поэтому в этой статье мы расскажем о способе создания готовых архивов для зеркал с урезанными подборками пакетов, нужных для установки и/или обновления одного или более серверов с известным набором ПО.

98521cc8a629f383f98ac6b5fcb77158.png

На создание этой статьи нас вдохновили два недавних случая. Так, нам нужно было развернуть репозитории с малым набором ПО для множества Debian-серверов. На втором проекте мы должны были учесть требования вендора — решения по соблюдению версии и подверсии Debian.

Подъем http-сервера, что раздает файлы из директорий, в этом тексте мы не рассматриваем. Скорее всего, если вы читаете нашу статью, он у вас давно поднят. Также за пределами нашего внимания остались детальная установка Debian на виртуальную машину, структура репозиториев и другие базовые операции. Но мы подробно расскажем и покажем, как правильно прописывать текущие общедоступные репозитории для старых версий Debian. И последнее — все примеры проведены на виртуальных машинах.

За дело!

Пример 1: Debian 12 amd64

1) Вам потребуется установленный и подключенный к интернету Debian 12 amd64 со всеми нужными репозиториями. Скачиваем с официального сайта: https://cdimage.debian.org/debian-cd/current/amd64/iso-cd/debian-12.8.0-amd64-netinst.iso.

Рекомендуем при установке на этапе выбора ПО взять только базовые пакеты и SSH-сервер, чтобы управлять ВМ по проброшенному SSH.

2) Используется вот такой полный набор зеркал без src и бэкпортов:

user@debian12:~$ cat /etc/apt/sources.list
deb http://deb.debian.org/debian/ bookworm main contrib non-free non-free-firmware
deb http://security.debian.org/debian-security bookworm-security main contrib non-free non-free-firmware
deb http://deb.debian.org/debian/ bookworm-updates main contrib non-free non-free-firmware
user@debian12:~$

Если хотите — используйте другие, если они содержат пакеты нужных версий.

3) Обновляем список репозиториев, ставим обновления от root или добавляем sudo перед каждой командой: apt-get update && apt-get upgrade

4) Создаем директорию и закачиваем туда MC (Midnight Commander — популярный двухпанельный консольный файловый менеджер с текстовым редактором, аналог Norton Commander) со всеми нужными зависимостями:

user@debian12:~$ mkdir mc
user@debian12:~$ cd mc
user@debian12:~/mc$ apt-get download $(apt-cache depends --recurse --no-recommends --no-suggests --no-conflicts --no-breaks --no-replaces --no-enhances --no-pre-depends mc | grep "^\w" | sort | uniq)
[несущественный вывод терминала удален, там просто процесс загрузки]
user@debian12:~/mc$ ls
gcc-12-base_12.2.0-14_amd64.deb          libpcre2-8-0_10.42-1_amd64.deb
libblkid1_2.38.1-5+deb12u2_amd64.deb     libselinux1_3.4-1+b6_amd64.deb
libc6_2.36-9+deb12u9_amd64.deb           libslang2_2.3.3-3_amd64.deb
libext2fs2_1.47.0-2_amd64.deb            libssh2-1_1.10.0-3+b1_amd64.deb
libffi8_3.4.4-1_amd64.deb                libssl3_3.0.15-1~deb12u1_amd64.deb
libgcc-s1_12.2.0-14_amd64.deb            mc_3%3a4.8.29-2_amd64.deb
libglib2.0-0_2.74.6-2+deb12u4_amd64.deb  mc-data_3%3a4.8.29-2_all.deb
libgpm2_1.20.7-10+b1_amd64.deb           zlib1g_1%3a1.2.13.dfsg-1_amd64.deb
libmount1_2.38.1-5+deb12u2_amd64.deb
user@debian12:~/mc$

Примечание: Зависимости обсчитываются автоматически скриптом выше как в Debian, так и в большинстве Linux. Программы обычно не содержат все нужные для работы компоненты в одном архиве как в установочном .exe на Windows, а делят их на множество пакетов. Это необходимо для того, чтобы при использовании двумя и более программами одной библиотеки она устанавливалась как общий файл. Это снижает затраты на место на файловой системе. А в случае нахождения уязвимостей их можно закрыть для всех программ в ОС сразу, а не выпускать обновления для каждой по отдельности.

5) Видим — MC скачался, как и все зависимости, что нужны ему для работы. Теперь преобразовываем этот набор файлов в репозиторий с помощью:

root@debian12:~# apt-get install dpkg-dev
[несущественный вывод терминала удален, там просто процесс установки ПО]

user@debian12:~/mc$ dpkg-scanpackages -m . > Packages
dpkg-scanpackages: info: Wrote 17 entries to output Packages file.
user@debian12:~/mc$ ls
gcc-12-base_12.2.0-14_amd64.deb          libpcre2-8-0_10.42-1_amd64.deb
libblkid1_2.38.1-5+deb12u2_amd64.deb     libselinux1_3.4-1+b6_amd64.deb
libc6_2.36-9+deb12u9_amd64.deb           libslang2_2.3.3-3_amd64.deb
libext2fs2_1.47.0-2_amd64.deb            libssh2-1_1.10.0-3+b1_amd64.deb
libffi8_3.4.4-1_amd64.deb                libssl3_3.0.15-1~deb12u1_amd64.deb
libgcc-s1_12.2.0-14_amd64.deb            mc_3%3a4.8.29-2_amd64.deb
libglib2.0-0_2.74.6-2+deb12u4_amd64.deb  mc-data_3%3a4.8.29-2_all.deb
libgpm2_1.20.7-10+b1_amd64.deb           Packages
libmount1_2.38.1-5+deb12u2_amd64.deb     zlib1g_1%3a1.2.13.dfsg-1_amd64.deb
user@debian12:~/mc$

6) Теперь остается нашу директорию ~/mc упаковать в архив и загрузить на файловый сервер, где у нас поднято зеркало:

user@debian12:~/mc$ cd
user@debian12:~$ tar cJf mc.tar.xz mc/
user@debian12:~$ file mc.tar.xz
mc.tar.xz: XZ compressed data, checksum CRC64
user@debian12:~$

7) После загрузки на зеркало адрес для нашего нового репозитория для серверов в локальной сети прописываем так:

deb [trusted=yes] http://your-mirror.domain.com/debian12/mc/ /

Точный адрес завит от того, какой у вас hostname зеркала и куда именно на нем вы распаковали созданный архив.

Пример 2: Debian 12.0 amd64

1) Чтобы в репозитории были все те же пакеты и их зависимости, как и на обновляемом хосте, получаем полный список установленных пакетов:

dpkg-query -l | tail -n +6 | awk '{print $2}' | tr '\n' ' '

2) ВМ и репозитории те же, что и в примере 1. Для того чтобы скачать все нужные пакеты, мы берем команду из примера 1 пункт 4 и меняем в ней mc на список пакетов из пункта 1 этого примера:

apt-get download $(apt-cache depends --recurse --no-recommends --no-suggests --no-conflicts --no-breaks --no-replaces --no-enhances --no-pre-depends bash nano прочее-что-нужно… | grep "^\w" | sort | uniq)

3) Зачастую при установке обновлений для ОС на amd64 (и на других архитектурах тоже, но там иначе называются) имеет смысл поставить пакеты linux-image-amd64 linux-headers-amd64 dkms gcc make — это метапакет на самое свежее ядро, заголовки к нему, а также DKMS и компиляторы, что нужно для некоторых драйверов, например nVidia, потому их можно добавить в список из пункта 1).

4) Если нужно и обновить ОС, и поставить дополнительное ПО, можно добавить в список из пункта 1) все, что угодно.

5) Если нужно подготовить обновления для нескольких серверов, с каждого из них собираем dpkg-query -l | tail -n +6 | awk '{print $2}', потом объединяем их в один текстовый файл, прогоняем его через sort | uniq | tr '\n' ' ' и получаем список для общего репозитория без дублей.

6) Теперь объединяем скачанные пакеты в репозиторий, запаковываем его в архив, распаковываем на зеркале в локальной сети и прописываем на серверах в локальной сети по аналогии с примером 1.

Пример 3: Debian 11 amd64

Основное отличие Debian 11 от 12-й версии заключается в том, что установочное .iso нужно скачивать из архива:   https://cdimage.debian.org/mirror/cdimage/archive/ https://cdimage.debian.org/mirror/cdimage/archive/11.11.0/amd64/iso-cd/debian-11.11.0-amd64-netinst.iso

Полный набор репозиториев выглядит так:

user@debian11:~$ cat /etc/apt/sources.list
deb http://deb.debian.org/debian/ bullseye main non-free contrib
deb http://security.debian.org/debian-security bullseye-security main contrib non-free
deb http://deb.debian.org/debian/ bullseye-updates main contrib non-free
user@debian11:~$

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

Важное примечание автора: для Debian версий 10 по 7 включительно уже закончилась обычная LTS-поддержка. При этом есть ELTS от компании Freexian, репозитории которой мы будем использовать ниже. Немного об этой компании: она выпускает обновления безопасности пакетов Debian, расширяя срок поддержки его выпусков с 5 до 10 лет. Подробнее можно почитать на сайте:  https://www.freexian.com/lts/

Пример 4: Debian 10 amd64

1) Так как срок основной поддержки этой версии уже закончился, нам нужно скачать из архивов .iso DVD: https://cdimage.debian.org/mirror/cdimage/archive/10.13.0/amd64/iso-dvd/debian-10.13.0-amd64-DVD-1.iso.

Учтите, что netinstall CD работает. Но, вероятно, репозитории скоро уберут в архив, из-за чего netinstall CD перестанет функционировать.

2) Сегодня репозитории с учетом ELTS (и отключением того, что прописывается с DVD) выглядят так:

user@debian10:~$ cat /etc/apt/sources.list
deb http://deb.debian.org/debian/ buster main non-free contrib
deb http://security.debian.org/debian-security buster/updates main contrib non-free
deb http://deb.freexian.com/extended-lts buster-lts main contrib non-free
user@debian10:~$

При этом понадобится скачать и поставить ключ. Подробная инструкция здесь: https://www.freexian.com/lts/extended/docs/how-to-use-extended-lts/

wget https://deb.freexian.com/extended-lts/pool/main/f/freexian-archive-keyring/freexian-archive-keyring_2022.06.08_all.deb && sudo dpkg -i freexian-archive-keyring_2022.06.08_all.deb

3) Обновляем список репозиториев, ставим обновление от root или добавляем sudo перед каждой командой: apt-get update && apt-get upgrade

4) Обновление на ядро ставим отдельно, как сказано в статье: https://www.freexian.com/lts/extended/docs/kernel-backport/

Или делаем сразу с заголовками и прочим, если драйвера на железо выдают такое требование, следующей командой от root или с sudo в начале: apt-get install linux-image-5.10-amd64 linux-headers-5.10-amd64 dkms gcc make

5) Как только основные репозитории уберут с основного зеркала в архив, придется прописывать их по аналогии с Debian 9 вручную в файл /etc/apt/sources.list

6) Создаем урезанные репозитории так же, как и в более новых версиях.

Пример 5: Debian 9 amd64

1) В Debian 9 в процессе установки добавление в /etc/apt/sources.list сетевых репозиториев, которые отправлены в архив, будет неизбежно выдавать ошибку. Поэтому прописываются только те, что обращаются к DVD. Скачать DVD можно из архива: https://cdimage.debian.org/mirror/cdimage/archive/9.13.0/amd64/iso-dvd/debian-9.13.0-amd64-DVD-1.iso

Ремарка автора: есть и установочный CD, но там нет SSH-сервера из коробки.

2) После установки заменяем репозитории на обновленные:

user@debian9:~$ cat /etc/apt/sources.list
deb http://archive.debian.org/debian/ stretch main contrib non-free
deb http://archive.debian.org/debian-security stretch/updates main contrib non-free
deb http://deb.freexian.com/extended-lts stretch-lts main contrib non-free
user@debian9:~$

Качаем и ставим ключ, как в статье Freexian: https://www.freexian.com/lts/extended/docs/how-to-use-extended-lts/

wget https://deb.freexian.com/extended-lts/pool/main/f/freexian-archive-keyring/freexian-archive-keyring_2022.06.08_all.deb && sudo dpkg -i freexian-archive-keyring_2022.06.08_all.deb

 3) Обновляем список репозиториев, ставим обновления от root или добавляем sudo перед каждой командой: apt-get update && apt-get upgrade

4) Обновление на ядро ставим отдельно: https://www.freexian.com/lts/extended/docs/kernel-backport/

Или сразу с заголовками, если драйвера на железо выдают такое требование, следующей командой от root или с sudo вначале: apt-get install linux-image-5.10-amd64 linux-headers-5.10-amd64 dkms gcc make

5) Создаем урезанные репозитории по примерам выше.

Примечание: у Debian 8 и 7, к сожалению, уже просрочены ключи к основным репозиториям. По этой причине в примерах ниже мы проигнорировали их проверку. Это не лучшее решение с точки зрения безопасности, но идеального пути в этом случае нет. Для Debian 8 можно использовать полное зеркало от Freexian с переподписанными ими пакетами: deb http://deb.freexian.com/extended-lts jessie main contrib non-free

Но разработчики просили так не делать, потому что это сильно перегружает их зеркало. Еще один путь решения: можно сменить дату в системе на ту, когда ключи еще не были просрочены, тогда проверка проходит как обычно. Тем не менее, решения без недостатков найти не вышло :(

Пример 6: Debian 8 amd64

1) В процессе установки добавление сетевых репозиториев, которые отправлены в архив, будет неизбежно выдавать ошибку. Поэтому прописываются только те, что обращаются к DVD. Скачать DVD можно из архива: https://cdimage.debian.org/mirror/cdimage/archive/8.11.1/amd64/iso-dvd/debian-8.11.1-amd64-DVD-1.iso

Ремарка автора: есть и установочный CD, но там нет SSH-сервера из коробки.

2) Меняем репозитории на обновленные:

user@debian8:~$ cat /etc/apt/sources.list
deb [trusted=yes] http://archive.debian.org/debian/ jessie main contrib non-free
deb [trusted=yes] http://archive.debian.org/debian-security jessie/updates main contrib non-free
deb http://deb.freexian.com/extended-lts jessie-lts main contrib non-free
user@debian8:~$

Скачиваем и устанавливаем ключ, как в статье Freexian: https://www.freexian.com/lts/extended/docs/how-to-use-extended-lts/

Применяем команду:

wget https://deb.freexian.com/extended-lts/pool/main/f/freexian-archive-keyring/freexian-archive-keyring_2022.06.08_all.deb && sudo dpkg -i freexian-archive-keyring_2022.06.08_all.deb

Ремарка автора: есть и установочный CD, но там нет SSH-сервера из коробки.

Как и писали выше. [trusted=yes] мы оставили, потому что ключ к основным репозиториям просрочился. Мы подошли к проблеме так, но есть и другие решения. Интересное обсуждение и идеи можно найти здесь: https://unix.stackexchange.com/questions/598344/debian-8-jessie-keyexpired-1587841717

3) Обновляем список репозиториев, ставим обновления от root или добавляем sudo перед каждой командой: apt-get update && apt-get upgrade

4) Обновление на ядро ставим отдельно: https://www.freexian.com/lts/extended/docs/kernel-backport/

Или сразу с заголовками, если драйвера на железо выдают такое требование, следующей командой от root или с sudo вначале: apt-get install linux-image-5.10-amd64 linux-headers-5.10-amd64 dkms gcc make  

5) Создаем урезанные репозитории по примерам выше.

Пример 7: Debian 7 amd64

Это самый старый Debian, который рассматривается в статье. Для версии 6 наши рецепты не подходят, так как Advanced pacage tool более примитивный.

1)      В Debian 7 установка сетевых репозиториев будет неизбежно выдавать ошибку, поэтому прописываем только те, что с DVD: https://cdimage.debian.org/mirror/cdimage/archive/7.11.0/amd64/iso-dvd/debian-7.11.0-amd64-DVD-1.iso

Ремарка автора: есть и установочный CD, но там нет SSH-сервера из коробки.

2) Меняем репозитории на обновленные:

user@debian7:~$ cat /etc/apt/sources.list
deb [trusted=yes] http://archive.debian.org/debian/ wheezy main contrib non-free
deb [trusted=yes] http://archive.debian.org/debian-security wheezy/updates main contrib non-free
deb [trusted=yes] http://deb.freexian.com/extended-lts wheezy main contrib non-free
user@debian7:~$

Основные репозитории устарели по ключам. От Freexian вся поддержка тоже давно закончилась. Обратите внимание, что в репозитории от Freexian пишем просто wheezy, а не wheezy-lts, как в других примерах, иначе вы не поставите обновленное ядро.

3) Обновляем список репозиториев, ставим обновления от root или добавляем sudo перед каждой командой: apt-get update && apt-get upgrade

4) Обновление на ядро ставим отдельно. Или делаем сразу с заголовками, если драйвера на железо выдают такое требование, следующей командой от root или с sudo вначале: apt-get install linux-image-3.16.0-0.bpo.6-amd64 linux-headers-3.16.0-0.bpo.6-amd64 dkms gcc make

5) Создаем урезанные репозитории по примерам выше.

Пример 8: установка пакетов промежуточных версий

В примерах выше мы прописывали репозитории, которые обеспечивали для Debian наиболее новые пакеты из возможных в пределах версий. Но бывают ситуации, когда у нас сервер Debian 9.2 и на него нужно поставить пакеты именно из этой версии без обновления до 9.3 или выше. В этом случае нам поможет: https://snapshot.debian.org/

1) За основу берем репозитории Debian 9 выше, убираем от Freexian, меняем archive.debian.org на snapshot.debian.org и ставим дату до выхода 9.3, но после 9.2:

root@debian9:~# cat /etc/apt/sources.list
deb [trusted=yes] https://snapshot.debian.org/archive/debian/20171201T010100Z/ stretch main contrib non-free
deb [trusted=yes] https://snapshot.debian.org/archive/debian-security/20171201T010100Z/ stretch/updates main contrib non-free
root@debian9:~#

2) Далее готовим ВМ, как мы выше описали для Debian 9, потом с помощью команды от root или с sudo вначале: apt-get install apt-transport-https dpkg-dev

3) Меняем репозитории на те, что выше.

4) Прописываем им приоритет в 1001, чтобы при скачивании не было конфликтов с уже установленными пакетами:

root@debian9:~# cat /etc/apt/preferences.d/oldarchive
Package: *
Pin: origin "snapshot.debian.org"
Pin-Priority: 1001
root@debian9:~#

5) Обновляем список пакетов командой apt-get update, выполняем от root или с добавлением  sudo вначале.

6) Вот пример, как это работает:

user@debian9:~$ apt-cache policy sssd
sssd:
  Installed: (none)
  Candidate: 1.15.0-3
  Version table:
     1.15.0-3 1001
       1001 https://snapshot.debian.org/archive/debian/20171201T010100Z stretch/main amd64 Packages
user@debian9:~$

Как видно, тут более старая версия sssd, чем в Debian 9 со всеми обновлениями:

user@debian9:~$ apt-cache policy sssd
sssd:
  Installed: (none)
  Candidate: 1.15.0-3+deb9u2
  Version table:
     1.15.0-3+deb9u2 500
        500 http://archive.debian.org/debian-security stretch/updates/main amd64 Packages
        500 http://deb.freexian.com/extended-lts stretch-lts/main amd64 Packages
     1.15.0-3+deb9u1 500
        500 http://archive.debian.org/debian stretch/main amd64 Packages
user@debian9:~$

7) Скачиваем ее с зависимостями:

user@debian9:~$ mkdir sssd
user@debian9:~$ cd sssd/
user@debian9:~/sssd$ apt-get download $(apt-cache depends --recurse --no-recommends --no-suggests --no-conflicts --no-breaks --no-replaces --no-enhances --no-pre-depends sssd | grep "^\w" | sort | uniq)
[несущественный вывод терминала удален, там просто процесс загрузки]
user@debian9:~/sssd$ ls | head
adduser_3.115_all.deb
cdebconf_0.227_amd64.deb
debconf_1.5.61_all.deb
dpkg_1.18.24_amd64.deb
gcc-6-base_6.3.0-18_amd64.deb
init-system-helpers_1.48_all.deb
install-info_6.3.0.dfsg.1-1+b2_amd64.deb
libacl1_2.2.52-3+b1_amd64.deb
libattr1_1%3a2.4.47-2+b2_amd64.deb
libaudit1_1%3a2.6.7-2_amd64.deb
user@debian9:~/sssd$ ls | tail
sssd-ad_1.15.0-3_amd64.deb
sssd-ad-common_1.15.0-3_amd64.deb
sssd-common_1.15.0-3_amd64.deb
sssd-ipa_1.15.0-3_amd64.deb
sssd-krb5_1.15.0-3_amd64.deb
sssd-krb5-common_1.15.0-3_amd64.deb
sssd-ldap_1.15.0-3_amd64.deb
sssd-proxy_1.15.0-3_amd64.deb
tar_1.29b-1.1_amd64.deb
zlib1g_1%3a1.2.8.dfsg-5_amd64.deb
user@debian9:~/sssd$ ls | wc -l
113
user@debian9:~/sssd$

8) Оформляем репозиторий как обычно:

user@debian9:~/sssd$ dpkg-scanpackages -m . > Packages
dpkg-scanpackages: info: Wrote 113 entries to output Packages file.
user@debian9:~/sssd$ cd ..
user@debian9:~$ tar cJf sssd.tar.xz sssd/
user@debian9:~$ file sssd.tar.xz
sssd.tar.xz: XZ compressed data
user@debian9:~$

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

© Habrahabr.ru