web-dev-qa-db-ja.com

増分ファイルシステムバックアップのスクリプト

次の不完全なスクリプトを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

私の最初の質問は、最後に作成された/ backsのディレクトリにLASTBACKUPを正しく設定する方法ですか?

第二に、--link-deskを使用すると、以前のバックアップのファイルがまだ存在する場合、後のバックアップでコピーされず、元のコピーされたファイルにシンボリックにリンクされるという印象を受けますか?ただし、古いファイルを永久に保持したくありません。現在のバックアップによってそれらのバックアップにリンクされていると思われるファイルを失うことなく、特定の日付の前にすべてのバックアップを削除する最良の方法は何ですか?基本的に、特定の日付より前のすべてのファイルを特定の日付にマージしたいと思っています。それが最初に質問を組み立てた方法よりも理にかなっている場合です:)。 --link-destはハードリンクを作成できますか?作成できた場合、以前のディレクトリを削除しても、リンクされたファイルは実際には削除されませんか?

最後に、新しく作成された各バックアップフォルダー(/ mnt/backups/myfiles $ TIMEDATE)を圧縮する行をスクリプトに追加します。 この質問を読む に基づいて、私はこの行を使用できるかどうか疑問に思っていました

gzip --rsyncable /backups/myfiles$TIMEDATE

rsyncを実行した後、シーケンシャルrsync --link-destの実行で既にコピーおよび圧縮されたファイルが見つかるようにしますか?

私はそれがたくさんあることを知っています、あなたの助けに感謝します!

3
Evan

rsnapshot など、プロセス全体を自動化するツールを使用することをお勧めします。これは、実行しようとしていることを実装しているようです。

7
Ryan Thompson

一度に1つの質問をお願いします。最初の質問に答えるだけで、他の質問には他の質問を投稿できます。

最後のバックアップディレクトリが何であるかを知るために、単に以下を追加します。

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

スクリプトの最後まで、LASTBACKUP =を次のように変更します。

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

そうすれば、そのディレクトリに作成された他のファイル/フォルダや、失敗したバックアップフォルダ(大量の複製を作成する)ではなく、最後の完全なバックアップディレクトリを使用することを常に知っています

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は毎時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の毎時および毎日のバックアップ構成が適切にセットアップされていることを確認したら、次に示すように、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/

2
cprofitt

したがって、2番目(および3番目)の質問に答えようとします。--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古いバックアップを作成できます。 rmunlinkを意味します。ファイルのリンク数を減らします。ファイルシステムは、リンクカウントがゼロのファイルのみを上書きします。 gzipを使用して追加のファイルを作成すると、余分なスペースが使用されるだけで、ハードリンクの利点が失われます。

1
Frank