rsyncで自動バックアップ(Linux)

スポンサーリンク

サーバ機だと標準でRAID1や5がついてるので冗長化されてると思うんですが、故障した際に交換時のリビルドで死ぬ事があります。
大抵同じ時期にHDD買うので、1台死んだ時って、もう一台も虫の息だったりして、再構築でとどめを刺す感じですね。

という事で、別のサーバにrsyncでバックアップを取る方法です。
CentOS6.3のサーバで、別のだと設定ファイルのパスとかコマンドとか違うかもしれません。

rsyncはLinuxなら入ってるコマンドで、SSHなどネットワーク経由でバックアップ、また差分バックアップができるので2回目以降が非常に早く、負荷が小さいです。

バックアップ先の端末側 ———————-

バックアップを保存するサーバ側の設定です

バックアップ先のサーバでsshdを起動させときます

/etc/init.d/sshd start

再起動後もsshdが起動するようにして

chkconfig sshd on

/etc/hosts.deny でとりあえず全てsshdを拒否するよう追記します

sshd: all

/etc/hosts.allow で 192.168.2. のネットワークだけsshdを許可するよう追記します

sshd: 192.168.2.

バックアップを保存するディレクトリを分かりやすい位置に作成しておきます。
rsyncは保存先にディレクトリが存在しない場合は作成してくれますが、これは1階層目だけで、それ以上深いとエラーが出て失敗します。
外付けのHDDを接続してる場合などは df -k とかでマウント位置と容量を確認しときます。

バックアップしたいデータのある端末側 ———————-

expectをインストール
ここではシェルスクリプトで対話型の処理を自動化したいのでexpectを入れましたが、単にrsyncを実行するだけなら不要です。

yum install expect

とりあえずバックアップを試す

バックアップするデータや、保存先に間違いがないか、とりあえず試してみます。
転送され始めたら「CTRL + C」で抜けて、保存先が正しいかとか確認します。

以下の例だとローカルの「/home/aimix/」というディレクトリ以下が、192.168.2.200のサーバの「/home/aimix/backup/」に保存されます。
末尾の/(スラッシュ)が無いと挙動が違うので、両方とも合わせてください。

rsync -av -e ssh /home/aimix/ root@192.168.2.200:/home/aimix/backup/

シェルスクリプトの場合は以下のようにし rsynccron.sh とかの名前で保存します。
コメントで記載の(1)~(4)の行は環境に合わせて修正します。

#!/bin/sh

# (1)バックアップ対象ディレクトリ(ローカル)
LocalDir="/var/www/html/web/"

# (2)バックアップ先サーバのIP
TargetHost="192.168.2.200"

# (3)バックアップ先ディレクトリ
TargetDir="/mnt/hdd/backup/"

# (4)バックアップ先のrootパスワード
PassWord="1234567890"

expect -c "
set timeout 7200
spawn rsync -av -e ssh $LocalDir root@$TargetHost:$TargetDir
expect {

        \"Are you sure you want to continue connecting (yes/no)?\" {
                send \"yes\r\"
                expect {
                        -re \".*password:.*\" {
                                send \"$PassWord\r\"
                        }
                }
        }
        -re \".*password:.*\" {
            send \"$PassWord\r\"
        }
}
expect {
  \"denied\" { exit 1 }
  eof { exit 0 }
}
interact
"

rsyncは対話形式ですが、上記のようにexpectを使ったシェルスクリプトにすれば自動で実行できるので、cronに登録しやすいです。

保存した rsynccron.sh は chmod 0755 ./rsynccron.sh とかして実行権限をつけときます。

rsyncのオプションは以下のような感じです。
上記のままなら所有者や権限などそのまま維持し、更新されたファイルだけ転送するので、オプションは変更しなくていいと思いますが。

-v	# 処理中にコピーしているファイル名を表示する
-r	# 指定したディレクトリ以下を再帰的にコピー
-l	# シンボリックリンクをそのままコピー(指定無しはリンク先の実体をコピー)
-H	# ハードリンクをそのままコピー(指定無しはリンク先の実体をコピー)
-p	# パーミッションを保持したままコピー
-o	# 所有者属性を保持したままコピー
-g	# グループ属性を保持したままコピー
-t	# タイムスタンプを保持したままコピー
-D	# デバイスファイルを持ったままコピー
-z	# データを圧縮してコピー
-u	# 追加されたファイルだけをコピー
-a	# 上記オプションの rlptgoD を同時に指定

--exising	# 更新されたファイルだけコピー(追加ファイルは無視)
--delete	# ミラーリング(コピー元で削除されたファイルは転送先でも削除する)
--exclude ‘**’	# ** に一致するファイルはコピーしない(*.bak など)
--stats		# コピーの結果を表示する(指定無しは一切メッセージを表示しない)
-e ssh		# SSHを使い暗号化して転送する

/etc/crontab を開いて編集します。
1時30分にroot権限で実行する場合は以下のように追記します。

/etc/crontabへの登録例(1時30分にroot権限で実行)
30 1 * * * root /home/aimix/exec/cron/rsynccron.sh

先頭から5つは時刻などの指定で、
指定しない場合は * で、日を*にすると毎日という意味です。

(1)分	0~59
(2)時	0~23
(3)日	1~31
(4)月	1~12
(5)曜日	0~7(0と7は日曜日 0(日)、1(月)、2(火)、3(水)・・・)

crontabに追記できたら /etc/init.d/crond restart しておいて下さい。

これで毎日自動でバックアップを保存してくれます♪

その他

転送する際にroot以外のユーザーだと、所有者がそのユーザーになったり、権限も正しく維持できません。

あと、ファイルシステムがFATだと時刻の精度が2秒単位らしく、本来なら更新されたファイルだけ転送されますが、全部転送されてしまうので注意です。

Comment

タイトルとURLをコピーしました