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

Я хотел бы запускать следующий незавершенный сценарий еженедельно в качестве задания cron для резервного копирования моего домашнего каталога на внешний диск, смонтированный как / mnt / backups

#!/bin/bash
#

TIMEDATE=$(date +%b-%d-%Y-%k:%M)

LASTBACKUP=pathToDirWithLastBackup

rsync -avr --numeric-ids --link-dest=$LASTBACKUP /home/myfiles /mnt/backups/myfiles$TIMEDATE

Мой первый вопрос: как мне правильно установить LASTBACKUP для каталога в / backs, который был создан последним?

Во-вторых, у меня сложилось впечатление, что использование --link-desk будет означать, что файлы в предыдущих резервных копиях не будут копироваться в более поздние резервные копии, если они все еще существуют, а скорее будут символически ссылаться на первоначально скопированные файлы? Однако я не хочу сохранять старые файлы навсегда. Каков наилучший способ удалить все резервные копии до определенной даты, не теряя файлы, которые могут считаться связанными в этих резервных копиях текущими резервными копиями? По сути, я хочу объединить все файлы до определенной даты и до определенной даты, если это имеет больше смысла, чем то, как я изначально сформулировал вопрос :). Может ли --link-dest создавать жесткие ссылки, и если это так, простое удаление предыдущих каталогов не приведет к удалению связанного файла?

Наконец, я хотел бы добавить строку в мой скрипт, которая сжимает каждую вновь созданную резервную копию папка (/ mnt / backups / myfiles $ TIMEDATE). Основываясь на чтении этого вопроса , мне стало интересно, смогу ли я просто использовать эту строку

gzip --rsyncable /backups/myfiles$TIMEDATE

после запуска rsync, чтобы последовательные выполнения rsync --link-dest находили уже скопированные и сжатые файлы?

Я знаю, что это очень много, поэтому большое спасибо заранее за вашу помощь !!

4
задан 13 April 2017 в 15:14

4 ответа

Вы можете использовать инструмент, который автоматизирует весь процесс, например, rsnapshot , который, кажется, реализует то, что вы пытаетесь сделать.

0
ответ дан 13 April 2017 в 15:14

Вы можете использовать rsync.

Listing one: make_snapshot.sh

#!/bin/bash
# ----------------------------------------------------------------------
# mikes handy rotating-filesystem-snapshot utility
# ----------------------------------------------------------------------
# this needs to be a lot more general, but the basic idea is it makes
# rotating backup-snapshots of /home whenever called
# ----------------------------------------------------------------------

unset PATH  # suggestion from H. Milz: avoid accidental use of $PATH

# ------------- system commands used by this script --------------------
ID=/usr/bin/id;
ECHO=/bin/echo;

MOUNT=/bin/mount;
RM=/bin/rm;
MV=/bin/mv;
CP=/bin/cp;
TOUCH=/bin/touch;

RSYNC=/usr/bin/rsync;


# ------------- file locations -----------------------------------------

MOUNT_DEVICE=/dev/hdb1;
SNAPSHOT_RW=/root/snapshot;
EXCLUDES=/usr/local/etc/backup_exclude;


# ------------- the script itself --------------------------------------

# make sure we're running as root
if (( `$ID -u` != 0 )); then { $ECHO "Sorry, must be root.  Exiting..."; exit; } fi

# attempt to remount the RW mount point as RW; else abort
$MOUNT -o remount,rw $MOUNT_DEVICE $SNAPSHOT_RW ;
if (( $? )); then
{
    $ECHO "snapshot: could not remount $SNAPSHOT_RW readwrite";
    exit;
}
fi;


# rotating snapshots of /home (fixme: this should be more general)

# step 1: delete the oldest snapshot, if it exists:
if [ -d $SNAPSHOT_RW/home/hourly.3 ] ; then         \
$RM -rf $SNAPSHOT_RW/home/hourly.3 ;                \
fi ;

# step 2: shift the middle snapshots(s) back by one, if they exist
if [ -d $SNAPSHOT_RW/home/hourly.2 ] ; then         \
$MV $SNAPSHOT_RW/home/hourly.2 $SNAPSHOT_RW/home/hourly.3 ; \
fi;
if [ -d $SNAPSHOT_RW/home/hourly.1 ] ; then         \
$MV $SNAPSHOT_RW/home/hourly.1 $SNAPSHOT_RW/home/hourly.2 ; \
fi;

# step 3: make a hard-link-only (except for dirs) copy of the latest snapshot,
# if that exists
if [ -d $SNAPSHOT_RW/home/hourly.0 ] ; then         \
$CP -al $SNAPSHOT_RW/home/hourly.0 $SNAPSHOT_RW/home/hourly.1 ; \
fi;

