Ubuntuサーバー上のディレクトリの非常に基本的なバックアップスクリプト/パッケージを探しています。現在、私はこのようなcronジョブを使用しています:
0 5 * * 1 Sudo tar -Pzcf /var/backups/home.tgz /home/
しかし、ファイル名にタイムスタンプを追加し、古いバックアップを上書きしないソリューションが必要です。もちろん、これはゆっくりとドライブをあふれさせるので、古いバックアップ(2か月以上など)を自動的に削除する必要があります。
乾杯、デニス
PDATE:シンプルであるため、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分未満で実行されることを確認する必要があります(とにかくずっと高速になると思います)。
これは、(/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
ファイルシステム上にある必要があることに注意してください。
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
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
などでは重要ではありません。関連するスクリプトは、次のとおりです。
#!/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より古い」という哲学ではなく、ここで概説する祖父父息子戦略を使用します。 バックアップの記録を保持する必要があるか? 。要約すれば:
Pythonを学習し、Gmailフォルダーを管理するためにPythonライブラリをインストールする必要があるという事実により、パージプロセスは複雑になります。
世代別のバックアップが不要で、2か月以上前のファイルを削除する場合、この回答が役立ちます。 bashスクリプトを使用してフォルダー内のファイルを削除しないでください 。
要約すれば:
DAYS_TO_KEEP=60
find $BACKUP_DIR -maxdepth 1 -mtime +"$DAYS_TO_KEEP" -exec rm -rf {} \;