Перейти к навигации · Перейти к содержимому

Time Machine своими руками

Теги

Заметка о настройки бэкапа на Mac OS X без использования Time Machine, а с помощью Unison.

В своей первой заметке о работе с Mac OS X я хочу рассказать о собственном опыте настройки автоматического бэкапа данных без использования Time Machine. Почему без нее? Несмотря на то, что это офигенно клевая и удобная программа, она все же заточена под определенные цели, а именно: полное архивирование системы, создание ее загрузочного образа, который быстро позволяет восстановить систему в случае ее поломки. Мне же нужно было сохранять лишь часть своих рабочих документов, а кроме того, эти документы должны быть доступны потом на PC — то есть использование маковской файловой системы отпадает.

Что я имею

  • Внешний диск на 320 Гб с системой FAT32
  • Макбук
  • Домашний PC, который должен иметь доступ к данным с этого же диска
  • Желание максимально автоматизировать процесс архивации данных таким образом, чтобы при каждом подключении диска к макбуку, бэкап происходил автоматически (самостоятельно нажимать кнопку я буду постоянно забывать, а бэкап по расписанию не подходит, т.к. диск подключен к ноуту не постоянно)

Конечно же архивация должна быть инкрементарной — чтобы не перегонять старые данные снова и снова. Наличие дополнительной архивации (сохранение версий) желательно, но не обязательно.

План спасения

Time Machine не подходит по нескольким причинам: а) Файловая система внешнего диска должна быть HFS+; б) Мне не нужен полный образ системы — лишь мои отдельные документы; в) Такой способ не подходит для бэкапа на простую флешку, например.

Я начал искать бесплатное и надежное решение среди сторонних программ, наиболее подходящими мне сначала показались SilverKeeper и iBackup. Я попробовал обе, но SK не смог сделать даже первый снимок, а iBackup «сломался» на втором этапе — инкрементарном бэкапе. То есть, сначала он все файлы скопировал, а когда во второй раз надо было скопировать лишь изменения, пошли ошибки. Думаю, что дело оказалось в непривычной для обеих программ файловой системе.

Я стал копать дальше и наткнулся на простое и клевое решение — программу Unison. Это кроссплатформенная программа, которой я сначала немного испугался (все-таки она больше заточена под CLI, чем под GUI), но все оказалось довольно просто — мануал доступно все объясняет. Ее я и решил использовать. Тем более, что для моих нужд работа с командной строкой была просто необходима.

Настройка Unison

Думаю, что возможности программы удовлетворят и самого взыскательного пользователя.

Unison — могучая программа. Ее возможности покрывают мои потребности с лихвой: я даже не настраивал дополнительную архивацию, но это вполне можно сделать при желании. Я остановился на том, что задал папку с документами и приказал программе зеркалировать ее в папку на внешнем диске. Вот мой файл конфига, делающий копию моей домашней папки:


# Unison preferences file
root = /Users/alex
root = /Volumes/WD320/_backup/macbook/
force = /Users/alex
ignore = Name {.DS_Store}
ignore = Name {unison.log}
ignore = Path {.*}
ignore = Path {Music}
ignore = Path {Movies}
ignore = Path {Library/Caches}
ignore = Path {Library/Mail}
ignore = Path {Library/Mail Downloads}
perms = 0
  • Первые две строчки означают «Откуда» и «Куда».
  • Параметр force указывает производить зеркалирование первого источника, а не двустороннюю синхронизацию
  • Правила игнорирования пропускают скрытые папки (начинающиеся с точки) и файлы .DS_Store, а также папки с музыкой и фильмами. Кроме того, я пропускаю папку с системным кешем и почтовые папки (т.к. все-равно пользуюсь IMAP от gmail, а значит все письма хранятся на сервере).
  • Параметр нужен для того, чтобы не было конфликтов с файловой системой FAT, которая не может сохранить юниксовые разрешения.

По большому счету, я мог бы вообще игнорировать папку /Library — а взять только свои собственные документы, но при игнорировании кеша и почты, эта папка занимает не очень много места (порядка 100 Мб), а полезные настройки и конфиги в ней тоже могут быть (см. ниже).

Для того, чтобы запустить процесс копирования на диск достаточно ввести в терминале команду:

unison backup_mac -ui text -silent

где backup_mac — это имя файла backup_mac.prf, который обычно лежит в папке /Users/alex/Library/Application Support/Unison. Вы можете назвать его как угодно, хоть default.prf — как он и называется по умолчанию.

Данная команда автоматически и без показа графического интерфейса сделает копию всех изменившихся файлов (удаляя при этом файлы на внешнем диске, которые были удалены с компьютера). Теперь осталось решить проблему с автоматическим запуском Unison при вставке моего диска.

Автоматический запуск

Для этого можно воспользоваться программой Automator, а можно написать свой AppleScript. Забегая вперед, скажу, что использовать пришлось обе техники.

Жаль, что в Автоматоре совсем не развито понятие логики условий типа if..else

Automator — очень клевая и красивая вещь, которая позволяет простым смертным (т.е. «непрограммистам») делать довольно гибкие скрипты-программы для обработки файлов, папок и пр. По большому счету, в ней нет ничего, чего не было бы в AppleScript, но зато сделано все очень красиво и удобно — достаточно перетащить нужные действия и программа будет готова. В моем случае можно было бы обойтись и вовсе без Автоматора (потому что требуется простая команда терминалу). Но если у вас, к примеру, происходит что-то более комплексное, скажем, перед запуском копирования вы хотите заархивировать все PDF-файлы в своей домашней папке, то Автоматор позволит это автоматизировать всего за пару кликов. Пользователи Windows могут только жадно глотать слюни, когда познакомятся с этой программой поближе. =)

Я настроил очень простой процесс (workflow), который выдает окно с подтверждением, хочу ли я сделать бэкап на диск, и, если я отвечаю положительно, делает свое черное дело в фоновом режиме. Сразу после окончания (если все прошло удачно) вылезает маленькое окошко уведомления Growl (если он стоит у вас в системе) о том, что все прошло хорошо. Как видите, ничего сложного, но в этот процесс легко можно встроить и дополнительные шаги, например архивацию или удаление файлов, произвести какие-то манипуляции с PDF-файлами и т.д.

Указанный процесс я сохранил в виде приложения (на самом деле в виде плагина к «действиям папки» — Folder Actions). Но как же привязать запуск приложения к вставке самого диска? В этом поможет AppleScript, совсем без кода, как видите, не обошлось.

Опущу подробности того, как я искал решение для моей задачи (т.к. AppleScript я совсем не знаю), приведу лишь код, который для меня работает:


on adding folder items to target_folder after receiving added_items
	set volumeName to "WD320" -- This is the display name of your external HDD volume; any of them if you have more than one.
	repeat with added_item in added_items
		if the displayed name of (info for added_item) is equal to volumeName then
			volumeMounted()
			exit repeat
		end if
	end repeat
end adding folder items to

on volumeMounted()
	try
		-- get modification date to determine that last backup was more than 1 day ago
		set logFileInfo to info for POSIX file "/Users/alex/unison.log"
		if modification date of logFileInfo < ((current date) - 24 * 60 * 60) then
			tell application "Macintosh HD:Users:alex:code:automator:wd_backup.app" to activate
		end if
	on error
		tell application "Macintosh HD:Users:alex:code:automator:wd_backup.app" to activate
	end try
	
end volumeMounted

Этот скрипт сохраняется в папке Folder Action Scripts (/Users/alex/Library/Scripts/Folder Action scripts) и вешается на папку /Volumes (для этого надо войти в настройки Действий папки, нажать + для добавления папки, а затем нажать Shift-⌘-G), ввести /Volumes и нажать Open.

Как я говорил, Automator в таком простом случае вообще не нужен — вы можете смело указывать прямую команду для Unison.

Что этот скрипт делает? Он проверяет, чтобы при добавлении в указанную папку (/Volumes) новых элементов (дисков, флешек и пр.), при совпадении имени (у меня — «WD320») запускалась бы функция volumeMounted(). Внутри этой функции я проверяю дату модификации файла unison.log. Этот файл автоматически создается при каждой синхронизации. И если этот файл менялся больше суток назад (или файла вообще нет), то запускается мой скрипт Автоматора, который и дает команду Unison'у.

Другие возможности

Естественно, такой способ можно использовать не только для создания бэкапа на внешнем диске, а, например, для синхронизации работы между двумя компьютерами через флешку. Для этого уберите параметр force из конфига Unison (а также можно убрать проверку даты последней синхронизации). И тогда, при каждой вставке флешки, у вас будут синхронизироваться изменения сделанные и на другом компьютере (правда, разрешение конфликтов при одновременном изменении одних и тех же файлов видимо придется взять на себя).

Вот и все. И еще раз, я вовсе не хочу сказать, что все описанное отменяет Time Machine. Для полного бэкапа своей системы я пользуюсь именно Time Machine, потому что она очень проста и удобна. Данная заметка показывает как связать Unison (позволяющий гораздо более гибко настраивать синхронизацию и архивирование), Automator (облегчающий выполнение автоматических действий над файлами) и AppleScript с Folder Actions — чтобы получить гибкую и простую систему синхронизации/архивации ваших данных. Если у кого есть какие замечания — пишите, с удовольствием выслушаю, так как сам в этих вопросах новичок и мог что-то не досмотреть.

Комментарии

Ну и как успехи?