MyTetra Share
Делитесь знаниями!
Заказать торт на дом кондитерскии дом вкусная высота торты.
Резервное копирование при помощи rdiff-backup
Время создания: 19.09.2012 16:49
Текстовые метки: rdiff-backup, linux
Раздел: Компьютер - Linux - Bash - Команды и скрипты
Запись: xintrea/mytetra_syncro/master/base/1348058977kyydqo94ck/text.html на raw.github.com

Резервное копирование при помощи rdiff-backup

Способов резервного копирования файлов несчётное количество, как, впрочем. и инструментов для его осуществления. Сегодняшней заметкой я хочу обратить ваше внимание на довольно популярную утилиту инкрементного копирования под названием rdiff-backup.

rdiff-backup — приложение написанное на Python, обладает большой гибкостью и довольно простое в обращении. Может работать как локально, так и поверх rsync/ssh, предоставляя возможность оптимально использовать каналы передачи данных в случае удалённых бекапов. Среди основных плюшек rdiff-backup можно выделить следующие возможности.

  • Инкрементное копирование, позволяющее восстановить любой файл, удалённый до последней операции бэкапа. То есть, вы можете восстановить файл, который был удалён хоть год назад, при том что резервное копирование у вас выполняется, скажем, два раза в день.
  • Сохранение всей информации о файлах. Восстанавливая файл из архива rdiff-backup, вы получите его в таком виде, в каком он был на момент занесения в архив, включая таймштампы, права доступа, владельцев и т. п. Помимо всего прочего, rdiff-backup корректно управляется с жёсткими и символическими ссылками, файлами устройств и FIFO. При этом утилита корректно будет вести себя в различных операционных системах, использующих разные типы файловых систем.
  • Эффективное использование дискового пространства. Используя алгоритм rsync, утилита rdiff-backup сохраняет только изменения файлов, а не все файлы целиком. То есть, ваша БД весом в пару десятков гигабайт не будет каждый раз копироваться целиком, съедая пространство на диске. Будут копироваться только изменения.
  • Эффективное использование каналов передачи данных в случае сетевых бэкапов само-собой вытекает из предыдущего пункта.
  • «Прозрачное» хранение данных. rdiff-backup хранит бэкапы в точно таком же виде, в каком файлы находились на диске, не прибегая ни к каким хитроумным форматам. То есть, например, если вам понадобиться восстановить последний бэкап, не используя при этом rdiff-backup, вы сможете просто скопировать нужные файлы обратно на место.
  • Автоматическое определение типов файловых систем позволяет утилите избавить вас от полного понимания всех тонкостей её настройки в зависимости от типа используемых ФС и ОС.

Установка

В современных Linux-дистрибутивах rdiff-backup имеется в репозиториях, так что с её установкой у вас не должно возникнуть проблем. В случае же, если вы используете что-то другое, посетите главную страницу проекта, с которой можно скачать исходные коды.

Локальное резервное копирование

Под «локальным» или «удалённым» здесь и далее понимается получатель резервной копии. Сперва давайте рассмотрим самый простой способ запуска утилиты:

$ rdiff-backup <источник> <получатель>

Эта команда, как понятно из описания, выполнит резервное копирование из <источник> в <получатель>. Обратите внимание, что в качестве получателя необходимо указывать либо пустой, либо несуществующий каталог, иначе rdiff-backup вежливо вам откажет, что правильно.

В режиме по умолчанию rdiff-backup довольно молчалива, и не надоедает диагностическими сообщениями до тех пор, пока не столкнётся с ошибкой. Регулировать разговорчивость утилиты можно при помощи короткой опции '-v' или её длинного аналога '--verbosity'. Значение опции может принимать значения от 0 до 9 (по умолчанию оно равно 3). Например, уровень 4 перед началом процедуры копирования выведет вам сводку опций работы утилиты:

$ rdiff-backup -v 4 /var/log ~/log.backup

