前回に引き続きシェルスクリプトについて書いてみます。
※備忘録というかタイトルがなんだか変…

自宅で 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 でインストールしておきます。

残りは、/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