Мы — долго запрягаем, быстро ездим, и сильно тормозим.

FreeBSD
  настройка
  подсчёт трафика
  программы
  почтовые системы
  Шелезяки
  Мелочи
  Русификация
  COM-порт
  Монтирование образов
  dd
  burncd
  Консоль
  polling
  redirect_port
  wolf3d
  W.O.L.
  HDD->HDD
  bsdstats
  pdf в html
  monitord
  monit
  dvd в avi
  LAM
  Контроль провайдера
  pppd
  ru man
  geom_uzip
  colorize
  nettop
  немного о ssh
  установка по сети
  ClamAV mirror
  BlueTooth
  WiFi WPA
  iftop
  iPod
  2 CD -> 1 DVD
  ipcalc
  LACP и VLAN
  FFS из-под WinXP
  queues
  NFS & Win2k3
  Dynamic DNS
  ProFTPD+iconv
  deltup, xdelta, bdelta
  Приглашение csh/tcsh
  настрока bash
  Lan over Bluetooth
  pppoe
  метаданные exif
  dd : бэкапируем windows
  mozilla autoconfig
  Proxy Auto Configuration
  NNTP сервер
  Rinetd
  ISO DVD FreeBSD
  my disc1
  sftp+chroot
  SendXMPP
  APCUPSD
  Видеонаблюдение
  Настройка аудиоплеера на ximp3
  HDD(mbr) -> HDD(gpt)
  mc 4.6.2
  Динамический DNS
  axel
  LiveCD
  NAS на MPD
  backup конфигов на почту
  Файловая система
  WWW
  Security
  system
  Games Servers
  X11
  Programming
Очумелые Ручки
OpenBSD
Cisco


www.lissyara.su —> статьи —> FreeBSD —> Мелочи —> deltup, xdelta, bdelta

"The dynamic deltup server network" для нужд FreeBSD

Автор: inspirra.


    Если у Вас скоростной безлимитный Интернет - эта заметка не для Вас, счастливчиков. Остальные же сейчас узнают, как сэкономить свои денежки...

   Полагаю, нет необходимости рассказывать о том, как работают порты во FreeBSD и про то, что при установке или обновлении порта требуется закачка архива с исходным кодом программы? Так вот...
   При изменении минорной версии программы реальные изменения в исходном коде редко когда превышают десять процентов. Например, архив с исходниками браузера Firefox-2.0.0.X имеет размер в ~37Мб, а разница между двумя минорными версиями исходного кода Firefox'а не достигает и 2Мб. Но система портов FreeBSD устроена так, что архив с исходниками обновленной программы будет выкачан целиком. А ведь как было бы здорово, если бы и получение исходного кода программ базировалось на cvs или подобной технологии, аналогично получению дерева портов, или исходного кода самой ОС... Тем не менее решение, позволяющее выкачивать только изменения между версиями, все таки есть!.. И это решение уже давно используется в Gentoo... Но прежде чем указать на готовое решение, необходимо сказать пару слов об инструментарии и некоторых нюансах его использования... Нетерпеливые же могут сразу перейти к разделу 4.

1. Основной инструмент
   Всем известна утилита diff(1), с помощью которой создаются так называемые patch'и между двумя версиями текстовых файлов. Так вот - аналогичные утилиты есть и для бинарных файлов, и эти утилиты присутствуют в портах — "misc/xdelta" и "misc/bdelta". И также, как с помощью утилит diff(1) и patch(1) - можно создавать и применять patch'и между текстовыми файлами, аналогично и с этими утилитами - можно создавать и применять patch'и между двумя бинарными файлами, только называется такой patch - "delta", так как содержит разницу (дельту) между бинарными данными.
   Пользоваться этой утилитой очень просто... Для создания дельты на вход этой утилиты подаются два бинарных файла, а на выходе получается та самая разница между этими двумя файлами в виде нового файла - это и есть delta. Например:    
