LINUX.ORG.RU
решено ФорумAdmin

Резервное копирование фотографий. Чем и как лучше?

 


0

2

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

Что, примерно, хотелось бы получить:

  • Автозапуск Бэкапа раз в декаду, желательно средствами самой программы, а не через cron.
  • Возможность работы и настройки без x-сервера.
  • Файловая организация, у бэкап копии, должна оставаться точно такой же, как у источника, т.е. ни какого архивирования и шифрования, был 0001.jpg им и должен остаться.
  • В бэкап должны добавляться только новые файлы.
  • Те файлы которые уже есть сравниваем по crc или hash, в случаи их различий файл который в бэкапе переносим в специальную папку [.modified][дата dd.mm.yyyy] желательно с сохранением своих путей, а на его место копируем файл из источника.
  • Удаленные в источнике файлы в бэкапе переносим в специальную папку [.delete][дата dd.mm.yyyy][путь который был у файла][файл]
  • Если файл в источнике перенесен в другое место или переименована директория его содержащая, то в бэкапе должно произойти тоже самое, возможно с отражением сего действа в текстовом файле (логе), что куда перенесено и во что переименовано.
  • Параноидальное желание. В качестве защиты от порчи файловой системы не плохо бы, что бы при сильном расхождении бэкап копии с источником, процесс бэкапа не осуществлялся.

Интересует, возможно ли всё это, какой программой проще всего это реализовать под Debian 8, на какие параметры обратить особое внимание в man'е? Если где-то есть хорошая статья, желательно на русском, был бы рад ссылке на неё. А если у Вас что-то подобное уже реализовано хотелось бы увидеть и пример вашего конфига. Всем откликнувшимся огромное спасибо.



Последнее исправление: DemonXL (всего исправлений: 1)

желательно средствами самой программы, а не через cron.

Microsoft Windows 7, 8, 10

Файловая организация, у бэкап копии, должна оставаться точно такой же, как у источника

Ну нахера ты все эти запятые поставил?
Лучше бы поставил их дальше по тексту, где они нужны.

в случаи их различий

Как вообще можно в техразделе так безграмотно писать?
Даже ШВИМ такого себе не позволяет.

какой программой проще всего это реализовать

bash, python, rsync

Goury ★★★★★
()
Ответ на: комментарий от anonymous

Спасибо за пример конфига. По вашему примеру сделал вот такой.

rsync -axHIc --delete --max-delete=200 --backup --backup-dir=/to/snapshot/`date \+\[%Y.\%m.\%d]\[%H\%M\%S]` /from/photo/dir/ /to/backup/dir >> /var/tmp/photo_backup.log

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

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

Что бы разложить по разным папкам удаленные и измененные файлы можно бэкапить за два захода.

  • За первый копируем новое и переписываем измененные, соответственно перенося их в папку .modified
  • За второй заход ничего не копируем и файлы не заменяем, только удаление отсутствующих и переносим их в .delete

Далее папку .delete очищаем от переименованных перенесенных и т.д. т.е. от тех которые прога посчитала как удаленные.

  • При помощи fdupes формируем список дубликатов, за одно можно этот список в файл сохранить, будет типа лог перенесенных.
  • Выделяем из него все строки с путями к нашей папке .delete
  • Отправляем их на rm.

Затем при помощи find ищем пустые каталоги и удаляем их.

Пока как то так. Может все же можно сделать проще???

DemonXL
() автор топика
Ответ на: комментарий от anonymous

раз в декаду

диски быстрее дохнут

Для моей цели это разумная достаточность. Файлы в домашний архив добавляются не так часто, плюс если диск сдохнет, не успев пару недавно созданных папок с фотками забэкапить, то невелика потеря их всегда можно с фотика вернуть, благо они там годами могут лежать в jpg, если всё в raw то примерно год. С видео конечно посложней, но нужное месяца 4 точно пролежит. Тут ещё и вопрос возникает какой диск быстрей сдохнет тот на который мы каждый день будем сохранять бэкап или тот на который раз в четыре месяца что ни будь запишем, отмонтируем и отправим его спать до следующего бэкапа.

