combinedrepos
Данный "финт ушами" необходим, когда нужно объединить несколько базовых репозитариев в один, например при настройке sandman для сборки пакетов под Master 2.2.
Подобное объединение необходимо при возникновении следующих условий:
- Есть зеркала Master 2.2 и updates, содержимое которых изменять нельзя (все изменения будут утеряны после синхронизации)
- При сборке новых пакетов необходимо помимо пакетной базы дистрибутива использовать updates и локально собраные пакеты
- В конфиге sandman можно использовать только один репозитарий в качестве пакетной базы
Итак, зеркало Master 2.2 находится в /var/ftp/pub/distributions/ALTLinux/Master/2.2, компоненты addon, compat, hotfix, insecure, main; зеркало updates находится в /var/ftp/pub/distributions/ALTLinux/updates/Master/2.2, компонента updates; локально собраные пакеты будем держать в /var/ftp/pub/distributions/current, компонента local.
Согласно sources.list(5) и учитывая особенности sandman, описание репозитария выглядит следующим образом:
rpm file:topdir distribution component [component...]
Из-за некоторых особенностей sandman (доступ к репозитарию при помощи mount --bind) можно использовать только относительные символические ссылки, которые должны быть видны из topdir, поэтому topdir будет располагаться в /var/ftp/pub/distributions/.
Создадим локальный репозитарий:
$ mkdir -p /var/ftp/pub/distributions/current/SRPMS.local $ mkdir -p /var/ftp/pub/distributions/current/i586/RPMS.local $ mkdir -p /var/ftp/pub/distributions/current/i586/base
Создадим ссылки на зеркала Master 2.2 и updates относительно нашего topdir:
$ cd /var/ftp/pub/distributions/current/i586 $ ln -sf ../../ALTLinux/Master/2.2/ALTLinux/RPMS.addon RPMS.addon $ ln -sf ../../ALTLinux/Master/2.2/ALTLinux/RPMS.compat RPMS.compat $ ln -sf ../../ALTLinux/Master/2.2/ALTLinux/RPMS.hotfix RPMS.hotfix $ ln -sf ../../ALTLinux/Master/2.2/ALTLinux/RPMS.insecure RPMS.insecure $ ln -sf ../../ALTLinux/Master/2.2/ALTLinux/RPMS.main RPMS.main $ ln -sf ../../ALTLinux/updates/Master/2.2/i586/RPMS.updates RPMS.updates
Тут возникает один спорный момент - где должны находиться исходные пакеты. apt и genbasedir по умолчанию считают, что они должны быть в topdir/distribution/../SRPMS.<компонента>, sandman в свою очередь ищет их в topdir/SRPMS.<компонента>. Поэтому слинкуем исходники туда, где их будет искать apt:
$ cd /var/ftp/pub/distributions/current $ ln -sf ../ALTLinux/Master/2.2/SRPMS.addon SRPMS.addon $ ln -sf ../ALTLinux/Master/2.2/SRPMS.compat SRPMS.compat $ ln -sf ../ALTLinux/Master/2.2/SRPMS.hotfix SRPMS.hotfix $ ln -sf ../ALTLinux/Master/2.2/SRPMS.insecure SRPMS.insecure $ ln -sf ../ALTLinux/Master/2.2/SRPMS.main SRPMS.main $ ln -sf ../ALTLinux/updates/Master/2.2/SRPMS.updates SRPMS.updates
... и создадим ссылки от topdir для совместимости с sandman:
$ cd /var/ftp/pub/distributions $ ln -sf current/SRPMS.addon SRPMS.addon $ ln -sf current/SRPMS.compat SRPMS.compat $ ln -sf current/SRPMS.hotfix SRPMS.hotfix $ ln -sf current/SRPMS.insecure SRPMS.insecure $ ln -sf current/SRPMS.main SRPMS.main $ ln -sf current/SRPMS.updates SRPMS.updates $ ln -sf current/SRPMS.local SRPMS.local
Теперь надо сгенерировать индексы для apt:
$ genbasedir --topdir=/var/ftp/pub/distributions --bz2only --progress --mapi current/i586 addon compat hotfix insecure main updates local
При желании можно подписать индексы своим pgp/gpg ключом (параметры --sign и --default-key для genbasedir).
После этого свежесозданый репозитарий можно использовать в sandman или прописать в sources.list:
rpm file:/var/ftp/pub/distributions current/i586 local updates main
Остальные компоненты добавлять при неоходимости.
Далее при добавлении своих пакетов в local или после синхроницации updates необходимо переиндексировать изменённые компоненты, это делается при помощи параметра --partial для genbasedir:
$ genbasedir --topdir=/var/ftp/pub/distributions --bz2only --partial --progress --mapi current/i586 updates
Вот, собственно, и всё. Аналогичную процедуру можно проделать с любой пакетной базой, например Sisyphus + локальные пакеты.