- что бы создать дельту, необходимо выполнить следующие действия:    
$ bunzip2 "file1.tar.bz2" "file2.tar.bz2"
$ xdelta delta "file1.tar" "file2.tar" "file3.xdelta"

- а для применения дельты и получения результирующего файла достаточно выполнить:    
$ xdelta patch "file3.xdelta" "file1.tar" "file2.tar"	
$ bzip2 file2.tar.bz2

   В нашем случае необходимо помнить, что на вход этой утилите подаются только 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 для каждого файла, если они расположены по разным адресам),
$ script.sh ( deltup | xdelta | bdelta ) "http://url/file1.tar.bz2" "file1.tar.bz2"

на выходе будет получена необходимая дельта между двумя указанными файлами.

   Но есть способ получения дельты гораздо более изящный, нежели предыдущие - "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    
Установка и использование скрипта:
$ fetch -o - "http://pastebin.mozilla-russia.org/pastebin.php?dl=91095" | \
      tr -d "\r" | iconv -f utf-8 > script.sh
$ chmod 755 script.sh
$ ./script.sh -c

   Это скрипт принимает два аргумента: "-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
   Синтаксис этого скрипта прост:
$ script.sh ( 4.2-20080326 | /usr/ports/lang/gcc42 )

   Т.е. в качестве аргумента подставляется одно из двух возможных значений:    
       - либо - версию gcc, например: "4.2-20080326";     
       - либо - путь до порта.
   Само собой, предыдущая версия gcc должна присутсвовать в /usr/ports/distfiles.

   Ну а так как получить контрольные суммы, используя этот механизм обновления, невозможно, то в /etc/make.conf необходимо добавить запись отключающую проверку MD5 и, по желанию, так же можно отключить автоматическую закачку, что бы не выкачать архивы случайно:
.if ${.CURDIR:N*/usr/ports/lang/gcc4*} == "" 
        NO_CHECKSUM=YES
        FETCH_CMD=false	
        #FETCH_CMD=/patch/get-gcc.sh ${.CURDIR}	
.endif

* Закомментированная строка указывает на возможность подставить скрип в качестве программы закачки исходников 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 руб. за мегабайт ну ооооочень существенная экономия :)


Оставьте свой комментарий:
Ваше имя:   *
e-mail:  
жирный
наклонный
подчёркнутый
ссылка
цвет
Нынешний год:   *
 


Хостинг HOST-FOOD

2014-07-27, lissyara
gmirror

Удалённое создание софтверного зеркала средствами gmirror, на диске разбитом с использованием gpart. Использование меток дисков для монтирования разделов.
2013-08-20, zentarim
Scan+Print server FreeBSD 9

Настройка сервера печати и сервера сканирования под управлением операционной системы FreebSD 9 для МФУ Canon PIXMA MP540
2011-11-20, BlackCat
Разъём на WiFi-карту

Делаем съёмной несъёмную антену на WiFi-карте путём установки ВЧ-разъёма
2011-09-14, manefesto
Настройка git+gitosis

Настройка системы контроля версия исходного кода в связке git+gitosis+ssh
2011-08-14, zentarim
Wi-FI роутер + DHCP + DNS

Настройка Wi-Fi роутера на Freebsd 8 + DNS сервер + DHCP сервер: чтобы Wi-Fi клиенты были в одной подсети с проводными, проводные и беспроводные клиенты получали адреса автоматически по DHCP, кэширующ
2011-06-15, -ZG-
Охранная система на FreeBSD+LPT

В этой статье описана попытка реализации простой охранной системы на базе FreeBSD с подключением к ней охранных устройтсв на LPT порт и видеорегистрацией.
2011-03-13, terminus
ng_nat

Описание работы ng_nat, практическое использование, достоинства и недостатки в сравнении с ipfw nat
2011-02-20, Капитан
Nagios+Digitemp

