DataLife Engine > Порты и пакеты > Зазеркалье - могучая утилита mirror

Зазеркалье - могучая утилита mirror


02-11-2010. Разместил: synergix Зазеркалье - могучая утилита mirror В связи с насущной необходимостью создания собственного зеркала FTP официально сайта FreeBSD решил подобрать софт, умеющий нужные мне функции. Так как полоса была ограничена, требовалось решение,основным требованием которого было синхронизация директорий и поддиректорий, и зеркалировать файлы, дата создания которого была бы не старее указанной мною.
Исходя из этого, обратился к соответствующему разделу Руководства. Из всего списка рекомендуемых программ решил остановиться на ftp/mirror.

Поподробнее об этой утилите:
mirror (mirror.pl) позволяет копировать каталог с удаленного ftp-сервера на локальный диск вместе с его содержимым и поддерживать локальную копию в синхронном состоянии (удаляет файлы в локальной копии, если они удалены на сервере). Обладает гибкой настройкой, не копирует уже имеющиеся и не изменившиеся файлы (проверка по дате и размеру). Собирает журнал, сжимает, разжимает, переименовывает, бьет на куски на ходу, докачивает оборванные файлы и т.д. и т.п. Для разового копирования лучше использовать wget, а если есть доступ к удаленному серверу, то - rsync (он отслеживает изменения внутри файлов и работает быстрее). В дополнение к базовому уровню (mirror, mirror.pl) реализовано управление параллельным копированием нескольких каталогов с одного или нескольких серверов с отслеживанием интервала синхронизации (mm.pl, mirror-master) и процедура для ежедневного выполнения для вызова из cron (mirror.nightly). Позволяет копировать символьные ссылки (но не жесткие!). Сохраняет время модификации, но не сохраняет идентификаторы владельца и группы.

Установка:

#cd /usr/ports/ftp/mirror
#make install clean


Далее нужно отредактировать файл по умолчанию, находящийся в /usr/local/lib/mirror и называющийся mirror.defaults.sample

#cp /usr/local/lib/mirror/mirror.defaults.sample /etc/mirror.conf
#ee mirror.conf


Секция defaults служит для настроек по умолчанию, я же добавил свою:

package=unix.uz
        site=ftp2.ru.freebsd.org
        remote_dir=/pub/FreeBSD/distfiles
        remote_user=ftp
        remote_password=synergix@mail.ru
        timeout=365
        ftp_port=21
        max_days=10
        local_dir=/var/ftp/pub/FreebSD/distfiles
        do_deletes=false
        recursive=true


Из которой понятно, что я провожу зеркалирование с ftp2.ru.freebsd.org, вход под анонимным пользователем, не удаляю старые файлы и зеркалирую те, возраст которых не превышает 365 дней, что примерно соответствует выходу FreeBSD 8.0-RELEASE.

И собственно запуск:
#mirror -d /etc/mirror.conf


mirror можно использовать в 2 режимах: с использованием описаний пакетов и без них. Если вы используете mirror без описаний пакетов, то, скорее всего, вам нужен не mirror, а wget, поэтому я описываю только первый метод использования:

mirror флаги имя-файла-содержащего-описание-пакета ...


Перед чтением описаний пакетов загружается файл с именем mirror.defaults из $PATH (или .), содержащий значения по умолчанию различных параметров. Затем mirror по очереди читает описания пакетов (единиц работы), отсоединяется от предыдущего сайта, подсоединяется к новому сайту, получает оглавления удаленной и локальным каталогом, сравнивает их для получения списка изменившихся файлов, фильтрует список с помощью шаблона исключений и других критериев, загружает файлы из списка с сайта (используется временное имя файла .in.имя-файла. на случай аварийного завершения), сжимает и разбивает полученный файл, переименовывает его, удаляет локальные файлы при удалении оригинала на сервере.

Флаги:

-d (отладка, использование несколько раз увеличивает уровень отладки)
-n (пробный прогон)
-p имя-пакета (извлечь из файлов описание только указанного пакета, можно использовать несколько раз, указывается регулярное выражение)
-R имя-пакета (пропустить пакеты до указанного)
-F (использовать временные DBM файлы в /var/tmp для хранения оглавлений; файлы создаются, но это слабо помогает: объем требуемой памяти уменьшается с 70 до 54 MB; при аварийном завершении файлы не удаляются)
-T (только установить времена модификации файлов, не копировать их)
-Uимя-файла (записывать все пересылки файлов в указанный журнал)
-k ключ=значение (установить значение параметра)
-u имя-пользователя (пароль запрашивается с отключенным эхом)

Каждый пакетный файл может содержать описания нескольких пакетов (заданий на копирование и синхронизацию).
Пакет с именем defaults (обычно из файла mirror.defaults) содержит значения параметров по умолчанию. Пустые строки и строки, начинающиеся с #, рассматриваются как комментарии. Знак "&" в конце строки означает продолжение текста оператора на следующей строке (знак "&" и пробелы в начале строки удаляются). Описание пакета состоит из операторов, устанавливающих значения параметров вида (пробелы за знаками "=" и "+" являются значимыми!):

имя=значение (присвоение значения)
или
имя+значение (добавление значения в конец строки значения по умолчанию)

Пакеты разделяются оператором, определяющим имя пакета:

package=имя-пакета

Параметры

* описание удаленного сайта и файлов на нем
site (имя или IP адрес удаленного сервера)
remote_dir
remote_user (anonymous)
remote_password (имя-пользователя@имя-локального-хоста)
remote_account (выполняется команда "account")
remote_group (выполняется команда "site group")
remote_gpass (выполняется команда "site gpass")
timeout секунд
failed_gets_excl регулярное-выражение (тексты сообщений об ошибках команды GET, которые не надо включать в отчет)
ftp_port (21)
proxy (false)
proxy_ftp_port (4514)
proxy_gateway
using_socks (false)
passive_ftp (false)
retry_call (true, однократный повтор после минутной паузы)
disconnect (false, отсоединиться от сайта сразу по концу пакета)

* какие файлы копировать и как
get_patt (регулярное выражение, задающее шаблон имен файлов подлежащих копированию)
exclude_patt (регулярное выражение, задающее шаблон имен файлов, которые не надо копировать)
get_newer (true, копировать удаленный файл, если он новее локального)
get_size_change (true, копировать удаленный файл, если его размер отличается от локального)
force (false, копировать файлы, не глядя на размер и время)
make_bad_symlinks (false, создавать символьные ссылки, указывающие в никуда)
get_missing (true, иначе только удалять и делать символьные ссылки)
get_file (true, иначе mirror копирует в обратную сторону)
text_mode (false)
strip_cr (false)
vms_keep_versions (true)
vms_xfer_text (readme|info|listing|\.c, шаблон имен файлов VMS, которые будут передаваться в текстовом режиме)
name_mappings (none, команда substitute языка perl для переименования файлов при копировании)
update_local (false, в момент запуск get_patt устанавливается равным списку файлов в локальном каталоге)
max_days (0, если больше 0, то игнорировать файлы более старые, чем указанное число дней; действует как на удаленные, так и на локальные файлы, т.е. они не удаляются)
max_size (0, если больше 0, то не копировать файлы, имеющие размер больше указанного)
hostname (none, пропускать пакеты, у которых site совпадает с hostname)
skip (none, пропустить пакет, текст сообщения помещается в отчет)

* описание локального сервера и файлов
local_dir (обычно задается относительно значения по умолчанию)
user (none, имя пользователя для chown)
group (none, имя группы для chgrp)
local_ignore (регулярное выражение, задающее имена локальных файлов, которые не надо синхронизировать)
follow_local_symlinks (none, регулярное выражение задает шаблон локальных символьных ссылок, которые будут "прозрачными" для mirror)
chmod (true, устанавливать атрибуты файла после копирования, в т.ч. время модификации)
mode_copy (false, копировать атрибуты файлов и каталогов с удаленного сайта)
file_mode (0444, атрибуты создаваемых файлов, если mode_copy не установлен)
dir_mode (0755, атрибуты создаваемых каталогов, если mode_copy не установлен)
umask (07000)
use_timelocal (true, устанавливать время модификации скопированных файлов в соответствии с локальной временной зоной, а не GMT)
bindname (none, моя самоделка, к какому интерфейсу привязывать сокет перед соединением с сервером)

