4

Как я могу использовать 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

Кажется, что приведенный выше скрипт довольно близок к тому, что я хочу, но, честно говоря, несмотря на то, что я потратил около часа на изучение Easy Automated Snapshot-Style Backups с Linux и Rsync, у меня все еще есть смутное представление о том, как заставить rsync делать то, что я хочу.

Вот мой вариант использования:

Я редактирую видео локально на моей машине. Сумма всех сотен файлов, связанных с этим видео, будет менее 5 ГБ (пять гигабайт).

В настоящее время я использую Grsync для резервного копирования внутреннего накопителя на внешний USB-накопитель. Хотя я действительно понял, как выполнить ту же задачу с помощью rsync, я предпочитаю использовать Grsync, потому что мне просто нужно запустить его, а затем нажать одну кнопку, чтобы сделать резервную копию моего внутреннего каталога, содержащего мои видеофайлы, на мой внешний USB-накопитель. Весь процесс шелковисто гладкий.

Каждые несколько часов я хочу довольно плавный способ резервного копирования моих вышеупомянутых данных, связанных с моим видео, в мою учетную запись Google Drive. Я не против вручную выбрать папку для загрузки на Google Drive. На самом деле я предпочитаю делать это, потому что это поможет мне убедиться, что резервное копирование действительно выполняется.

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

Я предпочитаю дифференциальное резервное копирование инкрементным, потому что в случае необходимости восстановления данных с Google Диска я, скорее всего, смогу сделать это вручную, не запутавшись.

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

1 ответ1

0

Вот и я!

#!/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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .