Мы — долго запрягаем, быстро ездим, и сильно тормозим.
|
||||||||
www.lissyara.su
—> статьи
—> FreeBSD
|
|
- а для применения дельты и получения результирующего файла достаточно выполнить:  
|
  В нашем случае необходимо помнить, что на вход этой утилите подаются только tar-архивы, ибо получить адекватную дельту между двумя сжатыми файлами, предварительно их не распаковав, невозможно. Надеюсь, объяснять причины, почему именно tar-архив, а не сжатый каким-нибудь компрессором (bzip2/gzip) файл, нет необходимости. Если же вам все-таки требуются объяснения - просто примите это как данность.
  Помимо утилиты (алгоритма) xdelta существуют и другие подобные программы, например - bdelta, которая генерирует более компактную дельту. Но у обеих утилит есть одно серьезное неудобство...
  Как уже говорилось - аргументами этих утилит являются распакованные tar-файлы, тогда как нам необходимо получить конечный сжатый bz2-файл и при этом с идентичной результирующему файлу контрольной суммой... Отсюда возникает вопрос - какую версию компрессора использовать после применения дельты к tar-файлу? ...Ведь проблема в том, что если сжимать один и тот же файл разными версиям bzip2, то мы хоть и получим корректно сжатый файл, но в каждом случае будет разная контрольная сумма. А это нас совсем не устраивает, так как отключать в системе портов проверку контрольных сумм чревато серьезными проблемами безопасности.
  И тут нам на помощь приходит еще одна утилита - "sysutils/deltup". Эта утилита является своего рода оберткой (wrapper) для xdelta и bdelta. Ее преимущество заключается в том, что для создания и применения дельты нет необходимости предварительно разжимать файлы, а в качестве аргументов она принимает сжатый файлы, которые сама же и разожмет перед созданием дельты и, что самое главное, после применения дельты применит и нужную версию компрессора, так что на выходе мы получим конечный сжатый файл с корректной контрольной суммой. Отмечу лишь, что определение версии компрессора относится только к bzip2, так как gzip может быть только одной версии - из портов, потому что системный gzip абсолютно не подходит для этой утилиты. Ну и, само собой, все версии bzip2 должны быть установлены и доступны для deltup, для чего достаточно - просто установить deltup из портов, который, в свою очередь, установит все необходимые зависимости.
  Итак, Вы теперь знаете как создать и применить дельту и при этом получить идентичный исходному сжатый файл. Но для поставленной задачи нам не нужно создавать дельты - нам нужно выкачивать уже готовые дельты и применять их у себя... Поэтому возникает следующий вопрос - откуда же качать дельты?..
2. Ну и где же брать дельты?
2.1. Скачать готовую дельту:
  Некоторые проекты сами создают дельты между минорными версиями файлов с исходным кодом... Например, для KDE получить x-дельту можно с официального ftp или любого иного зеркала, и находятся эти дельты в том же каталоге, что и исходники.
2.2. Создать самому, либо попросить у сообщества:
  Если у Вас есть удаленный хост с shell'ом, нужными утилитами и достаточными ресурсами, то вы можете создавать дельты, самостоятельно.
  Либо, вы можете попросить кого-нибудь из пользователей FreeBSD, обладающих необходимым ресурсом, создать дельту для вас.
  В любом случае для удобного выкачивания и создания дельты можно воспользоваться скриптом: http://pastebin.mozilla-russia.org/91097
  Пользоваться этим скриптом очень просто:
- первый аргумент — программа, с помощью которой будет создана дельта;
- второй и третий аргумент - полный url к файлам (допустимо указывать url для каждого файла, если они расположены по разным адресам),
|
на выходе будет получена необходимая дельта между двумя указанными файлами.
  Но есть способ получения дельты гораздо более изящный, нежели предыдущие - "The dynamic deltup server network"...
2.3. Воспользоваться специальным сервером:
  Этому сервису передаются параметры для получения необходимой дельты, где строка адреса выглядит следующим образом:  