Статья описывает создание системы оповещения о превышении температуры в специальных помещениях на основе Nagios с использованием программы Digitemp.
2011-02-17, Le1
Zyxel Configuration

Скрипт для массового изменения конфига свичей Zyxel. Берет из файла iplist список ip-шек, заходит последовательно на каждый и выполняет комманды из файла commands, записывая происходящее в лог файл.
2011-02-16, fox
hast carp zfs ucarp cluster

HAST (Highly Available Storage), CARP, UCARP, ZFS, Cluster настройка и одаптация плюс личные размышления…
2011-02-04, BlackCat
Восстановление ZFS

История о том, как был восстановлен развалившийся RAIDZ ZFS-пул (перешедший в FAULTED) с помощью скотча и подручных средств. Или о том, какие приключения ожидают тех, кто не делает резервных копий.
2011-02-03, Капитан
1-Wire

Статья описывает самостоятельное изготовление контроллера DS9097 для съёма показаний с датчиков температуры DS1820 с помощью программы Digitemp.
2011-01-28, Капитан
Температура в серверной

Статья описывает построение системы наблюдения за температурой в помещении серверной с использованием программы Digitemp и выводом графиков в MRTG
2011-01-21, m4rkell
Syslog server

Как то буквально на днях, у нас завалилось, что то в еве) или не в еве не суть. Суть в том, что когда захотели снять логи с хостов esx обнаружили, что хранят эти негодяи логии только за последнии сутк
2011-01-07, lissyara
Canon/gphotofs

Монтирование цифровых фотоаппаратов Canon (PTP) как файловой системы, автоматизация этого процесса через события devd и внешние скрипты.
2010-12-13, Al
IPSec

Описание принципов работы IPSEC и способов аутентификации.
2010-12-07, manefesto
FreeBSD on flash

Было принято решении переехать на USB Flash и установить минимальный джентельменский набор для работы своего роутера. Делаем =)
2010-12-05, Fomalhaut
root ZFS, GPT

Инструкция по установке FreeBSD с использованием в качестве таблицы разделов GPT и в качестве основной файловой системы - ZFS
2010-09-05, Cancer
Настройка аудиоплеера на ximp3

Цели: Простенький аудиоплеер, для того что бы тетя продавец в магазине утром пришла нажала на кнопку Power и заиграла в зале музыка, так же был доступ по сети, общая шара куда можно заливать музыку, к
2010-08-31, Cancer
Установка и настройка OpenVPN

На днях появилась задача - объединить головной офис и 3 филиала в одну сеть через интернет посредством OpenVPN, чтобы люди могли подключаться через RDP к базам 1С на серверах.
2010-08-25, manefesto
freebsd lvm

Использование linux_lvm для работы с LVM разделами из-под FreeBSD. Проблемы которые возники при монтирование lvm раздела
2010-04-30, gonzo111
proftpd file auth&quota

Proftpd - квоты и авторизация из файлов, без использования базы данных и/или системных пользователей
подписка

    вверх      
Статистика сайта
Сейчас на сайте находится: 10 чел.
За последние 30 мин было: 41 человек
За сегодня было
612 показов,
58 уникальных IP
 

  Этот информационный блок появился по той простой причине, что многие считают нормальным, брать чужую информацию не уведомляя автора (что не так страшно), и не оставляя линк на оригинал и автора — что более существенно. Я не против распространения информации — только за. Только условие простое — извольте подписывать автора, и оставлять линк на оригинальную страницу в виде прямой, активной, нескриптовой, незакрытой от индексирования, и не запрещенной для следования роботов ссылки.
  Если соизволите поставить автора в известность — то вообще почёт вам и уважение.

© lissyara 2006-10-24 08:47 MSK

Время генерации страницы 0.0442 секунд
Из них PHP: 27%; SQL: 73%; Число SQL-запросов: 77 шт.
У Вас отключено GZIP-сжатие в браузере. Размер страницы 149857