ハードディスクの増分スナップショットを作成および復元する方法


13

ディストリビューション/アプリケーションテストの目的で、Virtual Boxを頻繁に使用しています。

私が単に気に入っている機能の1つは、仮想マシンのスナップショットです。仮想マシンの状態を保存し、問題が発生した場合でも問題なく、すべてのハードディスク領域を消費することなく、以前の栄光に戻すことができます。

ライブシステムでは、ファイルシステムの1:1イメージを作成する方法を知っていますが、私が知っているすべてのソリューションは、完全なファイルシステムの新しいイメージを作成します。

現在のファイルシステムのスナップショットを取ることができるプログラム/ファイルシステムはありますか?別の場所に保存しますが、完全に新しいイメージを作成する代わりに増分バックアップを作成しますか?

私が望むものを簡単に説明するにddは、ファイルシステムのイメージである必要がありますが、完全バックアップだけでなく増分バックアップも作成する必要があります。


clonezillaなどは探していません。ユーザーからの介入なしで(またはほとんどなしで)システム自体内で実行する必要がありますが、ファイルシステムのすべてのデータが含まれています。また、mbrを保存するためのduplicityいくつかのフォルダースクリプト+ ddを除くすべてのシステムのバックアップも探していません。私は自分でそれを行うことができ、余分なフィネスを探しています。

システムに大規模な変更を加える前にできることを探しています。何かが間違っていたり、コーヒーをこぼした後にハードディスクを焼いた場合、liveCDから起動して、スナップショットをハードディスクに復元できます。

毎日である必要はなく、スケジュールさえ必要ありません。たまに実行するだけで、ファイルコピーベースではなく、できればRAWベースのジョブを実行できます。



では、インストール可能なイメージを作成できるアプリケーションを探していますか?そうでない場合、なぜDeja Dupを好まないのですか?アプリケーションにインストール可能なイメージを作成できるかどうかを尋ねる場合は、その答えも知りたいです。お気に入りを追加します。
heartsmagic

というタイトルの質問への回答を投稿しただけですが、ファイルレベルではなくベアメタルシステムを復元する方法を探しているようです。
cprofitt

1
ファイルシステムではなく、ブロックレベルの増分バックアップが必要なようです。スナップショットをサポートするファイルシステムを使用する以外に、あなたが求めていることが可能かどうかわかりません。LVM、BTRFSが可能性があります。
cprofitt

@cprofitt thxはタイトルを修正しましたが、より正確です。
ブルーノペレイラ

@Bruno-良いタイトルを作成することは、後で答えを見つけるために来る人々にとってこれが役立つようにするのに役立ちます。
cprofitt

回答:


14

cprofittの答えを説明するに(彼の答え漸進的であるため、説明します)...

最初に、ハードリンクについて知る必要があります。

ハードリンクは、実際にディスク(物理的な場所)上にあるデータを指し、ハードリンクを使用してデータにアクセスできます。各ファイルとディレクトリは、物理ディスク上のデータの場所へのハードリンクです。したがって、同じ場所を指す2つのファイル(ハードリンク)がある場合、データは1回だけ保存されます。


cprofittが提供するプロセスには以下が含まれます。

  1. バックアップを回転して、新しいバックアップ用のスポットを作成します。(昨日の「今日のバックアップ」は「昨日のバックアップ」になり、2日前の「昨日のバックアップ」は「2日前のバックアップ」になります)

    • リストは必要な限り拡大し続けますが、スクリプトには4つのスナップショットしかありません。(次のレベル(たとえば、1週間-「今週のバックアップ」)でプロセス全体を再度実行し、それらをローテーションするため、4つしかありません)。
    • 移動は、上書きを防ぐために逆に行われます
  2. 行った最新のスナップショット(「昨日のバックアップ」など)を新しいスナップショット(「今日のバックアップ」など)の場所にコピーし、ファイルをコピーせずに既存のファイルへの新しいハードリンクを作成します。したがって、新しいスナップショットのすべてのファイルは、前のファイルと同じ場所を指します。


図解された例

次の図では、同じファイル名を持つ同じ色のファイルは、ディスク上の同じファイルへのハードリンクです。ここでは、2つのスナップショットといくつかのファイルを扱っていますが、例は拡大します。(私はスナップショットをcproffitの答えのスクリプトとは反対の方法で移動しているという事実を除いて)

ここに画像の説明を入力してください

