前回に引き続きバックアップに使うシェルスクリプトについて書いてみます。

自宅で ESXi サーバが2台、ちょっと離れた所に1台、これら ESXi サーバ上で、Windows server が2台、Linux サーバが数台、そして、お仕事用やら個人利用とかで VPS でも数台(IP-PBX とか…) Linux サーバが稼働しています。

障害時の対応とかも含めて、稼働中の Linux サーバ機は /etc /root /var あたりを管理サーバへ毎日バックアップを取っています。私流のバックアップの取り方と、その時に使うシェルスクリプトとかのメモです。

バックアップは、履歴管理が必要ですが、まずはバックアップ対象のディレクトリ単位で、管理サーバに rsync を使って同期(ミラーリング)します。これは、内容に変化があった所だけコピーしてくれるので、WAN 側にサーバがあっても、管理サーバの負荷や回線帯域に優しい手法です。

全てのバックアップ対象サーバのディレクトリが、管理サーバと同期が終われば、ディレクトリ単位で、tar で固めます。ディレクトリの階層構造も含めて、全て1個のファイルに収まるので、とても便利です。また、tar で固めたバックアップファイルの圧縮は、logrotate で行います。

 履歴管理をする為に、tar ファイルを logrotate を使って、圧縮ファイルの作成と指定された回数履歴を残します。一般の logrotate と同じやり方をするので、

hoge.tar
hoge.tar.1
hoge.tar.2.bz2
hote.tar.3.bz2

このように、毎日 rotate されてバックアップファイルが残って行きます。

それでは、サンプルスクリプトと各種コンフィグです。

 対象サーバのバックアップ対象ディレクトリとの同期処理

※ちゃんと名前解決出来ること、対象サーバへ公開鍵を使って root でログインできる前提です。

 サーバ毎にディレクトリ単位で tar で固める

ここでは、指定された場所(パス、ディレクトリ)で、そのディレクトリ内にあるディレクトリ名だけを抽出して、そのディレクトリを tar コマンドで固めるやり方です。

例えば、/root/backup の中身が以下の様だとします。

コマンドラインより ls -d */ と入力すると…

fuga/ hoge/

と、ディレクトリ内にあるディレクトリ名(not ファイル名)が表示されますので、この2つのディレクトリ名を tar コマンドへ渡します。

for dirname in `ls -d */`; do
      tar cf "${dirname%/}".tar ${dirname%/}
done

このスクリプトのポイントは、シェルの変数展開 です。
${dirname%/}行末のスラッシュを削除 してくれます。sedawk を使っても同じ事はできるのですが、こういう感じのさらっとした書き方は好きです。ネットで検索して、このブログにたどり着きました。詳しくは こちら をご覧下さい。

 logrotate を使うと履歴管理が便利

まずは /etc/logrotate.conf bzip2 を使う為の設定を追加します。
bzip2 の圧縮には個人的に pbzip2 が好きなので、事前に apt でインストールしておきます。

# see "man logrotate" for details
# rotate log files weekly
weekly

# keep 4 weeks worth of backlogs
rotate 4

# create new (empty) log files after rotating old ones create

# use date as a suffix of the rotated file
#dateext

# uncomment this if you want your log files compressed
compress
compresscmd /usr/bin/pbzip2
compressoptions  --best
compressext .bz2

# packages drop log rotation information into this directory
include /etc/logrotate.d

# system-specific logs may be also be configured here.

残りは、/etc/logrotated.d に、以下のスクリプトをセットします。

/root/backup/*.tar
{
     rotate 20 ←ここは、お好きに!
     daily
     missingok
     create 640 root adm
     notifempty
     compress
     delaycompress
}

デフォルトの設定だと、午前6時頃に logrotate のスクリプトが走るので、bzip2 で圧縮したファイルが指定した回数まで更新され、rotate で指定した回数を超えると、古いものから順に、自動的に削除されます。

 検証環境

Debian 10 「buster」 4.19.0-17-amd64
pbzip2 – parallel bzip2 file compressor, v1.1.9
rsync version 3.1.3 protocol version 31