DemonXL
() автор топика

Файловая организация, у бэкап копии, должна оставаться точно такой же, как у источника, т.е. ни какого архивирования и шифрования, был 0001.jpg им и должен остаться.

rsnapshot и прочее на базе rsync

anonymous
()

спроси лучше у dk как лучше бэкапить фото

smilessss ★★★★★
()

какой программой проще всего это реализовать

Напиши свою.

mix_mix ★★★★★
()
Ответ на: комментарий от DemonXL

Много чего можно нафантазировать, но это уже попадает под категорию «напиши сам себе программу»

anonymous
()
Ответ на: комментарий от DemonXL

Перед очередным rsync --delete-before, банальным cp -l (создает хардлинки вместо копирования) делаешь «snapshot» текущего архива со стороны бекапа и бекапишь основную директорию

Путано получилось.

Так:

cp -rl /path/to/backup /path/to/backup-$(date ...)
rsync ... --delete-before /path/to/photo/ /path/to/backup

anonymous
()
Ответ на: комментарий от anonymous

Так:

cp -rl /path/to/backup /path/to/backup-$(date ...)
rsync ... --delete-before /path/to/photo/ /path/to/backup

Как я понимаю, эта команда сделает именно snapshot пусть и хардлиньком. Получится бэкап бэкапа. Если так, то это совсем не то, что я хочу получить, либо я не понял тайный смысл сего действа.

Мне же нужно:

Источник = 1шт. Бэкап = 100% идентичность, аля зеркальный RAID. С этим rsync прекрасно справляется. rsync -axH --delete /from/ /to

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

Вот набросал заготовку, правда, не проверял, времени свободного сейчас очень мало.

#bin/bash

DATE=`date \+\[%Y.\%m.\%d]\[%H\%M\%S]`

rsync -axHIc --backup --backup-dir=/to/backup/snapshot/$DATE/.modified/ /from/photo/dir/ /to/backup/dir
rsync -axH --existing --ignore-existing --delete --backup --backup-dir=/to/backup/snapshot/$DATE/.delete/ /from/photo/dir/ /to/backup/dir

rm -f `fdupes -r /to/backup/dir /to/backup/snapshot/$DATE/.delete | grep "/to/backup/snapshot/$DATE/.delete"`
find /to/backup/snapshot/$DATE/.delete -empty -type d -delete
find /to/backup/snapshot/$DATE/.modified -empty -type d -delete

exit 0
Если будет работать, то после нового года запилю её в более потребный вид.

DemonXL
() автор топика
Ответ на: комментарий от DemonXL

Скрипт для резервного копирования фотографий.

Для правильной работы нужен установленный rsync и fdupes + набор стандартных системных утилит. Скрипт работает только от рута. Использовать исключительно на свой страх и риск. Для автоматического запуска достаточно скопировать его в /etc/cron.daily Работает так как хотел, за исключением несущественного для меня глюка, если одновременно изменить и перенести файл то вместо директории с измененными файлами он попадает в директорию с удаленными. Если просто изменить файл в источнике тогда всё работает как надо и предыдущая копия этого файла из резервной копии переносится именно в директорию с измененными файлами.

#!/bin/sh

#Задаёт интервал срабатывания скрипта в днях.
#Если указать 0, то скрипт будет выполнять бекап при каждом запуске. 
START_INTERVAL=122

#Путь к нашему источнику, для которого необходимо создать резервную копию.
#Можно указать несколько источников через пробел.
SOURCE_DIR_LIST="/from/photo/dir1 /from/photo/dir2 /from/photo/dir3"

#Путь к директории где будет храниться наша резервная копия.
BACKUP_DIR=/to/backup/dir

#Путь к директории в которую будут переноситься из резервной копии 
#те файла которых больше нет в источнике и предыдущие версии
#измененных. В неё же будут сохраняться логи.
TRASH_DIR=/to/backup/dir/trash

#Системный файл, по нему скрипт ориентируется сколько времени прошло 
#с момента создания последней резервной копии.
SYS_FILE=~/.backup


