Создаём кэш пакетов для локальной сети

Grifon аватар

Создаём кэш пакетов для локальной сети.

Не знаю, много ли найдётся здесь людей, которые бы имели дело с локальной сетью, построенной на рабочих станциях с Linux, но думаю, эта проблема всё равно многих затрагивает. Цель этого мануала - держать несколько рабочих станций обновлёнными и тратить при этом минимум трафика и времени. Моим опорным дистрибутивом будет OpenSUSE 11.1, так что если кто-либо решит эту задачу для другого дистрибутива, я готов расширить статью его авторством.

Всем известно, что отрытое программное обеспечение обновляется часто. Причиной этому служат улучшения, исправления в работе и безопасности и т.п., так что лучше держать софт в актуальном состоянии. Решать эту проблему можно разными способами:
  • обновлять ПО прямиком из сети Интернет
  • создать локальное зеркало репозитария
  • сохранять кэш установленных пакетов и использовать его повторно

Первый способ наиболее лёгок, поскольку все настройки заданы заранее, но при наличии нескольких установок, каждая будет скачивать одно и то же снова и снова.
Второй способ прост, по скольку выкачивается и синхронизируется репозиторий на сервере, а клиенты уже могут устанавливать софт с него. Требуется начальная настройка сервера и много трафика. Я не буду этого делать, поскольку не использую все программы. Остановлюсь на последнем пункте.
Политика будет такой: имеется сервер nfs. Создаём на нём каталог, доступный для чтения/записи с локальным машин. Они подключают его на месте хранения кэша. На всех машинах настраиваются одинаковые репозитарии с одинаковыми названиями. После этого, стоит только установить программу на одном компьютере, пакет сохраняется в кэш и лежит там, всем доступный.

Что мы имеем:

  • Сеть. Для определённости 192.168.0.0/24.
  • Сервер. Пусть это будет server.localnet с ip 192.168.0.1
  • Клиенты

Везде OpenSUSE 11.1

Краткая справка по zypper

В OpenSUSE есть отличнейший инструмент управления ПО - zypper. Его настройки лежат в /etc/zypp, кэш по умолчанию в /var/cache/zypp а пакеты складируются в /var/cache/zypp/packages. Вот последний нам и нужен.

У этого иструмента есть свои встроенные команды (полный список во встроенной справке):

команда    | сокращение | описание
repos      | lr         | список репозитариев
addrepo    | ar         | добавить репозитарий
removerepo | rr         | удалить репозитарий
modifyrepo | mr         | изменить репозитарий
install    | in         | установить пакет

Теперь практика (для справки):
(1) zypper mr -k --all           включает кэш всех репозитариев
(2) zypper mr -K openSUSE_11.1-0 отключает кэш для репозитария 
                      на диске. И правильно, с него мы не будем
                      сохранять кэш (но, в принципе, тоже можно)

Включаем на сервере кэширование пакетов командой (1).

Устанавливаем на server службу nfs:

linux-4ut6:~ # zypper in nfs-utils
Loading repository data...
Reading installed packages...
Resolving package dependencies...

The following NEW package is going to be installed:
  nfs-kernel-server


Overall download size: 93.0 K. After the operation, additional 214.0 K will be used.
Continue? [YES/no]:
Retrieving package nfs-kernel-server-1.1.3-18.1.1.i586 (1/1), 93.0 K (214.0 K unpacked)
Retrieving: nfs-kernel-server-1.1.3-18.1.1.i586.rpm [done]
Installing: nfs-kernel-server-1.1.3-18.1.1 [done]

Добавляем строку в /etc/exports:
/var/cache/zypp/packages 192.168.0.0/24(rw,no_root_squash)

Запускаем nfs:
linux-4ut6:~ # service nfsserver start
Starting kernel based NFS server: 
idmapdexportfs: /etc/exports [1]: Neither 'subtree_check'
or 'no_subtree_check' specified for export
 "192.168.0.0/24:/var/cache/zypp/packages".
 Assuming default behaviour ('no_subtree_check')
NOTE: this default has changed since nfs-utils version 1.0.x

mountd statd nfsd sm-notify                         done

Если это прошло успешно, то получится такой результат:
linux-4ut6:~ # showmount -e
Export list for linux-4ut6:
/var/cache/zypp/packages 192.168.0.0/24

Для более подробной информации, советую обратиться к справке по nfs.

Далее. На рабочих станциях монтируем сетевой каталог:

mount 192.168.0.1:/var/cache/zypp/packages /var/cache/zypp/packages

При необходимости, можно добавить его монтирование при загрузке:
echo '192.168.0.1:/var/cache/zypp/packages \
/var/cache/zypp/packages nfs defaults,rw 0 0' \
>> /etc/fstab

В том случае, когда монтирование не прошло успешно, возможно, что на сервере запущен фаервол. Самый простой способ - это его отключить:
service SuSEfirewall2_setup stop

Теперь можно пытаться подключить каталог снова.

Если мы хотим, чтобы у всех были одинаковые репозитарии, можно сделать следующее:
на одном экспортировать список:

zypper lr -e myrepos.repo

А на других импортировать, перенеся файл myrepos.repo на них:
zypper ar myrepos.repo

Включаем так же для них кэш командой (1).

Мы закончили. Теперь вы сохрание установочные пакеты в одном месте для всех машин, ставили ли вы их с помощью zypper, yast2 или апплета обновлений.
Всё, что вы делаете со своей системой, вы делаете на свой страх и риск, не претендую на достоверность. Как говорится, доверяй, но проверяй.

Спасибо!

xBot01 аватар

Интересует вопрос безопасности.
Если доступ к nfs будет на запись, то злоумышленник может подменить пакет и интегрировать rootkit?

Возможна ли реализация следующим образом:
1. Host шлет запрос на локальный сервер на получение пакета.
2. Локальный сервер проверяет наличие пакета у себя.
3. При наличии отдает, при отсуствии качает из Интеренета.

З.Ы. Также важно соблюдение версий и наличие более новых.

Grifon аватар

Согласен, с безопасностью не всё гладко, но проблемы подмены пакета нет, потому что они подписаны, а подпись не хранится в rw

Настройки просмотра комментариев

Выберите нужный метод показа комментариев и нажмите "Сохранить установки".