# step 4: rsync from the system into the latest snapshot (notice that
# rsync behaves like cp --remove-destination by default, so the destination
# is unlinked first.  If it were not so, this would copy over the other
# snapshot(s) too!
$RSYNC                              \
    -va --delete --delete-excluded              \
    --exclude-from="$EXCLUDES"              \
    /home/ $SNAPSHOT_RW/home/hourly.0 ;

# step 5: update the mtime of hourly.0 to reflect the snapshot time
$TOUCH $SNAPSHOT_RW/home/hourly.0 ;

# and thats it for home.

# now remount the RW snapshot mountpoint as readonly

$MOUNT -o remount,ro $MOUNT_DEVICE $SNAPSHOT_RW ;
if (( $? )); then
{
    $ECHO "snapshot: could not remount $SNAPSHOT_RW readonly";
    exit;
} fi;

и второй:

Listing two: daily_snapshot_rotate.sh

#!/bin/bash
# ----------------------------------------------------------------------
# mikes handy rotating-filesystem-snapshot utility: daily snapshots
# ----------------------------------------------------------------------
# intended to be run daily as a cron job when hourly.3 contains the
# midnight (or whenever you want) snapshot; say, 13:00 for 4-hour snapshots.
# ----------------------------------------------------------------------

unset PATH

# ------------- system commands used by this script --------------------
ID=/usr/bin/id;
ECHO=/bin/echo;

MOUNT=/bin/mount;
RM=/bin/rm;
MV=/bin/mv;
CP=/bin/cp;

# ------------- file locations -----------------------------------------

MOUNT_DEVICE=/dev/hdb1;
SNAPSHOT_RW=/root/snapshot;

# ------------- the script itself --------------------------------------

# make sure we're running as root
if (( `$ID -u` != 0 )); then { $ECHO "Sorry, must be root.  Exiting..."; exit; } fi

# attempt to remount the RW mount point as RW; else abort
$MOUNT -o remount,rw $MOUNT_DEVICE $SNAPSHOT_RW ;
if (( $? )); then
{
    $ECHO "snapshot: could not remount $SNAPSHOT_RW readwrite";
    exit;
}
fi;


# step 1: delete the oldest snapshot, if it exists:
if [ -d $SNAPSHOT_RW/home/daily.2 ] ; then          \
$RM -rf $SNAPSHOT_RW/home/daily.2 ;             \
fi ;

# step 2: shift the middle snapshots(s) back by one, if they exist
if [ -d $SNAPSHOT_RW/home/daily.1 ] ; then          \
$MV $SNAPSHOT_RW/home/daily.1 $SNAPSHOT_RW/home/daily.2 ;   \
fi;
if [ -d $SNAPSHOT_RW/home/daily.0 ] ; then          \
$MV $SNAPSHOT_RW/home/daily.0 $SNAPSHOT_RW/home/daily.1;    \
fi;

# step 3: make a hard-link-only (except for dirs) copy of
# hourly.3, assuming that exists, into daily.0
if [ -d $SNAPSHOT_RW/home/hourly.3 ] ; then         \
$CP -al $SNAPSHOT_RW/home/hourly.3 $SNAPSHOT_RW/home/daily.0 ;  \
fi;

# note: do *not* update the mtime of daily.0; it will reflect
# when hourly.3 was made, which should be correct.

# now remount the RW snapshot mountpoint as readonly

$MOUNT -o remount,ro $MOUNT_DEVICE $SNAPSHOT_RW ;
if (( $? )); then
{
    $ECHO "snapshot: could not remount $SNAPSHOT_RW readonly";
    exit;
} fi;

После создания скрипта, отвечающего вашим потребностям, добавьте его в задания cron.

crontab -e

добавьте следующее:

0 * / 4 * * * /usr/local/bin/make_snapshot.sh [ 1128]

0 13 * * * /usr/local/bin/daily_snapshot_rotate.sh

Они вызывают запуск make_snapshot.sh каждые четыре часа в час, а daily_snapshot_rotate.sh - бегать каждый день в 13:00 (то есть в 13:00).

источник: http://www.mikerubel.org/computers/rsync_snapshots/

* * * * * command to be executed
- - - - -
| | | | |
| | | | ----- Day of week (0 - 7) (Sunday=0 or 7)
| | | ------- Month (1 - 12)
| | --------- Day of month (1 - 31)
| ----------- Hour (0 - 23)
------------- Minute (0 - 59)

Если вы хотите, чтобы он работал ежечасно, вы добавляете задание cron на каждый час . [+1132]

Другой возможный вариант - использование rsnapshot

  1. Установка rsnapshot (доступно в центре программного обеспечения)

  2. Настройка rsnapshot и указание каталога источника резервного копирования

    ]