Using rdiff-backup version 1.2.8

Unable to import win32security module. Windows ACLs

not supported by filesystem at /var/log

escape_dos_devices not required by filesystem at /var/log

-----------------------------------------------------------------

Detected abilities for source (read only) file system:

Access control lists On

Extended attributes On

Windows access control lists Off

Case sensitivity On

Escape DOS devices Off

Escape trailing spaces Off

Mac OS X style resource forks Off

Mac OS X Finder information Off

-----------------------------------------------------------------

Unable to import win32security module. Windows ACLs

not supported by filesystem at log.backup/rdiff-backup-data/rdiff-backup.tmp.0

escape_dos_devices not required by filesystem at log.backup/rdiff-backup-data/rdiff-backup.tmp.0

-----------------------------------------------------------------

Detected abilities for destination (read/write) file system:

Ownership changing On

Hard linking On

fsync() directories On

Directory inc permissions On

High-bit permissions On

Symlink permissions Off

Extended filenames On

Windows reserved filenames Off

Access control lists On

Extended attributes On

Windows access control lists Off

Case sensitivity On

Escape DOS devices Off

Escape trailing spaces Off

Mac OS X style resource forks Off

Mac OS X Finder information Off

-----------------------------------------------------------------

Backup: must_escape_dos_devices = 0

Starting mirror /var/log to log.backup

В то время как девятый уровень будет сообщать о каждом шаге:

$ rdiff-backup -v 9 /var/log ~/log.backup

...

Tue Mar 6 04:50:07 2012 Processing changed file wtmp.1

Tue Mar 6 04:50:07 2012 Regular copying ('wtmp.1',) to log.backup/rdiff-backup.tmp.121

Tue Mar 6 04:50:07 2012 Writing file object to log.backup/rdiff-backup.tmp.121

Tue Mar 6 04:50:07 2012 Copying attributes from ('wtmp.1',) to log.backup/rdiff-backup.tmp.121

Tue Mar 6 04:50:07 2012 Setting time of log.backup/rdiff-backup.tmp.121 to 1330553626

Tue Mar 6 04:50:07 2012 Renaming log.backup/rdiff-backup.tmp.121 to log.backup/wtmp.1

Tue Mar 6 04:50:07 2012 Copying attributes from () to log.backup

Tue Mar 6 04:50:07 2012 Setting time of log.backup to 1330980760

Tue Mar 6 04:50:07 2012 Touching log.backup/rdiff-backup-data/extended_attributes.2012-03-06T04:50:07+02:00.snapshot

Tue Mar 6 04:50:07 2012 Touching log.backup/rdiff-backup-data/access_control_lists.2012-03-06T04:50:07+02:00.snapshot

Tue Mar 6 04:50:08 2012 Writing mirror marker log.backup/rdiff-backup-data/current_mirror.2012-03-06T04:50:07+02:00.data

Tue Mar 6 04:50:08 2012 Cleaning up

Tue Mar 6 04:50:08 2012 Touching log.backup/rdiff-backup-data/error_log.2012-03-06T04:50:07+02:00.data

...

Удалённое резервное копирование

Этот тип копирования выполнить настолько же просто, как и локальное. Всё, что меняется — это формат указания источника/получателя. Также на удалённой системе должна быть установлена rdiff-backup и работать SSH-сервер. Например следующая команда:

$ rdiff-backup -v 5 /var/log backup@my-server.com::/var/backups/log.host123

  1. установит соединение с сервером my-server.com при помощи SSH;
  2. запустит на сервере rdiff-backup в режиме --server;
  3. выполнит передачу файлов с локальной системы серверу my-server.com в каталог /var/backups/log.host123

То же самое будет работать и в обратном направлении, т. е., если вам необходимо выполнить копирование удалённых файлов в локальную систему, просто поменяйте местами источник с получателем в опциях утилиты:

$ rdiff-backup -v 5 backup@my-server.com::/var/log /var/backups/logs-my-server.com