プロセスは次のとおりです。

  1. システムのスナップショットがあります。

  2. スナップショットはコピーです(既存のファイルへのハードリンクを作成します)

  3. Rsyncを実行してスナップショットを更新します。ファイルが変更されると、新しいファイルがハードディスクに新しいコピーとして保存されます(したがって、古いスナップショットは変更されません)。この例では、ファイルBが変更されています。注:現在、ファイルAとファイルCの1つのコピーと、ファイルBの2つのコピーのみがハードディスクに保存されています。

  4. スナップショットを回転します(この場合、スナップショット0は「落ちます」、削除され、スナップショット1をスナップショット0に変更します)

  5. スナップショットの開始をコピーします(ステップ2の繰り返し)

  6. 再びRsync。(ステップ3の繰り返し)。これで、ファイルAの1つのコピーと、ファイルBとファイルCの両方の2つのコピーができました。


[最初の]スクリプトの単純化されたバージョン(実行するためではなく、単なる踏み台として)は次のとおりです。

#!/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にリンクされているように)ここにあり、より完全ですが、基本的には上記のとおりです。もう1つのスクリプトはスナップショットをグループ化するためのもので、cprofittの回答の別の部分では、プロセスを(cronを使用して)自動化し、バックアップが成功したことを確認する方法について説明します。

名前を変更できるため、「hourly ...」と呼ばれるディレクトリの代わりに別の名前が付けられ、スクリプトが手動で実行されます。


ロット全体を復元するには、最新のスナップショット(または以前のスナップショット)をバックアップを取っていたディレクトリにコピーして戻します。

まだスナップショットにある単一のファイルを復元するには、スナップショットに移動して、それが属する場所にコピーします。

バックアップメディアは、外部ハードドライブ(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(snapshot-0が最新のスナップショットであると仮定して)

  9. MBRにgrubをインストールします(はい)。またはdd、cprofittが答えの最後に述べたように、mbrをバックアップするために使用します。

  10. リブート。

スクリプトは(必要なものだけを取得するために)洗練される必要があり、上記の手順は/homeパーティションがないことを前提としています。ディスク上に新しいディスクを作成する(または作成していた)場合は、mount /dev/sdxy /media/external/homeコピーする前にマウントします。


100 ddのスナップショットは100 x <average size of snapshot> 、ディスクスペースの価値があります。これらのうち100個がかかり<size of snapshot> + <size of changed files>ます。これを使用して、/ home(〜400GB)のいくつかのスナップショットを500GBディスクに配置しました。
Portablejim

仮想ディスクイメージをファイルシステムにマウントしてから、そのバックアップを作成できます。superuser.com/questions/158908/…およびリンクを参照してください
Portablejim

前述のように、これは仮想ボックスではなく、実行中のコンピューター用です。vboxは単なる例です。
ブルーノペレイラ

更新された質問(最後にコメントを追加する代わりに)。
Portablejim

@Portablejim:あなたはcpが「ハードリンクを保存している」と書いています。このフレーズは紛らわしいと思います。cp -alソースファイルをコピーする代わりに、ソースファイルへのハードリンクを作成しています。また、図2のAファイルが同じファイルであることを示すなど、図にもそれを反映させる必要があります。
ダニエルクルマン

7

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;

2番目:

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

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

これにより、make_snapshot.shが1時間ごとに4時間ごとに実行され、daily_snapshot_rotate.shが毎日13:00(つまり、午後1: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)

1時間ごとに実行する場合は、1時間ごとにcronジョブを追加します。

別の可能なオプションは、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 / {internal.n} /ディレクトリの下に作成されることに注意してください。

    nano /etc/rsnapshot.conf

    バックアップ/ home / localhost /

  2. rsnapshot構成のテスト

構成テストを実行して、rsnapshotが適切にセットアップされ、Linux rsyncバックアップを実行する準備ができていることを確認します。

# rsnapshot configtest
Syntax OK
  1. rsnapshotの毎時バックアップ構成の確認

Linuxディレクトリまたはファイルをさまざまな間隔でバックアップできます。デフォルトでは、毎時および毎日のバックアップが設定されています。

1時間ごとのバックアップ構成を確認します。

# 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. rsnapshotのCrontabエントリを追加

rsnapshot cwrsyncユーティリティで、rsyncの1時間ごとおよび1日ごとのバックアップ構成が適切にセットアップされていることを確認したら、次に示すように、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を使用します。

重要なメタデータのバックアップ:

# 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

個人的には、ベアメタル復元ファイルを作成したい場合、システムをオフラインにする傾向があります。


2
あなたの答えはすべて非常によく見えますが、問題はありませんが、私が尋ねているものではありませんが、どの方法もMBRを復元せddず、インクリメンタルではありません。これはどれも私が尋ねていることではありません。最後の10%を探すのは興味深いかもしれませんが、情報ダンプの残りのすべては実際にはそうではありません。
ブルーノペレイラ

上記の詳細はファイルシステム(ファイルシステムとして)を扱っており、MBRを扱うためにddプロセスを追加しました。
cprofitt

3

ブロックベースの増分バックアップを行うには2つの方法があります

  • ファイルシステムベースのスナップショット
  • プログラムベースのスナップショット

ファイルシステムベースのスナップショット

ZFSBTRFSは両方とも、ブロックベースの増分スナップショットを提供します(BTRFSZFS(25ページ))。ZFSまたはBTRFSのいずれかであるrsyncするドライブとスナップショットを作成できます。

LVMスナップショットもあります、同じブロック・ベースの増分スナップショットを提供する(cprofitt言及は)。

プログラムベースのスナップショット

いくつかのバックアッププログラムがありますが、いくつかの目的のために突出しています。

重複のようなものを探しているわけではないことを具体的に言及していることを知っていますが、いくつかの機能について言及することも考えました。

ただし、これらのプログラムでは、復元するためにインストールする必要があります。rsyncのような美しさは、ほぼすべてのLinuxインストールにデフォルトでrsyncがある(たとえば、小さなコア(10MBディストリビューション)が欠落している)ことです。

二枚舌

差分(ブロックレベル)を保存し、それらを圧縮して暗号化します。これはrsyncメソッドよりもさらに少ないストレージにつながりますが、(少なくとも私が見ているように)ファイルシステムを再構築する必要があり、時間がかかります(インクリメンタルバックアップを使用している場合、それは時間に依存します)最後の完全バックアップ)