[ -e $SYS_FILE ] && [ $(($(($(date \+\%s) - $(stat -c \%Y $SYS_FILE)))/ 86400)) -lt $START_INTERVAL ] && exit 0

DATE=`date \+\%Y.\%m.\%d___\%H\%M\%S`
LOG_DIR=$TRASH_DIR/$DATE
LOG_FILE=$LOG_DIR/snapshot.log
MODIFIED_DIR=$TRASH_DIR/$DATE/modified
DELETE_DIR=$TRASH_DIR/$DATE/delete

mkdir -p $MODIFIED_DIR $DELETE_DIR
echo $DATE >> $LOG_FILE

for SOURCE_DIR in $SOURCE_DIR_LIST; do
echo '\nСинхронизация резервной копии с источником' $SOURCE_DIR'\n' >> $LOG_FILE

rsync -axHIcv --backup --backup-dir=$MODIFIED_DIR $SOURCE_DIR $BACKUP_DIR >> $LOG_FILE
RETCODE=$?
if [ $RETCODE -ne 0 ]; then
echo "Rsync Error code =" $RETCODE >> $LOG_FILE
logger -p err -t backup "Rsync Error (code=$RETCODE): Резервная копия не создана."
exit 0
fi

rsync -axHv --existing --ignore-existing --delete --backup --backup-dir=$DELETE_DIR $SOURCE_DIR $BACKUP_DIR >> $LOG_FILE
RETCODE=$?
if [ $RETCODE -ne 0 ]; then
echo "Rsync Error code =" $RETCODE >> $LOG_FILE
logger -p err -t backup "Rsync Error (code=$RETCODE): Резервная копия не создана."
exit 0
fi


BACKUP=`echo $SOURCE_DIR | awk 'BEGIN {FS="/"}{print $NF}'`

if [ -d $DELETE_DIR/$BACKUP ]; then

DUPLICATE_LIST=`fdupes -r $BACKUP_DIR/$BACKUP $DELETE_DIR/$BACKUP`
echo '\n'"$DUPLICATE_LIST" >> $LOG_FILE

DUPLICATE_DEL=`echo "$DUPLICATE_LIST" | grep ""$DELETE_DIR"/"$BACKUP""`
echo '\n'"$DUPLICATE_DEL" >> $LOG_FILE

rm -f $DUPLICATE_DEL

fi
done

find $DELETE_DIR -empty -type d -delete
find $MODIFIED_DIR -empty -type d -delete

#logger -p info -t backup "Синхронизация резервной копии с источником завершена."
echo "Последняя резервная копия создана" $DATE > $SYS_FILE

exit 0
DemonXL
() автор топика
11 мая 2016 г.

Небольшое исправление для скрипта!!!

Немного исправил свой скрипт, т.к конструкция вида rm -f $DUPLICATE_DEL не правильно работала с большим массивом данных, точнее вообще не работала и скорей всего имела проблемы с экранированием пробела, заменил её на такую:

echo "$DUPLICATE_DEL" | while read DEL; do rm "$DEL" >> $LOG_FILE; done

DemonXL
() автор топика
3 июля 2016 г.
Ответ на: Небольшое исправление для скрипта!!! от DemonXL

Пользуетесь ли Вы сейчас этим скриптом? Если да, то выложите последнюю версию скрипта, а то я новичок в написании скрипта и не понял: менять только

rm -f $DUPLICATE_DEL
на измененную строчку
echo "$DUPLICATE_DEL" | while read DEL; do rm "$DEL" >> $LOG_FILE; done

или весь абзац

echo '\n'"$DUPLICATE_DEL" >> $LOG_FILE

rm -f $DUPLICATE_DEL

fi
done

anonymous
()
Ответ на: комментарий от anonymous

Да пользуюсь. Держите.

#!/bin/sh

START_INTERVAL=121
SOURCE_DIR_LIST="/disk/files/Foto"
BACKUP_DIR=/disk/zbackup
TRASH_DIR=/disk/zbackup/Trash
SYS_FILE=~/.backup