* управление удалением устаревших файлов
do_deletes (false, удалять локальные файлы, если соответствующие им удаленные файлы были удалены)
delete_patt (., регулярное выражение для проверки имен локальных файлов как кандидатов для удаления)
delete_get_patt (false, установить delete_patt равным get_patt)
delete_excl (none, регулярное выражение для задания имен локальных файлов, не подлежащих удалению)
max_delete_files (10%, предупреждать вместо удаления, если число кандидатов на удаление преваышает указанное число файлов или процентов)
max_delete_dirs (10%, аналогичная проверка для каталогов)
save_deletes (false, вместо удаления файлов сохранять их в архивном каталоге)
save_dir (Old, имя архивном каталоге относительно local_dir)
store_remote_listing (none, имя локального файла для хранения листинга удаленных каталогов)

* управление сжатием файлов (не любит файлы с пробелами и спецсимволами)
compress_patt (none, регулярное выражение для задания имен локальных файлов, подлежащих сжатию)
compress_excl (\.(z|gz)$, шаблон исключений, регистр не учитывается)
compress_prog (compress, программа для сжатия)
compress_suffix (.Z для compress, .gz для gzip)
compress_conv_patt ((\.Z|\.taz)$, подпадающие под шаблон файлы декомпрессируются перед сжатием gzip)
compress_conv_expr (s/\.Z$/\.gz/;s/\.taz$/\.tgz/, выражение perl для преобразования суффикса файла при его рекомпрессии из формата compress в gzip)
compress_size_floor (0, не сжимать файлы, размер которых меньше указанного)

* управление разбиением файлов (создается каталог с именем, совпадающим с именем исходного файла, в которой создаются файлы part1, part2, ...)
split_max (0, если больше 0, то разбивать файлы, размер которых больше указанного и имя соответствует шаблону split_patt)
split_patt (регулярное выражение имен файлов - кандидатов на разбиение)
split_chunk (102400, размер кусков)

* формат листинга удаленных каталогов

remote_fs (unix, поддерживаются следующие форматы листинга: unix, dls, netware, vms, dosftp, macos, lsparse, infomac)
ls_lR_file (none, имя удаленного файла, содержащего результат "ls -lR", иначе выполняется команда LIST)
local_ls_lR_file (none)
force_times (yes, при сравнении времен считать, что в листинге удаленных каталогов использованы локальные времена)
recursive (true)
recurse_hard (false, если удаленный сервер не поддерживает рекурсивный листинг каталогов, то делать его "по шагам": CWD, LIST)
flags_recursive (-lRat, передаваемые серверу флаги для выполнения рекурсивного листинга)
flags_nonrecursive (-lat, передаваемые серверу флаги для выполнения нерекурсивного листинга)
ls_fix_mappings (none, команда замены perl для преобразования удаленного листинга)

* управление журнализацией
update_log (none, имя файла журнализации относительно local_dir)
mail_to (none)
mail_prog (none)
mail_subject (-s "mirror update", можно написать: -s "mirror update: $package")
comment (none, вставляется в отчет)
verbose (false)

* оптимизация
use_files (false, использовать временные DBM файлы в /var/tmp для хранения оглавлений; файлы создаются, но не удаляются; помогает плохо: например, объем требуемой для копирования CPAN памяти уменьшается с 70 до 54 MB)
algorithm (0:
+ 0 - весь сайт за раз (дружелюбно по отношению к удаленному сайту. но может потребовать много оперативной памяти)
+ 1 - по каталогу за раз (недружелюбно по отношению к удаленному сайту. требует меньше оперативной памяти)


Вот такая вот могучая утилита. Осталось только поставить ее в crontab и запускать по расписанию.
Вернуться назад