Pull to refresh

Резервное копирование на хардлинках под Windows

Reading time 9 min
Views 70K
Я, как и многие, задумывался о бэкапах. Неспешно думал-думал, рассматривал разные варианты, пока не сгорел винчестер на ноутбуке жены. Это печальное событие подстегнуло мою активность, результат которой хочу представить в этой статье.

Речь пойдет о резервном копировании. Я буду подробно обсуждать именно свою задачу. Возможно, у кого-то обстоятельства чем-то отличаются, но и таких как я должно быть достаточно много. Поэтому, надеюсь, мои советы окажутся полезными большому числу людей.

Для начала определимся, что сохранять. Для меня на первом месте фотографии. В 2003-м году я купил первый цифровой фотоаппарат, и с тех пор все мои фото хранятся в цифровом виде. У моих родителей есть альбом с фото моих прабабушек и прадедушек. Я же не оставлю ничего на бумаге новее 2003-го года. Поэтому надо особенно позаботиться о сохранности цифровых фотографий. Сейчас моя папка с фото «весит» 180 гигабайт и прирастает по гигабайту-другому в месяц.

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

Несколько слов о том, что мне не надо копировать. Нет смысла сохранять дистрибутивы и фильмы. То, что скачано из сети, можно скачать еще раз. А дистрибутивы теряют актуальность после выхода более новых версий. Мне также не нужно делать резервное копирование системы. По моему опыту крах системы случается довольно редко, и является хорошим поводом обновить версию 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 часов. Если изменений нет, и копировать нечего — бэкап делается порядка десятков минут.
Tags:
Hubs:
+18
Comments 81
Comments Comments 81

Articles