web-dev-qa-db-ja.com

シンプルなバックアップソリューション

Ubuntuサーバー上のディレクトリの非常に基本的なバックアップスクリプト/パッケージを探しています。現在、私はこのようなcronジョブを使用しています:

0 5 * * 1 Sudo tar -Pzcf /var/backups/home.tgz /home/

しかし、ファイル名にタイムスタンプを追加し、古いバックアップを上書きしないソリューションが必要です。もちろん、これはゆっくりとドライブをあふれさせるので、古いバックアップ(2か月以上など)を自動的に削除する必要があります。

乾杯、デニス


PDATE:シンプルであるため、logrotate-ソリューションに恩恵を与えることにしました。しかし、他のすべての回答者にも大いに感謝します!

6
wottpal

Logrotateを使用したシンプルなソリューション

スクリプトを使用せずにシンプルに保ちたい場合は、現在のcronjobをそのまま使用し、さらにlogrotateルールを構成します。

これを行うには、/etc/logrotate.d/backup-homeという名前のファイルに次を配置します。

/var/backups/home.tgz {
    weekly
    rotate 8
    nocompress
    dateext
}

これ以降、logrotateが実行されるたびに(通常、毎日午前6時25分に実行されます)、ローテーションに適しているかどうかを確認し、適切な場合は、home.tgzをタイムスタンプ付きの別のファイルに変更します追加されました。 8つのコピーが保持されるため、約2か月の履歴があります。

dateformatオプションを使用してタイムスタンプをカスタマイズできます。 logrotate(8) を参照してください。

バックアップジョブは午前5時に実行され、logrotateは午前6時25分に実行されるため、tarバックアップが1時間と25分未満で実行されることを確認する必要があります(とにかくずっと高速になると思います)。

4
Sebastian Stark

これは、(/home/pduck/bup.sh)を使用するスクリプト(の変形)です。

#!/usr/bin/env bash

src_dir=/home/pduck
tgt_dir=/tmp/my-backups
mkdir -p $tgt_dir

# current backup directory, e.g. "2017-04-29T13:04:50";
now=$(date +%FT%H:%M:%S) 

# previous backup directory
prev=$(ls $tgt_dir | grep -e '^....-..-..T..:..:..$' | tail -1); 

if [ -z "$prev" ]; then
    # initial backup
    rsync -av --delete $src_dir $tgt_dir/$now/
else
    # incremental backup
    rsync -av --delete --link-dest=$tgt_dir/$prev/ $src_dir $tgt_dir/$now/
fi

exit 0;

rsyncを使用して、ホームディレクトリからバックアップ場所(私の場合は/tmp/my-backups)にファイルをローカルにコピーします。そのターゲットディレクトリの下に、現在のタイムスタンプを持つディレクトリが作成されます。 /tmp/my-backups/2018-04-29T12:49:42およびそのディレクトリの下に、その日のバックアップが配置されます。

スクリプトをもう一度実行すると、/tmp/my-backups/2018-04-29T12:49:42というディレクトリが既にあることがわかります(タイムスタンプパターンに一致する「最新の」ディレクトリを選択します)。次にrsyncコマンドを実行しますが、今回は--link-dest=/tmp/my-backups/2018-04-29T12:49:42/スイッチを使用して前のバックアップをポイントします。

これは、増分バックアップを作成する実際のポイントです。

--link-dest=…を使用すると、rsyncはlink-destディレクトリ内のファイルと比較して変更されていないファイルをコピーしません。代わりに、現在のファイルと以前のファイルの間にhardlinksを作成するだけです。

このスクリプトを10回実行すると、さまざまなタイムスタンプを持つ10個のディレクトリが取得され、それぞれがその時点のファイルのスナップショットを保持します。ディレクトリを参照して、必要なファイルを復元できます。

ハウスキーピングも非常に簡単です:rm -rf保持したくないタイムスタンプディレクトリだけです。これにより、古いファイルや新しいファイル、変更されていないファイルは削除されず、ハードリンクが削除(デクリメント)されます。たとえば、3つの世代がある場合:

  • /tmp/my-backups/2018-04-29T...
  • /tmp/my-backups/2018-04-30T...
  • /tmp/my-backups/2018-05-01T...

2番目のディレクトリを削除すると、その日のsnapshotが失われますが、ファイルはまだ1番目または3番目のディレクトリ(または両方)にあります。

