# Машина времени своими руками
spline(station13, 1) — All
2015-02-25 05:52:06


Проблема резервного копирования рано или поздно встаёт перед каждым и есть уйма средств для её решения. Но в силу тех или иных обстоятельств меня они не устроили.

Как правило предложенные средства меня не устраивали отсутствием нескольких критериев: бесплатность, простота, надёжность, легковесность. Единственное, что меня впечатлило — это машина времени, которая есть на маках.

Прошерстив в очередной раз выдачу ссылок гугла, я нашёл замечательное решение, которое опирается всего на две вещи. Это хардлинки и rsync. То есть оно универсально для *NIX-систем, но при некоторых усилиях применимо и на платформе Windows. По своей сути это маленький bash-скрипт, который просто и наглядно делает всю работу.

#!/bin/bash
 
DATE=$(date +'%Y-%m-%d-%H-%M-%S')
SRC=/home/user/data
DST=/mnt/backup
 
rsync -ax \
--delete \
--link-dest=../latest \
$SRC $DST/processing-$DATE
 
cd $DST
mv processing-$DATE $DATE
rm -f ./latest
ln -s ./$DATE ./latest

Вот и вся магия, собственно. Директория $SRC копируется на внешний носитель с ФС ext4 (подойдёт любая ФС с поддержкой хардлинков) в полном объёме, а дальше начинается самое интересное: каждая копия содержит только новые данные, а не изменённые файлы остаются в единственном экземпляре со множеством хардлинков. Это экономно, быстро и удобно так как позволяет пользоваться всего лишь любимым файловым менеджером для просмотра дерева резервных копий и восстановления данных. Скрипт этот прописан у меня в cron и вызывается каждый час. При этом очень просто написать ещё один скрипт или расширить существующий для автоматического удаления ненужных копий.

После того как я поделился в среде своих знакомых этим методом, я обнаружил что многие застряли в плане восприятия ФС в прошлом и не понимают сути хардлинков или не различают их с софтлинками. Если мы вспомним школьный курс информатики, то определение файла там озвучено примерно так "Файл - это именованная область на носителе", что подразумевает связь один к одному "имя файла <-> данные". В современных ФС это понятие не совсем применимо. Вместо имени файла используются хардлинки, которые в общем случае выполняют ту же функцию, что имена. Но в отличии от имён, множество хардлинков могут указывать на одну и ту же область данных и эти данные не будут считаться удалёнными пока существует хотя бы один хардлинк, ссылающийся на неё.

Вышеозначенный скрипт как раз создаёт хардлинки на файлы посредством rsync. Если на разделе нет такого хардлинка (нет файла или версии файла не совпадают), rsync копирует данные и создаёт хардлинк, если же такие данные уже имеются (версии файла совпадают), то просто создаётся ещё один хардлинк. Вот, собственно, и вся премудрость.

P.S.: Как я ни пытался, рассказать менее путано у меня не получилось. Так что отвечу на возникшие вопросы с удовольствием, ежели смогу конечно =)