Как сделать и восстановить инкрементные снимки жесткого диска

Я часто использую Virtual Box для тестирования дистрибутивов / приложений.

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

В своих живых системах я знаю, как создать образ файловой системы в формате 1: 1, но все известные мне решения создадут новый образ всей файловой системы.

Существуют ли какие-либо программы / файловые системы, способные сделать снимок текущей файловой системы, сохранить его в другом месте, но вместо создания нового образа он создает инкрементные резервные копии?

Для простоты описания что я хочу, это должны быть dd образы файловой системы, но вместо полной резервной копии она также будет создавать инкрементные.


Я не ищу clonezilla и т. д. Он должен работать внутри самой системы без (или почти без) вмешательства пользователя, но содержать все данные файловых систем. Я также не ищу duplicity резервное копирование всей вашей системы, за исключением скрипта некоторых папок + dd для сохранения вашего mbr. Я могу сделать это сам, ища дополнительную утонченность.

Я ищу что-то, что я могу сделать, прежде чем вносить значительные изменения в систему, а затем, если что-то не так, или я сжег свой жесткий диск после того, как на него налили кофе, я могу просто загрузиться с liveCD и восстановить рабочий снимок жесткий диск.

Это не должно быть ежедневно, даже не нужно расписание. Просто запускайте время от времени и дайте ему свою работу, желательно на основе RAW, а не на основе файлов.

<Ч>
13
задан 21 March 2014 в 16:36

6 ответов

Объяснить ответ cprofitt (поскольку его ответ является возрастающим, как я объясню)...

Сначала необходимо знать о жестких ссылках.

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


Процесс, данный cprofitt, включает:

  1. Поверните резервные копии для создания места для нового. ("Сегодняшнее резервное копирование" со вчерашнего дня становится "Вчерашним резервным копированием", "Вчерашнее Резервное копирование" от два дня назад становится "Двумя Днями резервное копирование ago" и так далее),

    • Список продолжает расти, пока Вы хотите его, однако в сценарии, он только имеет 4 снимка. (Это делает целый процесс снова для следующего уровня (например, неделя - "Резервное копирование этой недели") и поворачивает их, так, чтобы был то, почему это имеет только 4).
    • Перемещение сделано наоборот для предотвращения перезаписи
  2. Скопируйте последний снимок, который Вы сделали (например, "Вчерашнее резервное копирование") к пятну для нового (например, "Сегодняшнее резервное копирование"), делая новые жесткие ссылки на существующие файлы, не копируя файл. Таким образом, все файлы в новом снимке указывают на то же местоположение как предыдущее.


Проиллюстрированный пример

В изображении ниже, файлы того же цвета, которые имеют то же имя файла, являются жесткими ссылками на тот же файл на диске. Здесь мы просто имеем дело с двумя снимками и несколькими файлами, но масштабами в качестве примера. (За исключением факта я перемещаюсь, создает снимки противоположный путь к сценариям в ответе cproffit),

enter image description here

Процесс - это:

  1. Существует снимок системы.

  2. Снимок является копиями (создающий жесткие ссылки на существующие файлы)

  3. Rsync выполняется для обновления снимка. Когда файлы изменяются, это хранит новый файл как новую копию на жестком диске (таким образом, более старый снимок не изменяется). В этом примере был изменен Файл B.Примечание: у нас теперь есть только 1 копия Файла A и Файла C и две копии Файла B, сохраненного на жестком диске

  4. Вращайтесь снимки (в этом случае создают снимки 0, 'уменьшается' и удален, и я переименовываю снимок 1 для создания снимков 0),

  5. Скопируйте снимок снова (повторение шага 2)

  6. Rsync снова. (Повторение шага 3). Теперь у нас есть 1 копия Файла A и 2 копии и Файла B и Файла C


Упрощенная версия [первого] сценария (чтобы не быть выполненным, так же, как стартовая площадка) это:

