rsyncとsshで別のマシンにバックアップ
rsyncは同一のマシンの中でバックアップするだけでなく、sshと連携して別のマシンにバックアップをとることができる。
本格的にサーバーを運営しようとするなら、バックアップのサーバーを別に用意しておくべきだ。ハードウェアの障害が起きてメインのサーバーが動かなくなったときに、バックアップのサーバーに切り替えられるようにしておくわけだ。Linuxではクラスタという機能を利用することで、メインのサーバーがダウンしてもサブのサーバーへ自動的に切り替えられるようになっている。
しかし、個人レベルのサーバーで待機しているだけのサブのサーバーを用意するというのも非効率な話だ。普段はサブのサーバー、新しいアプリケーションのテストをするといった実験の場として活用し、いざというときにメインのかわりに稼働するサーバーとして運用するのがおすすめだと思う。筆者の環境ではメインのサーバーのほかに2台のサーバーがあり、サブのサーバーでさまざまな実験を行っている。そこで安定して動くことを確認できたものだけ、メインのサーバーにもってくる。メインのサーバーはめったなことでダウンさせるわけにはいかない。
そうしたサブのサーバーにメインのデータを定期的に転送しておけば、もしメインがこけてもすぐにサブに引き継げる。筆者は毎日午前3時に/homeディレクトリ以下のすべてのデータをサブのサーバーにコピーしている。いわゆるバックアップとして実行しているだけでなく、いざというときはメインにとってかわれるように態勢をととのえているのだ。
こちらのページでrsyncによるバックアップの基本について述べた。このページでは一台のマシンの中でバックアップするのでなく、別のマシンにデータを転送することに挑戦してみたい。
rsync+sshで別マシンにバックアップ
rsyncで別マシンにバックアップする書式は「rsync -avz --delete -e ssh (バックアップ元のディレクトリ) (バックアップ先のホスト名):(バックアップ先のディレクトリ)」となっている。たとえば、/home/userディレクトリをbackupというマシンの/home/userディレクトリにバックアップする場合は、「rsync -avz --delete -e ssh /home/user/ backup:/home/user」と指定すればいい。もちろん、バックアップ先のマシンではsshサーバーを起動し、sshでほかのマシンからログインできるようにしておく必要がある。
$ rsync -avz --delete -e ssh /home/user/ backup:/home/user
user@backup's password:×××
building file list ... done
:
:
sent 124483643 bytes received 25000 bytes 1741379.62 bytes/sec
total size is 132549841 speedup is 1.06
$
パスワードなしで自動バックアップを実現
上記の方法を使えば、簡単に別のマシンにバックアップができるが、コマンドを入力したときにパスワードを入力する必要がある。これではcronに登録して自動バックアップすることはできない。
そこでカギ交換による認証を用いて、パスワードの入力なしにバックアップする方法を見ていこう。これならばcronに登録し、無人での自動バックアップが可能になる。なお、カギ交換によるリモートログインについてはこちらのページで原理を解説しているので、sshによるカギ交換の認証をおこなったことがない人はぜひ参照してほしい。
最初にどのディレクトリをバックアップするか考える必要がある。あるユーザーのホームディレクトリだけならば、一般ユーザーの権限でバックアップができる。だが、/homeディレクトリ全体をバックアップしようという場合はroot権限が必要になる。ここでは/home以下のすべてのディレクトリをバックアップすることを考えてみよう。
-
まずはバックアップ元のマシンで秘密鍵と公開鍵のペアを作成する。バックアップ元のマシンにrootでログインし(suコマンドでスーパーユーザーになっても可)、ssh-keygenコマンドでカギを作る。このとき、秘密鍵を解除するパスフレーズを登録しないで、空のままにしておくのが肝心だ。パスフレーズを設定するとバックアップの時に解除のためのパスワードを入力する必要があるために自動化ができない。パスフレーズを設定しても秘密鍵が流出しない限りは不正利用されることはない。
# ssh-keygen -t rsa Generating public/private rsa key pair. Enter file in which to save the key (/root/.ssh/id_rsa): 「Enter」を押す Enter passphrase (empty for no passphrase): 「Enter」を押す Enter same passphrase again: 「Enter」を押す Your identification has been saved in /root/.ssh/id_rsa. Your public key has been saved in /root/.ssh/id_rsa.pub. The key fingerprint is: 04:cf:a6:c9:2e:01:41:6c:86:34:03:96:c9:7b:7a:cd root@mydomain.com #
-
公開鍵をバックアップ先のマシンにコピーする。公開鍵のファイルは「/root/.ssh/id_rsa.pub」だ。フロッピーにコピーしたり、ftpを使ったりしてもいいが、バックアップ先にsshでログインできるなら、scpコマンドで以下のようにコピーすることができる。書式はrsyncコマンドと似ていて、「scp (コピー元ファイル) (コピー先のホスト名):(コピー先のディレクトリ)」となっている。
# scp /root/.ssh/id_rsa.pub main:/root/.ssh/ root@main's password: id_rsa.pub 100% 887 0.9KB/s 00:00 #
-
バックアップ先のマシンでsshのログインにカギによる認証を行うように「/etc/ssh/sshd_config」を編集する。この設定を行うとパスワードの認証ができなくなり、カギでしかログインできなくなる。また、rootでのログインを許可する。編集が終わったら、sshdを再起動して設定を有効にする。
PasswordAuthentication no 「yes」を「no」に変更する PermitRootLogin yes 「no」を「yes」に変更する
# /etc/rc.d/init.d/sshd restart sshdを停止中: [ OK ] sshdを起動中: [ OK ] #
-
バックアップ先のマシンで公開鍵「id_rsa.pub」を「authorized_key」に追加する。「authorized_key」は認証に利用する公開鍵を納めたものだ。
# cat /etc/.ssh/id_rsa.pub >> /etc/.ssh/authorized_keys
-
バックアップ元からバックアップ先にパスワードやパスフレーズなしでログインできるかを確認する。ここまでの手順を行っていれば、何も入力しなくてもバックアップ先にsshでログインできるようになっているはずだ。
[root@main root]# ssh root@backup バックアップ先にrootでログインする Last login: Tue Feb 15 02:14:56 2005 from 192.168.0.200 [root@backup root]# exit ログインできることを確認したらログアウトする [root@main root]#
-
ログインが無事にできることを確認したら、rsyncでバックアップができるかをチェックしよう。ホスト名backupに/homeディレクトリ以下をすべてコピーするコマンドは「rsync -avz --delete -e ssh /home/ backup:/home」になる。
# rsync -avz --delete -e ssh /home/ backup:/home
-
無事にrsyncでコピーができたら、このコマンドを/etc/crontabに登録する。毎朝3時10分にバックアップを行うときは次のように/etc/crontabに記述を追加する。
# run-parts 01 * * * * root run-parts /etc/cron.hourly 02 4 * * * root run-parts /etc/cron.daily 22 4 * * 0 root run-parts /etc/cron.weekly 42 4 1 * * root run-parts /etc/cron.monthly 10 3 * * * root /usr/bin/rsync -avz --delete -e ssh /home/ backup:/home