Я делаю это в тех случаях, когда нужен быстрый доступ к резервному контенту - инкрементное резервное копирование с использованием rsync
с параметром --link-dest=
.
Он работает довольно быстро, не влияет на предыдущие резервные копии, которые вы можете иметь столько, сколько хотите, и резервное копирование не занимает много места, так как резервные копии - это жесткие ссылки на существующие файлы. В этом случае доступ к резервному копированию является мгновенным, и фактическая передача файлов занимает несколько секунд даже для огромного количества файлов, поскольку rsync
копирует только новые файлы.
#!/bin/sh
srcDir='/importunt/data' # Use full path
bkpDir='/backups' # Use full path
cd "${bkpDir}"
previousDir="$(ls -td -- */ | head -n 1 | awk -F'/' '{print $1}')" # Get most newest directory
currentDir="$(date '+%Y-%m-%dT%H;%M;%S')"
[ -n "${previousDir}" ] && {
rsync_opts="-aPvz --safe-links --link-dest=${bkpDir}/${previousDir} --exclude=*.mp3"
} || {
rsync_opts="-aPvz --safe-links --exclude=*.mp3"
}
mkdir -m 770 "${currentDir}"
rsync ${rsync_opts} "${srcDir}" "${bkpDir}"/"${currentDir}"
В основном такое решение создает точный моментальный снимок, поэтому восстановление файлов довольно простое.
Не пугайтесь, если вы используете каталог du
on /backups
когда он показывает увеличивающийся размер при каждом обновлении, если вы используете df
вы обнаружите, что фактическое пространство не уменьшается. Вот как жесткие ссылки рассчитывают на Linux и FreeBSD, так что не беспокойтесь. Чтобы убедиться, что я не соврал, вы можете проверить inode для некоторого файла в инкрементном резервном копировании с помощью ls -i file
. Вы обнаружите, что один и тот же файл во всех каталогах имеет один и тот же индекс, что означает, что rsync
дублирует только имена файлов с жесткими ссылками, но все они указывают на один и тот же контент.
Еще одним преимуществом этого метода является то, что вы можете удалять самые старые каталоги резервных копий в любом порядке - самые последние, промежуточные или самые старые.
Сценарий выше является упрощенным примером. Если содержимое в инкрементном резервном копировании предполагается редактировать, вам не следует использовать механизм ls -t
для обнаружения самого нового предыдущего каталога в резервном хранилище, а вместо этого сохранить ${currentDir}
в некоторый файл и восстановить в ${previousDir}
при последующем вызове.
Поскольку rsync
поддерживает передачу по ssh
вы можете перемещать инкрементное резервное копирование на удаленный компьютер с той же эффективностью, только изменения будут синхронизированы.