#!/bin/bash

# Delete the snapshot we don't want (has 'fallen off')
rm -rf /root/snapshot/home/hourly.3 ;

# Rotate the snapshots by shuffling them back
mv /root/snapshot/home/hourly.2 /root/snapshot/home/hourly.3 ;
mv /root/snapshot/home/hourly.1 /root/snapshot/home/hourly.2 ;

# Copy the snapshot (creating hard links to the existing files)
cp -al /root/snapshot/home/hourly.0 /root/snapshot/home/hourly.1 ;

# Do the rsync ...
# 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 /home/ /root/snapshot/home/hourly.0 ;

Теперь полный сценарий (сценарии) имеет полное объяснение здесь (как cprofitt связанный с), и это более полно, но это в основном как выше. Другой сценарий для группировки снимков и другой части переговоров по ответу cprofitt о создании автоматического процесса (использование крона) и проверяя, что резервное копирование было успешно.

Можно изменить имена, таким образом, вместо каталогов, называемых "каждый час...", их называют чем-то еще, и скрипт запущен вручную.


Для восстановления всех скопируйте последний снимок (или предыдущий) назад к каталогу, из которого Вы брали резервные копии.

Для восстановления единственного файла, который находится все еще в снимке пойдите снимок и скопируйте его назад туда, где он принадлежит.