/etc/cron.dailyに次のようなcronjobを入れました:

#!/bin/sh
/usr/bin/systemd-cat -t backupscript -p info /home/pduck/bup.sh

そのファイルにbackupまたは何か、chmod +x itという名前を付けますが、omit.shサフィックス(実行されません)。 /usr/bin/systemd-cat -t backupscript -p infoにより、journalctl -t backupscriptで進捗状況を見ることができます。

このrsyncソリューションでは、ハードリンクのため、ターゲットディレクトリがext4ファイルシステム上にある必要があることに注意してください。

5
PerlDuck

Cronコマンドを少し編集するだけで、ファイル名にタイムスタンプを追加できます。

0 5 * * 1 Sudo tar -Pzcf /var/backups/home_$(date "+%Y-%m-%d_%H-%M-%S").tgz /home/

クリーニングについては、素晴らしい1行のスクリプトを見つけました ここ 私はあなたのケースに適応しました:

find . -type f -name 'home_*.tgz' -exec sh -c 'bcp="${1%_*}"; bcp="${bcp#*_}"; [ "$bcp" "<" "$(date +%F -d "60 days ago")" ] && rm "$1"' 0 {} \;

上記のコマンドを別のcronジョブに追加すると、60日より古いバックアップが削除されます。 HTH

3

Cronによって呼び出される私の毎日のバックアップスクリプトからのソリューションの一部を次に示します。 Linux構成、スクリプト、およびドキュメントをGmailにバックアップする 。完全なスクリプトが適切である理由は次のとおりです。

  • ターゲットの/home/me/*ファイルが含まれますが、FireFox、Chrome、およびバックアップに関心のない他のアプリで使用する重要な1 GBの/home/ファイルがスキップされます。
  • 重要なファイルが含まれていますが、/etc/cron*/etc/system*/lib/systemd/system-sleep/etc/rc.local/boot/grub/usr/share/plymouth/etc/apt/trusted.gpgなどでは重要ではありません。
  • 毎朝、オフサイトバックアップのためにgmail.comアカウントにバックアップをメールで送信します。バックアップはオンサイトだけでなく、同じマシンにもあります。

関連するスクリプトは、次のとおりです。

#!/bin/sh
#
# NAME: daily-backup
# DESC: A .tar backup file is created, emailed and removed.
# DATE: Nov 25, 2017.
# CALL: WSL or Ubuntu calls from /etc/cron.daily/daily-backup
# PARM: No parameters but /etc/ssmtp/ssmtp.conf must be setup

# NOTE: Backup file name contains machine name + Distro
#       Same script for user with multiple dual boot laptops
#       Single machine should remove $HOSTNAME from name
#       Single distribution should remove $Distro

sleep 30 # Wait 30 seconds after boot

# Running under WSL (Windows Subsystem for Ubuntu)?
if cat /proc/version | grep Microsoft; then
    Distro="WSL"
else
    Distro="Ubuntu"
fi

today=$( date +%Y-%m-%d-%A )
/mnt/e/bin/daily-backup.sh Daily-$(hostname)-$Distro-backup-$today

Gmail.comの空き容量はわずか35%(15 GBのうち)なので、ファイルを削除する前に毎日のバックアップをしばらく実行できます。しかし、「xxxより古い」という哲学ではなく、ここで概説する祖父父息子戦略を使用します。 バックアップの記録を保持する必要があるか? 。要約すれば:

  • 14日後にパージされる月曜日から日曜日(毎日のバックアップ)
  • 8週間後に日曜日のバックアップ(週次バックアップ)がパージされました
  • 18か月後にパージされる月の最終日バックアップ(月次バックアップ)
  • 年末のバックアップ(年次バックアップ)は永久に保持されます

Pythonを学習し、Gmailフォルダーを管理するためにPythonライブラリをインストールする必要があるという事実により、パージプロセスは複雑になります。

世代別のバックアップが不要で、2か月以上前のファイルを削除する場合、この回答が役立ちます。 bashスクリプトを使用してフォルダー内のファイルを削除しないでください

要約すれば:

DAYS_TO_KEEP=60
find $BACKUP_DIR -maxdepth 1 -mtime +"$DAYS_TO_KEEP" -exec rm -rf {} \;
3