[ -e $SYS_FILE ] && [ $(($(($(date \+\%s) - $(stat -c \%Y $SYS_FILE)))/ 86400)) -lt $START_INTERVAL ] && exit 0


DATE=`date \+\%Y.\%m.\%d___\%H\%M\%S`
LOG_DIR=$TRASH_DIR/$DATE
LOG_FILE=$LOG_DIR/snapshot.log
MODIFIED_DIR=$TRASH_DIR/$DATE/modified
DELETE_DIR=$TRASH_DIR/$DATE/delete

logger -p notice -t backup "Начинаю обновление резервной копии $BACKUP_DIR"

mkdir -p $MODIFIED_DIR $DELETE_DIR
echo $DATE >> $LOG_FILE


for SOURCE_DIR in $SOURCE_DIR_LIST; do

logger -p info -t backup "Выполняется синхронизация резервной копии с источником $SOURCE_DIR"
echo '\nСинхронизация резервной копии с источником' $SOURCE_DIR'\n' >> $LOG_FILE

rsync -axHIcv --backup --backup-dir=$MODIFIED_DIR $SOURCE_DIR $BACKUP_DIR >> $LOG_FILE
RETCODE=$?
if [ $RETCODE -ne 0 ]; then
echo "Rsync Error code =" $RETCODE >> $LOG_FILE
logger -p err -t backup "Rsync Error (code=$RETCODE): Резервная копия не создана."
exit 0
fi

rsync -axHv --existing --ignore-existing --delete --backup --backup-dir=$DELETE_DIR $SOURCE_DIR $BACKUP_DIR >> $LOG_FILE
RETCODE=$?
if [ $RETCODE -ne 0 ]; then
echo "Rsync Error code =" $RETCODE >> $LOG_FILE
logger -p err -t backup "Rsync Error (code=$RETCODE): Резервная копия не создана."
exit 0
fi


BACKUP=`echo $SOURCE_DIR | awk 'BEGIN {FS="/"}{print $NF}'`

if [ -d $DELETE_DIR/$BACKUP ]; then

DUPLICATE_LIST=`fdupes -r $BACKUP_DIR/$BACKUP $DELETE_DIR/$BACKUP`
echo '\n'"$DUPLICATE_LIST" >> $LOG_FILE

DUPLICATE_DEL=`echo "$DUPLICATE_LIST" | grep ""$DELETE_DIR"/"$BACKUP""`
echo '\n'"$DUPLICATE_DEL" >> $LOG_FILE

echo "$DUPLICATE_DEL" | while read DEL; do rm "$DEL" >> $LOG_FILE; done
fi

logger -p info -t backup "Завершена синхронизация резервной копии с источником $SOURCE_DIR"

done


find $DELETE_DIR -empty -type d -delete
find $MODIFIED_DIR -empty -type d -delete

echo "Последняя резервная копия создана" $DATE > $SYS_FILE
logger -p notice -t backup "Завершено обновление резервной копии $BACKUP_DIR"

exit 0

Обратите внимания что пути в SOURCE_DIR_LIST= BACKUP_DIR= TRASH_DIR= не должны содержать пробелов и желательно исключить из использования и спец символы например ! знак и т.д. Т.е должно быть так BACKUP_DIR=/media/backup а вот так не стоит делать BACKUP_DIR=/media/my backup

Внутри вашего источника файлы и папки могут называться как Вам вздумается.

Сейчас обновление бекапа осуществляется через сравнение контрольных сумм что несколько долго но надежно, если хотите что бы сравнивались только даты создания и дата модификации, то просто замените строчку

rsync -axHIcv --backup --backup-dir=$MODIFIED_DIR $SOURCE_DIR $BACKUP_DIR >> $LOG_FILE
на
rsync -axHIv --backup --backup-dir=$MODIFIED_DIR $SOURCE_DIR $BACKUP_DIR >> $LOG_FILE
Различаются эти строки отсутствием параметра -c, --checksum проверять контрольные суммы.

DemonXL
() автор топика

У rsync есть опция link-dest. Почитай про нее, возможно захочешь ее применить.

rumgot ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.