Зазеркалье - могучая утилита mirror
В связи с насущной необходимостью создания собственного зеркала FTP официально сайта FreeBSD решил подобрать софт, умеющий нужные мне функции. Так как полоса была ограничена, требовалось решение,основным требованием которого было синхронизация директорий и поддиректорий, и зеркалировать файлы, дата создания которого была бы не старее указанной мною.
Исходя из этого, обратился к соответствующему разделу Руководства. Из всего списка рекомендуемых программ решил остановиться на ftp/mirror. Поподробнее об этой утилите: mirror (mirror.pl) позволяет копировать каталог с удаленного ftp-сервера на локальный диск вместе с его содержимым и поддерживать локальную копию в синхронном состоянии (удаляет файлы в локальной копии, если они удалены на сервере). Обладает гибкой настройкой, не копирует уже имеющиеся и не изменившиеся файлы (проверка по дате и размеру). Собирает журнал, сжимает, разжимает, переименовывает, бьет на куски на ходу, докачивает оборванные файлы и т.д. и т.п. Для разового копирования лучше использовать wget, а если есть доступ к удаленному серверу, то - rsync (он отслеживает изменения внутри файлов и работает быстрее). В дополнение к базовому уровню (mirror, mirror.pl) реализовано управление параллельным копированием нескольких каталогов с одного или нескольких серверов с отслеживанием интервала синхронизации (mm.pl, mirror-master) и процедура для ежедневного выполнения для вызова из cron (mirror.nightly). Позволяет копировать символьные ссылки (но не жесткие!). Сохраняет время модификации, но не сохраняет идентификаторы владельца и группы. Установка:
Далее нужно отредактировать файл по умолчанию, находящийся в /usr/local/lib/mirror и называющийся mirror.defaults.sample
Секция defaults служит для настроек по умолчанию, я же добавил свою:
Из которой понятно, что я провожу зеркалирование с ftp2.ru.freebsd.org, вход под анонимным пользователем, не удаляю старые файлы и зеркалирую те, возраст которых не превышает 365 дней, что примерно соответствует выходу FreeBSD 8.0-RELEASE. И собственно запуск:
mirror можно использовать в 2 режимах: с использованием описаний пакетов и без них. Если вы используете mirror без описаний пакетов, то, скорее всего, вам нужен не mirror, а wget, поэтому я описываю только первый метод использования:
Перед чтением описаний пакетов загружается файл с именем 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 и запускать по расписанию. |
Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь. Мы рекомендуем Вам зарегистрироваться либо зайти на сайт под своим именем.