Получение информации о результатах копирования

Обычно многословный вывод команд требуется в период отладки и написания сценариев, не более. Для ежедневного мониторинга результатов работы утилиты желательно иметь лишь краткую сводку. Для этого rdiff-backup предлагает отдельную опцию '--print-statistics':

$ rdiff-backup --print-statistics /var/log ~/log.backup

Warning: Access Control List file not found

--------------[ Session statistics ]--------------

StartTime 1331003360.00 (Tue Mar 6 05:09:20 2012)

EndTime 1331003385.71 (Tue Mar 6 05:09:45 2012)

ElapsedTime 25.71 (25.71 seconds)

SourceFiles 139

SourceFileSize 7006201 (6.68 MB)

MirrorFiles 339

MirrorFileSize 16991862 (16.2 MB)

NewFiles 65

NewFileSize 1504824 (1.44 MB)

DeletedFiles 265

DeletedFileSize 12116918 (11.6 MB)

ChangedFiles 74

ChangedSourceSize 5501377 (5.25 MB)

ChangedMirrorSize 4874944 (4.65 MB)

IncrementFiles 404

IncrementFileSize 2136990 (2.04 MB)

TotalDestinationSizeChange -7848671 (-7.49 MB)

Errors 0

--------------------------------------------------

Включение исключение файлов

«Не все йогурты одинаково полезны» — гласит народная пословица. Это же касается и файлов при резервном копировании. Часто-густо в копируемых каталогах попадаются файлы, размер которых весьма немаленький, а смысла включать их в бэкап нет. Здесь у rdiff-backup (как, впрочем и у всех остальных утилит подобного рода) предусмотрены свои возможности. Используя опцию '--exlude', вы можете исключать отдельные файлы и каталоги:

$ rdiff-backup --exclude /proc / backup@my-server.com::/var/backups

Эту опцию можно использовать сколько угодно раз:

$ rdiff-backup --exclude /proc --exclude /mnt --exclude /tmp / backup@my-server.com::/var/backups

Иногда проще указать то, что нужно скопировать, вместо того, что НЕ нужно. Следующая команда скопирует, например, /usr/local/bin, пропустив при этом /usr/bin:

$ rdiff-backup --include /usr/local --exclude /usr / backup@my-server.com::/var/backups

Обратите внимание, что при множественном использовании опций '--include' / '--exclude' их приоритет зависит от порядка появления в команде.

rdiff-backup позволяет использовать шаблоны подобные тем, которые используются в rsync: '**' эквивалентны любому пути, а '*' — любому пути без завершающего слеша. Так, например, следующая команда скопирует /usr/local и /var, но пропустит всё остальное:

$ rdiff-backup --include /usr/local --include /var --exclude '**' / /backup

Обратите внимание на кавычки. Они нужны, поскольку большинство оболочек обрабатывают звёздочки как спецсимволы, превращая их в маски.

Пример чуть посложнее:

$ rdiff-backup --include '**txt' --exclude /usr/local/games --include /usr/local --exclude /usr --exclude /backup --exclude /proc / /backup

Эта команда скопирует все файлы, имена которых заканчиваются суффиксом 'txt'. Обратите внимание: будут скопированы также все txt-файлы также из каталогов, /usr/local и /backup, поскольку первый --include имеет более высокий приоритет.

Вообще, утилита rdif--backup предлагает довольно богатый набор опция для фильтрации файлов, перечислять который в полном объёме нет смысла, поскольку всё «уже украдено до нас» в man-странице приложения. Тем, кто ещё туда не заглядывал, скажу что вы можете фильтровать файлы на основе регулярных выражений, типе самих файлов (символически/жесткие ссылки, сокеты, устройства, FIFO и т. п.), а также на основе файловых списков включений/исключений, при чём сами файловые списки можно передавать через stdin.

Так же в этом разделе:
 
MyTetra Share v.0.65
Яндекс индекс цитирования