私はページをホストしており、ウェブスペースへのsshアクセスがあります。
このサイトでは、ユーザーによる変更が許可されています。古い状態に戻すことができるように、cronを使用して30分ごとに増分バックアップを作成し、次のスクリプトを起動するrsyncについて考えました。
#!/bin/bash
# Binaries
RSYNC=`which rsync`
LN=`which ln`
MKDIR=`which mkdir`
#TODO: Is this enough to make the script distro independent?
# Other Variables
source="<username>@<provider>:<workspace path>"
target="<local backup path>"
# Date ...
year=$(date +%Y)
month=$(date +%m)
day=$(date +%d)
# ... and time
hour=$(date +%H)
minute=$(date +%M)
# Prepare directories
$MKDIR -p $target/$year/$month/$day/"$hour"_"$minute"/
# TODO: Why is this necessary? The actual backup won't work without this line
# saying "directory does not exist...".
# Actual backup
$RSYNC -av --delete "$source" "$target/$year/$month/$day/"$hour"_"$minute"/" --link-dest="$target/latest/"
$LN -nsf "$target/$year/$month/$day/"$hour"_"$minute"/" "$target/latest"
# End script
exit 0
スクリプトはこれまでのところ機能しているように見えますが、ターゲットパスは過去3日間でソースパスの実際のサイズの約3倍に肥大化しました。
増分バックアップはわずかな増加につながるはずですよね?
何が間違っていますか?
前もって感謝します
マルクス
Rsyncに基づいて、まさにこれを行うツールが実際に作成されています。これはrdiff-backupと呼ばれ、過去に何度も使用して増分バックアップを作成し、以前の状態へのロールバックをサポートしています。また、バックアップディレクトリが永久に大きくならないように、古いバックアップをクリーンアップするように構成することもできます。
詳細についてはこちらをご覧ください。ドキュメントページの使用例をご覧ください。 http://rdiff-backup.nongnu.org/
バックアップメディアがext3やext4などのLinuxフォーマットを持っている場合(そして、おそらくそうであるか、ファイル属性がバックアップされない場合)、rsyncとcp -alを使って機能をうまく利用できる巧妙なトリックがありますファイルシステムの:増分バックアップを実行しますが、各バックアップでファイルへのハードリンクを作成します。これは、変更されたファイルのみをコピーすることを意味しますが、バックアップメディアには各ファイルのコピーが1つしかないため、サイズが膨らむことはありません(これは信用できません。私は再び見つけることができなかったという質問。)
私の(毎日の)バックアップは次のようになります。
DEST=/media/$USER/backups # the name my backup media is mounted under
rsync -av --progress --delete --exclude ".[!.]*" ~/ $DEST/current
DATE=`date -I`
mkdir $DEST/$DATE
cp -al $DEST/current/ $DEST/$DATE
これは、変更されたファイルのみで「current」を更新しますが、すべてのファイルへのハードリンクを含む今日の日付にちなんで名付けられたディレクトリを作成します。したがって、毎日のバックアップには、その場ですべてのファイルが含まれているように見えますが、実際には、バックアップメディアにコピーは1つしかありません。後者の点もマイナス面です。各ファイルのコピーが1つしかないため、メディアをローテーションして複数のコピーを作成する必要がありますが、それはいずれにしてもバックアップ方法として適切です。
b.Tannerの回答に基づいて、これは60秒ごとにテストするスクリプトです
while true
do
DEST=/home/$USER/backups # the name my backup media is mounted under
if [ -n "$(rsync -ai --delete --exclude ".[!.]*" $(pwd)/ $DEST/current)" ]; then
DATE=`date +"%m-%d-%y"`
TIME=`date +"%T"`
mkdir -p $DEST/OLD/$DATE
mkdir $DEST/OLD/$DATE/$TIME
cp -al $DEST/current/ $DEST/OLD/$DATE/$TIME
echo "done:$DATE/$TIME"
fi
sleep 60
done
Rsyncプログラムには、必要なことを行うバックアップオプションが既にあります。
これは、毎日23:45にルートとして実行するバックアップに使用するスクリプトです。
#!/bin/bash -e
# This is run as root at the end of the day
( echo ">>>>>>>>>>>>>>>>>>>>>>>" $(date)
today=$(date +%Y-%m-%d)
month=$(date +%Y-%m)
# USB backups
cd /media/ray/Backup-Ray
rsync --archive --one-file-system --delete --backup --backup-dir="../../$today/etc" "/etc/" "mostrecent/etc/"
rsync --archive --one-file-system --delete --backup --backup-dir="../../$today/home" --exclude=".config/google-chrome/" --exclude=".cache/" --exclude=".local/share/zeitgeist/" --exclude="Downloads/" "/home/" "mostrecent/home/"
rsync --archive $today/ $month/
echo "<<<<<<<<<<<<<<<<<<<<<<<" $(date)
) &>>/home/ray/Log/root.out
exit 0
変更および削除されたファイルはすべて保持されます。標準のUNIXツールを使用してファイルを調べて回復するのは簡単です。
$ cd /media/ray/Backup-Ray
$ ls -l {,*}/home/ray/public/Log/wait.xhtml
-rw-r--r-- 1 ray ray 14002 Dec 3 21:04 2018-12-16/home/ray/public/Log/wait.xhtml
-rw-r--r-- 1 ray ray 14102 Dec 16 09:28 2018-12-17/home/ray/public/Log/wait.xhtml
-rw-r--r-- 1 ray ray 14202 Dec 17 20:47 2018-12-20/home/ray/public/Log/wait.xhtml
-rw-r--r-- 1 ray ray 14302 Dec 20 15:12 2018-12-25/home/ray/public/Log/wait.xhtml
-rw-r--r-- 1 ray ray 14402 Dec 25 21:21 2018-12-26/home/ray/public/Log/wait.xhtml
-rw-r--r-- 1 ray ray 14402 Dec 25 21:21 2018-12/home/ray/public/Log/wait.xhtml
-rw-r--r-- 1 ray ray 14452 Dec 26 18:43 /home/ray/public/Log/wait.xhtml
-rw-r--r-- 1 ray ray 14452 Dec 26 18:43 mostrecent/home/ray/public/Log/wait.xhtml
「最新」ディレクトリのみが大きい。
毎月の累積ディレクトリ(2018-12)には、その月の最新の変更が含まれています。この手順を実行する必要はありませんが、スペースを節約する必要がある場合、その月のすべての毎日の更新を削除できますその月の間に物事がどのように変化したか。)
明らかに、頻度、タイムスタンプなどを変更し、移植性コードを追加する必要がありますが、同じメカニズムで必要なことを行う必要があります。