第3章 ファイルバックアップの自動化
ファイルのバックアップを自動化する方法について解説するよ。rsyncコマンドを使って、ファイルをコピーする方法、リモートへ同期する方法、バッチ化して自動化する方法を解説するよ。

rsyncを使ったファイルのバックアップ

rsyncを使ったファイルバックアップの方法を解説します。

rsyncとは

rsyncは、ファイルを同期するためのコマンドです。一般的には、ディレクトリを同期するために利用されます。ディレクトリの中の、変更のあるファイルだけを、コピーしてくれるので、転送量が少なく、速度が速いです。

ディレクトリのコピー

rsyncを使って、ディレクトリをコピーしてみましょう。「dir1」の「foo」というディレクトリの中身を「dir2」の「foo」というディレクトリの中にコピーしてみます。

# 「dir1」の「foo」というディレクトリの中身を
# 「dir2」の「foo」というディレクトリの中にコピー
rsync -av dir1/foo/ dir2/foo/

「-a」オプションは、rsyncのディレクトリ同期のためにしているするオプションを一度に指定できるものです。「-v」オプションは、コピーの結果を標準出力に出力します。「dir1/foo/」「dir2/foo/」と末尾にスラッシュがついているところに注目してください。このように記述するとディレクトリ「dir1/foo」の中身を、ディレクトリ「dir2/foo」の中にコピーするという意味になります。ディレクトリが存在しない場合は、作成されます。

rsyncの出力結果のサンプルです。

sending incremental file list
created directory dir2/foo
./
a.txt
b.txt

sent 185 bytes  received 88 bytes  546.00 bytes/sec
total size is 0  speedup is 0.00

ディレクトリを同期させる場合は、ファイル削除の情報も考慮してくれる「--delete」オプションをつけておくとよいでしょう。

# 削除した情報も考慮
rsync -av --delete dir1/foo/ dir2/foo/

sshを使ったリモートサーバーへの接続

次は、リモートサーバーへのディレクトリのコピー方法を解説していきますが、その前に、リモートサーバーへ接続する方法を解説します。rsyncはリモートサーバーへの接続に、sshというコマンドを利用しています。sshは、SSHというプロトコルを使って、セキュアにリモートサーバーにコマンドを送信するためのコマンドです。

まず、sshコマンドで、リモートサーバーに接続してみましょう。

# IPアドレス「59.105.185.193」ポート番号「55555」
# ユーザー「kimoto」でSSHでリモートサーバーに接続
ssh -p 55555 kimoto@59.105.185.193

パスワード認証の場合は、パスワードを聞かれるので、入力します。接続ができたら、lsコマンドを実行して、リモートサーバーのkimotoのホームディレクトリのファイル一覧が見れるかどうかを確認してみましょう。

ls

リモートサーバー上の、ファイル一覧が確認できれば、OKです。

リモートサーバーにディレクトリをコピーする

rsyncコマンドを使って、リモートサーバーにディレクトリをコピーしてみましょう。「/foo/dir1」を、リモートサーバーの「~/backup/dir1」にコピーします。「~」はkimotoのホームディレクトリです。

コピー先のファイルの名の先頭に「kimoto@59.105.185.193:」と、ユーザー名とIPアドレスを指定します。ポート番号は「-e」コマンドで、使用するSSHコマンドを記述することで指定できます。「-z」オプションを指定するとネットワーク転送時に、ファイルを圧縮して転送してくれます。ネットワーク転送をするときは、指定して置いたほうが効率が良くなると感じます。

# rsyncコマンドでリモートサーバーにディレクトリをコピー
rsync -e "ssh -p 55555" -avz --delete /foo/dir1/ kimoto@59.105.185.193:~/backup/dir1/

パスワード認証の場合は、パスワードを聞かれるので、入力します。

公開鍵認証でパスワード入力を不要にする

上記の方法でコピーした場合は、パスワードの入力が必要です。ファイルバックアップを自動化する場合は、パスワード入力を不要にしたいですね。sshコマンドでは、パスワードの認証の他に、公開鍵認証と呼ばれる認証方法があるので、これを利用します。