= = = = = = = одна сплошная строка = = = = = = = = = = = = =
_http://linux01.gwdg.de/~nlissne/deltup.php?
have=file1.tar.bz2&want=file1.tar.bz2&url=ftp://url/file2.tar.bz2
&version=0.7&time=1207128573
= = = = = = = одна сплошная строка = = = = = = = = = = = = =
  Как видно из приведенной выше строки, формат достаточно прозрачен и не требует пояснений, разве... стоит указать на то, что данному сервису можно передать ссылку только на результирующий файл, что не позволяет ему создавать дельты из файлов, расположенных в разных источниках.
  Далее... После передачи параметров через url и если необходимая дельта на сервере уже имеется, то она отдается сразу. В противном случае сервер пытается ее создать и возвращает файл с именем "deltup-queued" который означает, что сервер поставил задачу в очередь и необходимо попробовать позже. Получение же файла с расширением ".filed" указывает на невозможность создания дельты сервером. Однако иногда бывает и так, что на следующий день дельта все же создается.
3. Ну, а что же мы в итоге экономим?
  Конечно же - деньги!..
  Файлы исходников KDE-3.X, в общей сложности, весят приблизительно 200Мб, а если в пересчете на то, чего у меня никогда нет (а конкретнее - 75 копеек за мегабайт), то каждое обновление KDE мне обходится приблизительно в 150 рублей. Тогда как получение дельты мне обойдется всего в семь рублей, так как ее объем не превышает и 10 мегабайт. И это в случае xdelta, а в случае с bdelta -— и того меньше. Или, как я уже упоминал выше, разница между двумя минорными версиями Firefox обойдется мне всего в полтора рубля против двадцати пяти за полный архив с исходником. Ну а самое болезненное, если бы не возможность получения дельты, - это закачка ОпенОффис'а. Получение же дельты позволяет мне выпить лишнюю бутылочку Массандровского кагорчика в честь выхода новой версии, так как вместо положенных двухсот восьмидесяти мегабайт я могу выкачать всего 47Мб(bdelta) разницы между OOo-2.3.1 и OOo-2.4.0.
  Остальное же можно посмотреть здесь: http://linux01.gwdg.de/~nlissne/deltupstats.php
4. И наконец - самое главное
  Все эти утилиты, конечно, хороши, но обновлять все исходники установленных портов вручную (а у меня их более тысячи), свело бы на нет всю прелесть описанной выше экономии. Но благодаря Yarodin'у, который портировал утилиту "sysutils/deltup" под FreeBSD и Антону Статутову, адаптировавшему Getnoo'шный скрипт "sysutils/getdelta" ("dynamic deltup client"), для автоматического получения и применения дельты через "The dynamic deltup server network", наконец-то и пользователи FreeBSD получили функционал, который в Gentoo использовался уже несколько лет.
  Инсталлируется все это хозяйство очень просто. Все что нужно, это:
  - установить порт "sysutils/getdelta";  
  - и переопределить переменную: FETCH_CMD=/usr/local/bin/getdelta.sh  
  После чего вы будете экономить до 80 процентов трафика на обновлениях портов.
5. Некоторые нюансы... ( ну, а куда же без них? ;-)
5.1. Проблема с нехваткой места в TMPDIR:
  При применении дельты, например, к исходникам Firefox'а требуется более 200Мб доступного пространства во временном каталоге (по умолчанию это "/tmp"). Поэтому в некоторых случаях имеет смысл переопределить временный каталог для нужд утилиты deltup. Для чего необходимо, всего лишь, в файле /etc/make.conf переопределить переменную:  
    FETCH_ENV= TMPDIR=/patch/tmp  
  где "/patch/tmp" соответствует реальному каталогу на разделе с достаточным объемом свободного места.
5.2. Исправляем проблемы ранних версий "sysutils/deltup":
  Как я уже писал, использование разных версий bzip2 для одного и того же файла порождает сжатые файлы с различными контрольными суммами. Отсюда возникла проблема у тех пользователей, которые использовали портированную на FreeBSD утилиту "deltup" до версии 0.4.4, так как предыдущая версия использовала только системные компрессоры bzip2 и gzip, в результате чего эти пользователи получали файлы с некорректным md5, а в случае с gzip-файлами и вовсе битые. Чтобы теперь привести port'овое хозяйство в порядок, можно воспользоваться следующим скриптом: http://pastebin.mozilla-russia.org/91095  