Резервные носители могут быть внешним жестким диском (должен быть ext2/ext3/ext4). Если Вы создавали резервную копию / (главным образом /boot, /home, /etc /root и /usr) затем, сказать...

  1. Вы монтируете внешний диск, выполняете резервное копирование и создаете последний снимок.

  2. Размонтируйте диск.

  3. Помните удаление файла (даже от мусора), что Вы хотели.

  4. Подключите внешний диск и получите файл.

  5. Сделайте резервное копирование (только, чтобы быть уверенными)

  6. Разъедините диск и отправьтесь в путешествие...

  7. Поймите, что ноутбук и лава не смешиваются.

  8. С Вашим новым ноутбуком, выполняющим живой CD, отформатируйте внутренний диск, смонтируйте Вас внешний диск и затем cp -a /media/external/snapshot-0/* /media/internal-drive (принимающий снимок 0 последний снимок),

  9. Личинка установки к MBR (да это должно быть отдельным) - или использование dd скопировать mbr, как cprofitt сказало в нижней части его ответа.

  10. Перезагрузка.

Сценарий должен быть усовершенствован (чтобы только получить материал, который Вы хотите), и процедура aove предполагает, что у Вас нет a /home раздел. Если Вы делаете (или имел), создают новый на диске и монтируют его на месте с mount /dev/sdxy /media/external/home перед копированием.

14
ответ дан 21 March 2014 в 16:36

Это немного над моей головой, но похоже, что часть того, что вы хотите сделать, - сделать частичное резервное копирование двоичных файлов (например, файлов образов разделов). Есть пакет, предназначенный для этого (я только что прочитал об этом - не пробовал.)

Взгляните на bup.

https://github.com/apenwarr/bup

Это может дать вам некоторые идеи.

0
ответ дан 21 March 2014 в 16:36

Вам следует взглянуть на ddar ( домашняя страница ).

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

Примечание: Я сам не пробовал (но доверяю автору). Возможно, он не будет делать то, что вы хотели бы достичь «из коробки», но все же на странице есть более похожие решения (например, ZFS ), так что в качестве отправной точки он мог бы, возможно, оказаться полезным.

0
ответ дан 21 March 2014 в 16:36

Есть 2 способа сделать инкрементное резервное копирование на основе блоков

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

Снимки на основе файловой системы

[ 1120] Оба ZFS и BTRFS предоставляют основанные на блоках моментальные снимки ( BTRFS , ZFS (стр. 25) ). У вас может быть диск, к которому вы выполняете синхронизацию, это ZFS или BTRFS и снимок.

Существуют также снимки LVM (упомянутые cprofitt), которые предоставляют такие же инкрементные снимки на основе блоков.

Снимки программ на основе

Существует несколько программ резервного копирования , однако некоторые выделяются для этой цели:

Я знаю, что вы специально упомянули, что вы не ищете что-то вроде двуличия, однако я подумал, что мог бы упомянуть некоторые особенности.

Однако для восстановления этих программ требуется их установка. Прелесть чего-то вроде rsync заключается в том, что почти в каждой установке linux есть rsync (например, в крошечном ядре (дистрибутив 10 МБ) его нет) по умолчанию.

Duplicity

Он просто сохраняет diff (уровень блока), а затем сжимает и шифрует их. Это приводит к еще меньшему объему памяти, чем метод rsync, однако (по крайней мере, так, как я это понимаю) необходимо будет восстановить файловую систему, что потребует времени (если вы используете инкрементные резервные копии с ним, и это зависит от времени с последнее полное резервное копирование)

Справочная страница объясняет, как это работает.

Rdiff-backup

Клиент-серверная программа, которая, как и двуличие, создает различия на уровне блоков, однако в ней хранятся изменения с самой последней точки восстановления, поэтому самый последний моментальный снимок восстанавливается быстрее всего. Возвращение во времени (не самый последний снимок) требует больше различий для анализа и поэтому медленнее.

Некоторые люди сравнивают rdiff-backup с rsnapshot (кажется, более автоматический способ менструации rsync). Почти все инструкции фокусируются на использовании rdiff по сети, однако я нашел один, который упоминает , как это сделать на localhost .

0
ответ дан 21 March 2014 в 16:36

Я думаю, что вы можете сделать это с LVM, это только теоретически, и это потратит огромное количество жесткого диска. Моя теория заключается в том, что вы можете получить корневую систему на логическом томе, а затем, если вы хотите сделать тест, вы можете создать моментальный снимок и перезагрузить компьютер, используя новый том.

Для работы снимков LVM необходим исходный объем. Это связано с тем, что новый том содержит разницу между моментальным снимком и реальной файловой системой.

Если вы оставите систему в этом состоянии, вы начнете тратить место на диске при изменении новой файловой системы. Я не знаю, есть ли способ объединить снимок и окончательный файловый элемент. Конечно, вы можете перейти на другой логический том, но для этого вам понадобится вдвое больше места в вашей файловой системе плюс разница между вашей «точкой восстановления» и текущим состоянием.

И все это требует перезагрузки и далеко не является автоматическим.

Также предполагается, что некоторые современные файловые системы идут по этому пути, например, zfs в системах Solaris или экспериментальные btrfs.

0
ответ дан 21 March 2014 в 16:36

Вы могли использовать 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;

После создания сценария к Вашим потребностям добавляют его к заданиям крона.

crontab-e

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

0 */4 * * */usr/local/bin/make_snapshot.sh

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)

Если бы Вы хотите, чтобы это каждый час работало, Вы добавили бы задание крона в течение каждого часа.

Другой возможный вариант использует 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 как показано ниже. В этом примере,

    / домой – исходный каталог, который должен быть поддержан localhost/– целевой каталог, где резервное копирование будет сохранено. Обратите внимание на то, что этот каталог будет создан под/.snapshots/{internal.n} / каталог как показано на последнем шаге.

    нано/etc/rsnapshot.conf

    скопируйте/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/

----Восстановление с нуля

Я использовал бы dd и tar, чтобы сделать baremetal восстановление.

Резервные важные метаданные:

# dd if-/dev/hda of=/backups/mbr bs=512 count=1

Скопируйте операционную систему:

# mkdir /backups
# mount nfsserver:/backups/<servername> /backups


# cd /
# tar cfz /backups/system.tar.gz --exclude /mnt --exclude /proc --exclude /backups

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

7
ответ дан 21 March 2014 в 16:36

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

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