Я, как и многие, задумывался о бэкапах. Неспешно думал-думал, рассматривал разные варианты, пока не сгорел винчестер на ноутбуке жены. Это печальное событие подстегнуло мою активность, результат которой хочу представить в этой статье.Речь пойдет о резервном копировании. Я буду подробно обсуждать именно свою задачу. Возможно, у кого-то обстоятельства чем-то отличаются, но и таких как я должно быть достаточно много. Поэтому, надеюсь, мои советы окажутся полезными большому числу людей.
Для начала определимся, что сохранять. Для меня на первом месте фотографии. В 2003-м году я купил первый цифровой фотоаппарат, и с тех пор все мои фото хранятся в цифровом виде. У моих родителей есть альбом с фото моих прабабушек и прадедушек. Я же не оставлю ничего на бумаге новее 2003-го года. Поэтому надо особенно позаботиться о сохранности цифровых фотографий. Сейчас моя папка с фото «весит» 180 гигабайт и прирастает по гигабайту-другому в месяц.
Кроме фото есть файлы с разнообразными проектами. Например, данная статья станет одним из них. Это текстовые файлы, программы. Места занимают немного, но в них вложена куча труда. Есть также коллекция музыки, часть которой я собственноручно оцифровывал с компакт-дисков. Одно время я увлекался видеомонтажем – с тех пор осталось около 300 гигабайт наработок. Все это было бы очень обидно потерять. Еще одно хранилище данных – рабочий ноутбук. У нас на фирме все ценное хранится централизованно: код в SVN, документы на Sharepoint, и т.п. За их сохранность отвечает IT, и пока проблем не было. Однако у меня на моей машине есть подборка файлов, которую я сделал под себя. Она повышает мою продуктивность, и я бы хотел иметь какие-то гарантии, что это все не сгинет, если винчестер однажды прикажет долго жить.

Несколько слов о том, что мне не надо копировать. Нет смысла сохранять дистрибутивы и фильмы. То, что скачано из сети, можно скачать еще раз. А дистрибутивы теряют актуальность после выхода более новых версий. Мне также не нужно делать резервное копирование системы. По моему опыту крах системы случается довольно редко, и является хорошим поводом обновить версию OS, используемых программ, а то и железо проапгрейдить.
Все мои компьютеры работают под Windows. Я подумывал поставить Linux второй системой специально для резервного копиро��ания, но потом решил так не делать. У меня очень мало опыта с unix-системами, значит, я потрачу слишком много времени на настройку, наверняка что-то сделаю не так. Бэкап будет делать неудобно, он будет делаться редко.
Теперь о том, от каких угроз я пытаюсь оградиться. Во-первых, это внезапный отказ жесткого диска. От этой напасти помогает RAID-массив. Мой текущий компьютер имеет RAID-1, но, подумав, я решил этим не ограничиваться. В жизни бывает всякое. Например, рассказывают про неожиданные скачки напряжения, в результате которых сгорает все содержимое системного блока. Также, с гораздо большей вероятностью, можно попасть под атаку особо злого вируса с очень печальными последствиями. Я однажды поимел проблемы и без вируса: ставил Windows из дистрибутива с более старым сервис паком, чем стоял ранее. Запустился check disk, который не опознал файлы, созданные предыдущей системой, и принялся их «исправлять», наводя хаос и разрушения. Вообще же удалить ценную информацию можно и своими руками, по ошибке. На мой взгляд, идеальным решением является бэкап на внешний USB-диск. Сейчас можно купить диски достаточного объема. Если подключать его к компьютеру только изредка, можно не бояться скачков напряжения и вирусных атак. Надежность такого диска ничуть не хуже надежности обычных винчестеров.
Остается решить вопрос, каким образом делать бэкапы. Самый простой способ: скопировать все. Однако в долгосрочной перспективе это не работает. Файлы на компьютере постоянно меняются. Делать каждый раз копию всего – не выход, т.к. каталог с картинками, например, в основном остается неизменным, только кое-что дописывается (хотя нельзя исключить и небольшие изменения в старых файлах). Значит, надо отслеживать разницу. Сразу возникает куча вопросов: как это делать, надо ли хранить старые копии, и т.п. Наверняка все эти вопросы уже как-то решены. Я попытался найти, как же эти проблемы решают другие люди. В идеале нужна какая-то софтина, которая бы обобщала опыт поколений компьютерщиков, и делала бы все в лучшем виде. Вот история моих исканий.
Первым делом мне посоветовали Norton Ghost. Правда, оказалось, что этот продукт уже не продается, а вместо него какой-то Symantec system recovery. Данный софт заточен под бэкап системы. Он, наверно, хорошо подходит тем, кто поддерживает большой парк однотипных машин. Что-то случилось с компьютером бухгалтера? Не беда, за полчаса восстанавливаем чистую систему из архива, а данные все равно в 1С. Я же, в случае чего, лучше переставлю систему, совместив это с переходом на более свежие версии операционки и программ, которыми пользуюсь.
Следующим пунктом были рассмотрены «штатные средства». Это «архивация данных» в Windows 7, или ntbackup в XP. Я немного изучил вопрос, и выяснилось, что Windows 7 делает инкременталлльный бэкап, правда, каким-то странным замысловатым способом. На просторах сети нашелся вот такой скриншот:

По нему и по описаниям можно сделать вывод, что система в первый раз пакует все данные в архив, а в следующие разы находит изменившиеся файлы, и создает архив с дельтой. Не знаю, на кого рассчитан этот алгоритм, а мне он явно не подходит. Во-первых, у меня основной объем создают картинки, которые жать не надо. Данные, которые неплохо жмутся, занимают у меня не очень большой объем. Вообще сейчас даже офисные документы представляют собой zip архив. Во-вторых, совершенно не понятно, как администрировать этот набор зипников. Можно ли, например, удалить один из них, если срочно понадобится место? Можно ли оставить несколько определенных версий нужной мне папки, а остальное удалить? И наконец, самое неприятное – нет никакой уверенности, что эти данные можно будет без проблем восстановить в будущем. Алгоритм бэкапа поменялся при переходе от XP к 7-ке. Нет никакой уверенности, что какая-нибудь Виндовс 10 не забудет об этих бэкапах. А может я вообще пересяду на Мак или Линукс или какой-нибудь будущий Андроид для десктопов – кто знает. В общем, механизм, который меня устроит, должен давать результат в понятном виде, с использованием распространенных форматов, и чтобы его можно было развернуть без проприетарного софта.
Еще одно потенциальное решение для сохранения данных – хранить все в сети. Но тут тоже есть нюансы. Во-первых, это дорого. Мне надо хранить до терабайта данных. Сколько же это стоит?
- «Сетевое резервное копирование» в «магазине Нортон» предлагается 5 ГБ — 550 р, 25 ГБ — 1750 р.
- Яндекс.диск: 9000 руб в год за 1 терабайт.
- Гугл.диск: 50 долларов в месяц за 1 терабайт.
Кроме дороговизны не оставляет беспокойство, а вдруг в один не очень прекрасный день файлы окажутся недоступны? Например, хакеры могут завладеть моим акаунтом, использовать его для рассылки спама, и администрация его закроет (так я был избавлен от акаунта на Одноклассниках). Также можно однажды увидеть надпись «этот сервис не доступен в вашей стране» (да-да, как на ютубе). Теоретически, сам сервис может потерять популярность и закрыться (кстати, как там поживает мой сайт на народ.ру?). Страшно представить, что станет с моими данными, если компания, которая их держит, однажды обанкротится.
К счастью, на просторах интернета нашелся способ, как решить проблему с бэкапом под windows: blog.jay2k1.com/2011/08/13/how-to-create-rsync-like-hard-link-backups-with-vss-on-windows
Проблема была решена путем запуска линуксового rsync с помощью библиотеки cygwin’а, и с передачей ему на вход данных через службу теневого копирования (Volume Shadow Copy Service or VSS). Что же это дает?
Далее следует вольный перевод куска статьи по ссылке.
Во-первых, небольшой ликбез про хардлинки для тех, кто не знает, что это такое (я вот об этом не знал). Предположим у вас есть текстовый файл со словами «превед медвед», лежащий по адресу c:\files\hello.txt. Его содержимое записано на диске в каком-то месте, предположим, в позиции 10246, и это отражено в «оглавлении» диска. В оглавлении говорится, что «есть файл hello.txt, он лежит в папке c:\files, и его содержимое лежит в позиции 10246». Связка между именем файла и самим куском данных называется хардлинк. Когда вы удаляете файл, данные не стираются, а только удаляется хардлинк. Без хардлинка система больше не знает, что за данные лежат по тому адресу, и если никакой другой хардлинк не указывает на позицию 10246, эта позиция считается свободной. Со временем она может перетереться другими данными. В общем, «удаление файла» на самом деле является удалением хардлинка.
Запись в «оглавлении диска» не занимает много места, поэтому допускается множество хардлинков к одному и тому же файлу. В нашем примере можно создать второй хардлинк к нашему файлу, скажем, c:\test.txt. Тогда оба дескриптора (c:\test.txt и c:\files\hello.txt) будут указывать на одно и то же содержимое («превед медвед» на позиции 10246). Все будет выглядеть так, как будто имеется 2 файла с одинаковым содержимым, но на самом деле это один и тот же файл, только с разными именами. Если открыть c:\files\hello.txt и вписать туда «аффтар выпей йаду», а затем закрыть этот файл и открыть c:\test.txt – мы увидим в нем эти изменения.
Для бэкапов хардлинки обладают двумя очень полезными свойствами: 1) они почти не занимают места, и 2) файл не удаляется, пока на него ссылается хотя бы один хардлинк. Алгоритм бэкапа, основанный на этом, работает так:
Сначала копируем все данные в папку для резервного копирования, скажем, в “f:\backups\1\“. При следующем запуске сравниваем файл с предыдущим набором бэкапа.
- Если файл новый или поменялся, копируем его в “f:\backups\2\“.
- Если файл не поменялся с прошлого раза, делаем хардлинк на то же место, на которое указывает хардлинк из предыдущего бэкапа. В результате на одни и те же файлы будут указывать 2 набора хардлинков: из бэкапа номер 1 и номер 2. Место на диске не тратится на дубликаты, зато пользователю кажется, что у него 2 полных бэкапа. На самом деле второй бэкап содержит только новые и измененные файлы, и хардлинки на остальные файлы из первого бэкапа. А если однажды кончится место – можно удалить первый бэкап, и при этом удалятся только те файлы, которые не используются вторым. То есть нам не надо делать полный бэкап еще раз.
Вся эта магия по работе с хардлинками делается с помощью утилиты rsync, которая родом из *nix систем, но работает под Windows с помощью библиотек cygwin’а. Но это еще не все. Дело в том, что винда запрещает копировать некоторые файлы, если они заблокированы программами, которые их открыли. Чтобы это обойти, rsync копирует файлы, используя VSS. Как говорит википедия, VSS — это такая служба операционной системы Windows, которая позволяет копировать файлы, с которыми в данный момент времени ведется работа. Можно даже копировать системные и заблокированные файлы. Служба необходима для работы следующих программ: восстановление системы, программ архивации (Acronis True Image и другие).
По данной ссылке (http://pub.jay2k1.com/rsyncbackup.zip) доступна сборка, выполняющая бэкап. Она работает по следующему алгоритму: в файле vss-exec.cmd надо указать, какой диск будет бэкапиться, и куда будут складываться копии. Также в файле rsync-excludes.txt можно указать папки-исключения, не подвергающиеся бэкапу.
Бэкап запускается при помощи _start_backup.cmd. В папке для бэкапа создается папка с именем компьютера, в ней – набор папок бэкапов, которые называются согласно времени бэкапа. В vss-exec.cmd настраивается максимальное количество бэкапов. Если это число достигнуто, скрипт удаляет первую, и затем создает еще один бэкап по указанному выше а��горитму.
Это уже практически то, что мне нужно, но есть пара моментов. Данный скрипт бэкапа рассчитан на такую ситуацию, когда все содержимое какого-то диска копируется на какой-то другой диск в этом же компьютере. Моя параноя требует бэкапа на внешний носитель, а в этом случае появляются некоторые проблемы:
- Во-первых, съемный диск может, по воле великого рандома, монтироваться на разные буквы, и их придется поправлять в vss-exec.cmd при каждом запуске бэкапа, что неудобно.
- Во-вторых, я собираюсь делать бэкап с нескольких компьютеров на один съемный диск, а для этого придется конфигурировать бинарники бэкапа на каждом компьютере – лишняя работа, лишняя возможность сделать что-то не так.
- В-третьих, нельзя сделать бэкап выбранных папок с нескольких разных дисков.
Я поправил скрипт, реализовав следующий сценарий:
- Необходимо создать и сконфигурировать бинарники бэкапа только на том съемном диске, куда делается бэкап
- На каждом компьютере, данные с которого бэкапятся, надо создать файл C:\ backup_folders.ini, в котором необходимо прописать, какие папки должны сохраняться.
- После этого достаточно вставить съемный диск и запустить с него _start_backup.cmd – он засосет на себя все папки, указанные в backup_folders.ini.

Скрипт можно скачать (вместе со всеми вызываемыми утилитами) здесь:
www.dropbox.com/s/un82qyrsuq3r3j0/rsync_backup_for_win.zip
Хочу сразу сказать несколько слов в свое оправдание. Я никогда всерьез не писал cmd файлы, и это оказалось для меня настоящей пыткой. Программа перестает работать, если поставить пробел после знака равно. Иногда оно реагирует даже на пробелы в конце строки. Отдельная песня – фирменная фишка с областью видимости переменных. Изначальный скрипт, видимо, писался немецкоговорящим программистом, так что не удивляйтесь конструкциям вроде «set stunde=%ZEIT:~-8,2%». Кусок кода, который парсит ini файлы, я взял из сети с минимальными изменениями. Это было первое, что нашлось по запросу «чтение конфигурации из файла в cmd-скрипте». Поэтому используется ini-файл, хотя его возможности явно излишни. Пример файла backup_folders.ini ниже:
[backup folders]
photo=F:\Photo
lit=F:\literature
music=F:\MUSIC
desktop=F:\Desktop
Имя категории [backup folders] ни на что не влияет, но лучше оставить его как есть. Имя переменной (символы перед знаком равенства) тоже никуда не идут – рассматривайте их как комментарий. Путь папки для бэкапа стоит после знака равенства. Его можно брать из адресной строки windows explorer. Как вы можете догадаться, в этом винигрете из утилит каждая имеет свой взгляд на то, какие слэши использовать в пути к файлу, и какой буквой (большой или маленькой) называть диски. Скрипт адаптирует путь из windows explorer’а к капризам этих утилит.
Скрипт оставляет лог с результатами работы rsync.
Замеченная проблема: не хочет копировать файлы с японскими иероглифами и прочими нестандартными символами в названиях. Поиск по форумам ничего не дал. Пишут, что это бага cygwin’а, рекомендуют поставить японский системным языком. Но ведь тогда перестанут копироваться файлы с русскими буквами. Что делать, не знаю, решил, что эту проблему можно игнорировать.
В остальном работает прекрасно. Shadow Copy позволяет копировать все, можно спокойно работать на машине во время копирования, и ничего не отваливается. Время первоначального бэкапа зависит от скорости диска. У меня миллион с лишним файлов на 200 гигабайт копировались около 8 часов. Если изменений нет, и копировать нечего — бэкап делается порядка десятков минут.