Установка и использование скрипта:
|
  Это скрипт принимает два аргумента: "-c" - локализация проблемных файлов; и "-r" - попытка восстановить md5 путем пережатия некорректных файлов требуемой версией компрессора.
  *Скрипт может быть полезен и для простого поиска битых файлов в DISTDIR, всем пользоватеям FreeBSD.
5.3. Обновление исходного кода gcc и OpenOffice:
  К большому сожалению обновить исходники OpenOffice или GCC через "The dynamic deltup server network" невозможно. А посему, для получение дельты, можно воспользоваться советами из пункта 2.2., т.е. - создать самому, либо обратиться за помощью к сообществу FreeBSD пользователей.
  Хотя... Для получения исходного кода новой версии GCC, не закачивая весь архив и не прибегая к посторонней помощи, решение все таки имеется... И несмотря на то, что оно не очень элегантное и не позволяет сохранить контрольную сумму, оно позволяет выполнить главную задачу - сэкономить средства. Это решение заключается в получении текстовых патчей (diff), содержащих разницу между версиями. И находятся они в поддиректории "diffs" официального ftp, например, для gcc-4.2-20080326:  
    ftp://gcc.gnu.org/pub/gcc/snapshots/4.2-20080326/diffs/
  Опять же, для удобного обновления исходников gcc, был подготовлен скрипт:  
    http://pastebin.mozilla-russia.org/91110
  Синтаксис этого скрипта прост:
|
  Т.е. в качестве аргумента подставляется одно из двух возможных значений:  
    - либо - версию gcc, например: "4.2-20080326";  
    - либо - путь до порта.
  Само собой, предыдущая версия gcc должна присутсвовать в /usr/ports/distfiles.
  Ну а так как получить контрольные суммы, используя этот механизм обновления, невозможно, то в /etc/make.conf необходимо добавить запись отключающую проверку MD5 и, по желанию, так же можно отключить автоматическую закачку, что бы не выкачать архивы случайно:
|
* Закомментированная строка указывает на возможность подставить скрип в качестве программы закачки исходников GCC. Но использовать это или нет - решать вам.
6. Полезные ссылки
  Официальный сайт утилиты deltup
  The dynamic deltup server network
размещено: 2008-04-07,
последнее обновление: 2008-04-09,
автор: inspirra
Demiurg, 2008-04-07 в 17:02:16
Огромное спасибо автору... только-только собирался прикручивать на шлюз linux-эмуляцию с gentoo'шным окружением ради экономии трафика... ADSL хоть и есть, не не анлим... :)
wituS, 2008-04-07 в 22:19:08
СПАСИБО!!!! ВЕЩЬ!!
kmb, 2008-04-10 в 11:36:24
Ура Товарищщи! Наконец-то реализовали апдейты! Моему счастью нет предела. Просьба тем кто уже использует отписаться на форуме о подводных камнях :)
Авось, 2008-04-24 в 12:59:32
Уже оценил всю прелесть данной утилиты. Штука презабавнейшая и полезная.
Byte, 2008-04-24 в 13:15:39
Замечательная вещь.
Спасибо за статью :-)
krilya, 2008-07-09 в 3:54:51
респектище за статью! при моих 2.1 руб. за мегабайт ну ооооочень существенная экономия :)
Этот информационный блок появился по той простой причине,
что многие считают нормальным, брать чужую информацию не уведомляя автора
(что не так страшно), и не оставляя линк на оригинал и автора — что более существенно.
Я не против распространения информации — только за. Только условие простое — извольте
подписывать автора, и оставлять линк на оригинальную страницу в виде прямой, активной, нескриптовой,
незакрытой от индексирования, и не запрещенной для следования роботов ссылки.
Если соизволите поставить автора в известность — то вообще почёт вам и уважение.
© lissyara 2006-10-24 08:47 MSK
Комментарии пользователей [6 шт.]