公開鍵と秘密鍵のペアを作成して、リモートサーバーに公開鍵を登録すれば、パスワードなしで、SSH接続が行えます。

秘密鍵と公開鍵の作成

秘密鍵と公開鍵のペアを作成するには、まず「~/.ssh」というディレクトリを作成します。パーミッションは「~/.ssh」のディレクトリのパーミッションは「700」である必要があります。

mkdir -p ~/.ssh
chmod 700 ~/.ssh
cd ~/.ssh

秘密鍵と公開鍵のペアを作成を作成するには「ssh-keygen」コマンドを使用します。

# 秘密鍵と公開鍵のペアの生成
ssh-keygen -t rsa

生成するファイル名を聞かれますので以下の名前で入力しましょう。

id_rsa_backup

秘密鍵と公開鍵のペアが生成されます。「id_rsa_backup」は秘密鍵、「id_rsa_backup.pub」は公開鍵です。

id_rsa_backup
id_rsa_backup.pub

公開鍵の内容をメモする

公開鍵の内容をメモしておきましょう。

cat id_rsa_backup.pub

出力結果のサンプルです。これは一行になっています。

ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCjSsucYA958wTIKUcPRXC2iZxb84FXkzm41/jzpfnUeBFsypS8xfTXpfDaSIYeMDyr9pIUfDuWWPykoofL4WZaJYDy5pQclFwby/KttDRAnm0XZQ2ZDUtnrUUdva55mxOcTJP0c1VWXpwrhBA+JSFLOGB8wxCV8UFh9XWXI4c5QKQ/Hyl8//nXT6suQf199VNf4Ru31rs+49FDW9FyvoX1GGEEBJCT2ROVD6qi1xY766PuhM/4OMQeIxZmZg8ysML307viqkKh/2mecwkdV1mxGQt8GbO3gvTOX5h9p7tGEwa3zSHhxudux1Kf6Pfcg4FwKuld8r77DKMXEszpRI11 myapp@myhost

公開鍵をリモートサーバーに登録する

リモートサーバーでも「~/.ssh」ディレクトリを作成しましょう。

mkdir -p ~/.ssh
chmod 700 ~/.ssh
cd ~/.ssh

「authorized_keys」という公開鍵を登録するファイルを作成します。すでに作成されている場合は、作成する必要はありません。

touch authorized_keys
chmod 700 authorized_keys

メモしてある公開鍵の内容を「authorized_keys」に追記しましょう。

公開鍵を使ってリモートサーバーにディレクトリをコピー

rsyncコマンドでリモートサーバーにディレクトリをコピーしてみましょう。公開鍵を指定するにはsshコマンドの「-i」オプションを使用します。

# rsyncコマンドでリモートサーバーにディレクトリをコピー
# 公開鍵認証
rsync -e "ssh -p 55555 -i /home/kimoto/.ssh/id_rsa_backup" -avz --delete  /home/kimoto/foo/dir1/ kimoto@59.105.185.193:/home/kimoto/backup/dir1/

これで、パスワードを入力しないで、リモートサーバーにディレクトリをコピーすることができるようになりました。

cronでコマンド実行をスケジュールする

さて、バックアップの自動化の最後は、cronでコマンド実行をスケジューリングすることです。cronを使えば、1日に一回、この時間に実行するといったスケジュールを記述することができます。

cronの設定は、crontabと呼ばれる設定ファイルに記述します。viで開かれるので、編集しましょう。

# crontabの編集
crontab -e

毎日午前9時に実行する場合は、以下のように記述します。crontabの記述方法は、「分 時 日 月 週 コマンド」です。毎日、毎週のように「毎」を意味するには「*」を使います。

# 毎日午前9時にバックアップを実行する
00 09 * * * rsync -e "ssh -p 55555 -i /home/kimoto/.ssh/id_rsa_backup" -avz --delete  /home/kimoto/foo/dir1/ kimoto@59.105.185.193:/home/kimoto/backup/dir1/

これで、ファイルバックアップの自動化ができるようになりました。

業務に役立つPerl

関連情報