Как я могу использовать rsync (но не rsnapshot, не rdiff-backup и не какое-либо другое приложение) для созданиядифференциалрезервное копирование каталога, расположенного на моем локальном диске, в другой каталог, расположенный на том же локальном диске?
Ф. Хаури опубликовал следующее вответ наКак создать локальную резервную копию?:
#!/bin/bash
backRepo=/media/mydisk
backSrce=/home/user
backDest=home
backCopy=copy
backCount=9
[ -d "$backRepo/$backDest" ] || mkdir "$backRepo/$backDest"
cd $backSrce || exit 1
rsync -ax --delete --exclude '*~' --exclude '.DStore' . "$backRepo/$backDest/."
cd $backRepo
[ -d "$backCopy.$backCount" ] && rm -fR "$backCopy.$backCount"
for ((i=$backCount;i--;));do
[ -d "$backCopy.$i" ] && mv "$backCopy.$i" "$backCopy.$((i+1))"
done
((i++))
cp -al $backDest $backCopy.$i
Кажется, что приведенный выше сценарий довольно близок к тому, что я хочу, но, честно говоря, несмотря на то, что я потратил около часа на его изучение,Простые автоматизированные резервные копии в стиле моментальных снимков с помощью Linux и RsyncУ меня пока есть лишь смутное представление о том, как заставить rsync делать то, что мне нужно.
Вот мой вариант использования:
Я редактирую видео локально на своей машине. Сумма всех сотен файлов, связанных с этим видео, будет меньше 5 ГБ (пяти гигабайт).
В настоящее время я использую Grsync для резервного копирования моего внутреннего диска на внешний USB-накопитель. Хотя я на самом деле понял, как выполнить идентичную задачу с помощью rsync, я предпочитаю использовать Grsync, потому что мне нужно просто запустить его, а затем нажать одну кнопку, чтобы сделать резервную копию моего внутреннего каталога, содержащего мои видеофайлы, на мой внешний USB-накопитель. Весь процесс проходит гладко и гладко.
Каждые несколько часов я хочу иметь достаточно плавный способ резервного копирования вышеупомянутых данных, связанных с моим видео, в мой аккаунт Google Drive. Я не против ручного выбора загрузки папки на Google Drive. На самом деле я предпочитаю делать это, потому что это помогло бы мне убедиться, что резервное копирование действительно выполняется.
Каждые несколько ночей перед сном я копирую всю папку с видеофайлами, которая содержит много гигабайт данных, в свою учетную запись Google Диска.
Я предпочитаю дифференциальные резервные копии инкрементным, потому что в случае, если мне понадобится восстановить данные с Google Диска, я, скорее всего, смогу сделать это вручную, не запутавшись.
Пожалуйста, имейте в виду, что я, конечно, не системный администратор unix в крупной корпорации, поддерживающей сотни пользователей. Я просто один парень, которому нужен простой метод, но не обязательно полностью автоматизированный метод, для резервного копирования своих данных за пределами офиса каждые несколько часов в случае катастрофической потери данных, которая, скорее всего, произойдет из-за кражи моего компьютера. Я почти уверен, что rsync может сделать то, что я хочу. Поэтому я не хочу устанавливать еще одно приложение.
решение1
Вот так!
#!/bin/bash
# written by strobelight, you know who you are.
# license, MIT, go for it.
me=`basename $0`
EXCLUDES="\
--exclude '*~'
--exclude '.DS_Store'
"
CANDIDATES=/tmp/candidates
usage() {
cat <<EOF
$me last_diff_dir new_diff_dir [ dir_to_copy ]
where:
last_diff_dir is the directory containing the last differential
new_diff_dir is the directory you want files saved to
dir_to_copy is optional and is the directory to copy from (default .)
cd directory_to_backup
Full backup: $me full_back full_back
Diff backup: $me full_back diff_1
Diff backup: $me full_back diff_2
EOF
exit 1
}
get_dir() {
HERE=`pwd`
cd $1
x=`pwd`
cd $HERE
echo $x
}
if [ $# -lt 2 ]; then
usage
fi
LAST_DIR="$1"
NEW_DIR="$2"
DIR_TO_COPY="${3:-.}"
mkdir -p "$LAST_DIR" || exit 1
mkdir -p "$NEW_DIR" || exit 1
[ -d "$LAST_DIR" ] || usage
[ -d "$NEW_DIR" ] || usage
[ -d "$DIR_TO_COPY" ] || usage
LAST_DIR=`get_dir "$LAST_DIR"`
NEW_DIR=`get_dir "$NEW_DIR"`
DIR_TO_COPY=`get_dir "$DIR_TO_COPY"`
# get list of what's different
eval rsync -v --dry-run -axH --delete --update $EXCLUDES "$DIR_TO_COPY/" "$LAST_DIR" | awk '
/building file list/ { next }
/^$/ {next}
/bytes.*received/ { nextfile }
{
for(i=5;i<NF;i++) {
printf("%s ",$i)
}
printf("%s\n",$NF)
}
' | sed 's:/$::' > $CANDIDATES
#cat $CANDIDATES
# use list to backup
eval rsync --files-from=$CANDIDATES -lptgoDxH --delete $EXCLUDES ${DIR_TO_COPY}/ $NEW_DIR
Например, в моем текущем каталоге есть 3 файла по 8k:
$ ls -1sk
total 24
8 seg1
8 seg2
8 seg3
Моя полная резервная копия пока не существует, назовем этот каталог full_bak
ls ../full_bak
ls: ../full_bak: No such file or directory
Сначала нам нужна полная резервная копия, из которой можно делать дифференциалы. Я скопировал скрипт в свой каталог $HOME/bin как test123.sh. Когда оба аргумента одинаковы, это по сути выполнение полной резервной копии.
$HOME/bin/test123.sh ../full_bak ../full_bak
Выводы скрипта
.
seg1
seg2
seg3
Теперь посмотрите на ../full_bak
$ ls -1sk ../full_bak
total 24
8 seg1
8 seg2
8 seg3
Внесите некоторые изменения
dd if=/dev/zero of=seg2 bs=512 count=11
Подтвердите, что есть различия:
$ diff -q . ../full_bak
Files ./seg2 and ../full_bak/seg2 differ
Теперь создайте дифференциал
$ $HOME/bin/test123.sh ../full_bak ../differential1
seg2
Посмотрите на дифференциальную копию, в которой есть только файл, отличающийся от последней полной резервной копии.
$ ls -1sk ../differential1/
total 8
8 seg2
Сделать еще одно изменение
dd if=/dev/zero of=seg4 bs=512 count=10
Проверьте, что изменилось
diff -q . ../full_bak
Files ./seg2 and ../full_bak/seg2 differ
Only in .: seg4
и видим, что у нас есть новый файл, которого нет в нашей полной резервной копии, и измененный файл по сравнению с предыдущим.
Сделайте еще одно дифференциальное копирование в другой каталог
$ $HOME/bin/test123.sh ../full_bak ../differential2
.
seg2
seg4
и видим, что новый дифференциал имеет 1-й дифференциал, а также новый файл
$ ls -1sk ../differential2
total 16
8 seg2
8 seg4
Дифференциальные резервные копии
Вот оболочка полного резервного копирования с использованием test123.sh:
#!/bin/bash
FULLDIR=/media/mydisk/home
SRCDIR=/home/user
$HOME/bin/test123.sh $FULLDIR $FULLDIR $SRCDIR
Вот дифференциальный скрипт, создающий подкаталоги в зависимости от часа:
#!/bin/bash
FULLDIR=/media/mydisk/fullbackup/home
DIFFDIR=/media/mydisk/differentials/home
SRCDIR=/home/user
DIFFSUB=`date '+BAK_%H'`
$HOME/bin/test123.sh $FULLDIR $DIFFDIR/$DIFFSUB $SRCDIR