manページには、それがどのように動作するかを説明します。

Rdiff-backup

重複のようにブロックレベルの差分を作成するクライアントサーバープログラム。ただし、最新の復元ポイントからの変更を保存するため、最新のスナップショットが最も高速に復元されます。(最新のスナップショットではなく)過去にさかのぼるには、分析する差分を増やす必要があるため、遅くなります。

rdiff-backupとrsnapshotを比較する人もいます(rsyncのより自動化された方法のようです)。ほとんどすべてのハウツーは、ネットワーク上でrdiffを使用することに焦点を当てていますが、localhostでそれを行う方法に言及しているものを見つけました。


私はこれが好きです、パーティション復元でそれを動作させる方法を説明するように注意してください?つまり、ディスクを壊した場合、スナップショットから完全なシステムを復元するにはどうすればよいでしょうか?
ブルーノペレイラ

これらのシステムの経験はありませんが、Googleを使用していくつかの研究を行った結果、これらのシステムを見つけただけです(そのため、これらは単にリンクにすぎません)。例えば、私はduplicity実際に何であるかを学びました。
Portablejim

3

ddarホームページご覧ください)。

スナップショットの同一部分を転送しないという意味で増分です。スナップショットを扱っているため、この単語の古典的な意味ではインクリメンタルではありません。

注: 私は自分でこれを試したことはありません(ただし、著者は信頼しています)。箱から出してすぐに達成したいことはできないかもしれませんが、ページ上に同様のソリューション(例:ZFS)がまだあります。


1
私はddarの著者です(言及してくれてありがとう!)。質問を正しく理解すれば、ddarに一連のLVMスナップショットを渡すと、要求どおりになります。あなたが言うように、それは増分ではなくスナップショットを扱いますが、スナップショットは新しいスナップショットに影響を与えることなく、古いスナップショットを自由に削除できるという利点を持つ同じ効果を持ちます。
ロビーバサック

@robie私はそれがどのように機能するかを見て喜んでいますが、私またはこの種のソリューションを探しているユーザーのために非常に小さなガイドを作成できますか?
ブルーノペレイラ

1

LVMが唯一の理論上でこれを行うことができると思います。私の理論では、ルートシステムを論理ボリューム上に置くことができ、テストを行う場合はスナップショットを作成し、新しいボリュームを使用してマシンを再起動できます。

LVMスナップショットが機能するには、元のボリュームが必要です。これは、新しいボリュームがスナップショットと実際のファイルシステムの違いを保持しているためです。

システムをこの状態のままにすると、新しいファイルシステムが変更されるとディスク容量が無駄になり始めます。スナップショットと決定的なファイルシステムを統合する方法があるかどうかはわかりません。確かに別の論理ボリュームにddできますが、そのためには、ファイルシステムの2倍のスペースに加えて、「リカバリポイント」と現在の状態の違いが必要になります。

そして、これらすべては再起動を必要とし、自動化にはほど遠い。

また、solarisシステムのzfsや実験的なbtrfsのように、いくつかの最新のファイルシステムがこのようになると想定されています。


1

これは少し頭に浮かびますが、あなたがしたいことの一部は、バイナリファイル(パーティションイメージファイルなど)の部分的なバックアップを作成することのように思えます。それを行うために設計されたパッケージがあります(私はそれについて読んだばかりです-試していません)

バップを見てください。

https://github.com/apenwarr/bup

それはあなたにいくつかのアイデアを与えるかもしれません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.