Patch/delta-RPMs и их возможное использование в ALTLinux
Общая теория
patch-rpm и delta-rpm (ниже называемые разностными пакетами) — это способы упаковки обновлений, применяемые в
Su SE Linux. Пакеты prpm и drpm содержат лишь разницу (записанную в той или иной форме) между двумя версиями некоторого rpm-пакета. Установка в систему prpm/drpm равносильна установке обычного (будем называть его полным) rpm-пакета новой версии при условии наличия в системе этого же rpm-пакета определённой старой версии. Внешнее отличие prpm и drpm в случае
Su SE Linux состоит в том, что prpm используется для консервативных обновлений внутри одной версии апстрима, тогда как drpm используется для обновления до новых версий апстрима. Скорее всего, в patch-rpm и delta-rpm изменения упакованы по-разному.
Основным достоиством prpm/drpm является их малый, по сравнению с полным rpm, размер. Основной недостаток обоих разностных rpm — жёсткое требование к версии пакета, установленной в системе.
«Неполнота» разностных пакетов в определённых условиях приводит к неудобствам: например, может не работать механизм rpmnew/rpmsave из-за того, что нет полной версии обновляемого файла. Справиться с этим можно, если поместить соответствующий файл в разностный пакет полностью (вполне возможно, это делается в delta-rpm, однако достоверной информации у меня пока нет).
Ещё одна проблема присуща не отдельным разностным пакетам, а системе обновлений на их основе: если новая версия добавляет к зависимостям новые программы/библиотеки, не всегда может быть возможно получить
полный пакет, от которого зависит обновляемый. Однако эта проблема легко решается путём использования традиционного репозитория (назовём его основным репозиторием) наряду с репозиторием разностных пакетов, при этом пакеты одной и той же версии помещаются в оба репозитория (drpm и полный rpm соответственно). Очевидно, при наличии двух пакетов с полностью одинаковыми версиями, отличающихся лишь своим
типом (полный и drpm) и при условии наличия установленного пакета подходящей старой версии, apt должен будет предпочитать drpm полному rpm'у.
Каким образом разностные пакеты могут использоваться в ALTLinux
Как показал опыт
Su SE, разностные пакеты прекрасно подходят для доставки консервативных (не апстрима) обновлений, таких как обновления безопасности, пользователям, не устанавливающим сторонних пакетов. В большей степени, пожалуй, это применимо к стабильным версиям дистрибутивов, чем к нестабильным репозиториям (например, Sisyphus). Это не отменяет необходимости в полных пакетах для тех же самых обновлений.
В Sisyphus разностные пакеты можно использовать на регулярной основе при условии параллельного наличия полных пакетов тех же версий. В этом случае пользователь, часто обновляющийся из репозитория, сможет пользоваться разностными пакетами для обновления между последовательными версиями, а пользователь, пропустивший версию, сможет обновиться,
- последовательно установив несколько разностных пакетов (A-1.0-alt3 -> A-1.0-alt6, например, потребует установки трёх разностных пакетов: alt3-alt4, alt4-alt5, alt5-alt6), либо
- сразу установить последнюю версию при помощи полного пакета.
В первом случае потребуется договориться, обновления насколько старых версий хранятся в репозитории (в пределе — хранятся лишь обновления между двумя последними версиями).
Часто обновляющиеся пользователи безусловно выиграют от наличия разностных пакетов у крупных программ (например, xorg), подобно тому, как сейчас выигрывают тестирующие installer от того, что Антон выкладывает xdelt'ы между версиями :) Однако небольшие программы нецелесообразно снабжать разностными пакетами, поскольку разница может оказаться больше полного пакета. По-видимому, вопрос о том, создавать ли разностные пакеты, нужно решать per-package; возможно, этот вопрос стоит решать мейнтейнеру.
Насколько я понимаю, подобный способ обновления из нестабильных репозиториев Linux пока не используется нигде в мире.
Виталий Липатов предложил использовать разностные пакеты для оптимизации обновления зеркал репозитория. По-моему, тоже очень стоящая идея.
Готовые разностные пакеты снижают нагрузку на процессор сервера – если формировать разность непосредственно при синхронизации, получается надо выполнить примерно следующее:
- Потрошим rpm-пакет на сервере
- Потрошим rpm предыдущей версии пакета на клиенте
- Делаем rsync между потрохами
- Собираем пакет на клиенте
- Делаем rsync пакетов (чтобы подпись восстановить).
(этот подход не делает предположений насколько далеко ушёл репозиторий от зеркала клиента, а также не требует изменений в коде rpm и apt)
Для того, чтобы использовать разностные пакеты, потребуется внести некоторые изменения в код как rpm, так и apt. И самое главное, нужно понять, в каком виде лучше представлять разницу между версиями. Очевидно, тупая xdelta между двумя полными пакетами – наихудшее, что можно придумать. Вопрос скорее в том, можно ли придумать что-то лучше, чем xdelta между файлами пакетов. Имеет смысл разобраться в отличиях сусешных patch-rpm и delta-rpm и что-то взять на вооружение.
Ключевые слова: prpm, drpm, xdelta, обновление системы, пакеты с обновлениями, patch-rpm, delta-rpm.
Ссылки
Ссылок на эту страницу нет