Откройте файл /etc/rsnapshot.conf и раскомментируйте следующие строки.

# nano /etc/rsnapshot.conf

cmd_cp          /bin/cp
cmd_ssh /usr/bin/ssh
cmd_du          /usr/bin/du
cmd_rsnapshot_diff      /usr/local/bin/rsnapshot-diff
logfile /var/log/rsnapshot
  1. Определите каталоги резервных копий назначения в /etc/rsnapshot.conf, как показано ниже. В этом примере

    / home - исходный каталог, в который следует создать резервную копию localhost / - каталог назначения, в котором будет храниться резервная копия. Обратите внимание, что этот каталог будет создан в каталоге /.snapshots/ enjinternal.n‹/, как показано на последнем шаге.

    nano /etc/rsnapshot.conf

    backup / home / localhost /

  2. Тест конфигурации rsnapshot

Выполнить тест конфигурации, чтобы убедиться, что rsnapshot настроен правильно и готов к выполнению резервного копирования linux rsync.

# rsnapshot configtest
Syntax OK
  1. Проверка конфигурации ежечасного резервного копирования rsnapshot

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

Проверьте почасовую конфигурацию резервного копирования.

# rsnapshot -t hourly
echo 6490 > /var/run/rsnapshot.pid
mkdir -m 0700 -p /.snapshots/
mkdir -m 0755 -p /.snapshots/hourly.0/
/usr/bin/rsync -a --delete --numeric-ids --relative --delete-excluded /home \
/.snapshots/hourly.0/localhost/
mkdir -m 0755 -p /.snapshots/hourly.0/
/usr/bin/rsync -a --delete --numeric-ids --relative --delete-excluded /etc \
/.snapshots/hourly.0/localhost/
mkdir -m 0755 -p /.snapshots/hourly.0/
/usr/bin/rsync -a --delete --numeric-ids --relative --delete-excluded \
/usr/local /.snapshots/hourly.0/localhost/
touch /.snapshots/hourly.0/
  1. Проверьте конфигурацию ежедневного резервного копирования rsnapshot

Убедитесь, что процесс ежедневного резервного копирования rsnapshot cwrsync настроен правильно.

# rsnapshot -t daily
echo 6493 > /var/run/rsnapshot.pid
mkdir -m 0700 -p /.snapshots/
/.snapshots/hourly.5 not present (yet), nothing to copy
  1. Добавить запись Crontab для rsnapshot

После того, как вы убедились, что настройки ежечасного и ежедневного резервного копирования rsync настроены правильно в утилите rsnapshot cwrsync, пришло время установить этот щенок в crontab, как показано ниже.

# crontab -e
0 */4 * * * /usr/local/bin/rsnapshot hourly
30 23 * * * /usr/local/bin/rsnapshot daily

источник: http://www.thegeekstuff.com/2009/08/tutorial-backup-linux-using-rsnapshot-rsync-utility/

0
ответ дан 13 April 2017 в 15:14

Один вопрос за раз, пожалуйста, я отвечу только на первый вопрос, а вы можете отправить остальные на другой вопрос:

Чтобы узнать, какой был последний резервный каталог, просто добавьте :

echo /mnt/backups/myfiles$TIMEDATE > /mnt/backups/last.dir

В самый конец сценария, а затем измените свой LASTBACKUP = на:

LASTBACKUP=`cat /mnt/backups/last.dir`

Таким образом, вы всегда будете знать, что будете использовать последнюю полную резервную копию. и никаких других файлов / папок, созданных в этом каталоге, или папок резервного копирования, которые потерпели неудачу (что привело бы к дублированию)

0
ответ дан 13 April 2017 в 15:14

Поэтому я попытаюсь ответить на второй (и третий) вопрос: --link-dest создает дополнительные жесткие ссылки на существующие файлы в целевой файловой системе. Число после прав доступа - это «количество ссылок», оно говорит вам, сколько ссылок (например, имен файлов) указывают на файл. Например:

$ touch x
$ ls -l
-rw-rw-r-- 1 frank frank 0 2011-01-07 22:18 x
$ ln x y
$ ls -l
-rw-rw-r-- 2 frank frank 0 2011-01-07 22:18 x

Вы можете просто rm -rf старые резервные копии. rm означает unlink. Это уменьшает количество ссылок файла. Файловая система будет перезаписывать только файлы с нулевым количеством ссылок. Если вы создадите дополнительные файлы с помощью gzip, они просто будут использовать дополнительное пространство, и вы потеряете преимущество жестких ссылок.

0
ответ дан 13 April 2017 в 15:14

Другие вопросы по тегам:

Похожие вопросы: