Back to page

− Links

 Print 

Gentoo Linuxな生活​/rsyncでバックアップ :: Nest Of Hawk

xpwiki:Gentoo Linuxな生活/rsyncでバックアップ

Gentoo Linuxな生活​/システム管理関連[1]

Table of contents
  • バックアップしよう
  • rsync
    • 簡単にやってみる
  • 我が家ではどうしたか~
    • その1データ領域
    • システム領域のバックアップ
      • インクリメンタルバックアップ
      • で実際にバックアップ用のシェルを書いてみる

バックアップしよう anchor.png[2]

HDDと言えば、壊れるのが宿命。正直消耗品なので仕方がないことです。フルに動かし続けて、3年間ぐらいが標準的なところなのです。で、おいちゃんの所ではどうか。現サーバが稼動し始めたのが2004年5月。2年経とうとしているところ。2年と言うと、正直不安が増してくるところです。ましてや、地震や、不意の停電とかもしあったりすると、HDがいかれることもあると言うことです。

すると、そー言うときの保険と言うことで、他のサーバにバックアップを取っておこうというものです。

Page Top

rsync anchor.png[3]

rsyncってのは、差分バックアップを取ってくれるありがたいツール。差分バックアップとはなにか?変更があったファイルだけをバックアップし、何も変更がないファイルの場合はコピー操作を行わないと言うものです。なので、大量ファイルのバックアップであっても、時間の節約ができると言うことです。もちろん一番最初はフルバックアップをとるので時間がかかりますが、その後は1~2分でバックアップが終了できると言うありがたいツールです。

Page Top

簡単にやってみる anchor.png[4]

# rsync -a --delete コピー元 コピー先

です。コピー元、コピー先の指定は、ファイルでもディレクトリでもOK。ディレクトリの場合は、fooと指定するか、foo/と指定するかで意味が変わります

foo
fooディレクトリをコピーする。なのでrsync -a --delete foo var とやるとvarディレクトリの下にfooディレクトリができる
foo/
fooディレクトリの下要素をコピーする。rsync -a --delete foo/ varとやると、var配下が、foo配下と同じになる

となりますので気をつけてねー

さらに、ネットワーク越しのコピーでもOK。sshなどと同じように、コピー元、コピー先をホスト名@場所と指定することで、ネットワーク越しにコピーができます。但し、コピー先にrsyncをサーバとして起動しておくことが必要です。ちなみにgentooのrsyncは、デフォルトでsshを使用したコピーとなる模様。チープなCPUの玄箱君とコピーすると、sshが目一杯動き出して、CPUを占有しちゃいました…

Page Top

我が家ではどうしたか~ anchor.png[5]

Page Top

その1データ領域 anchor.png[6]

玄箱君をバックアップサーバとして動作させております。この子をNFSでエクスポートしておいてやって、バックアップ領域をサーバにマウントします。仮に/mnt/backupとしましょう。で

# rsync -a --delete バックアップ元 /mnt/backup

とやってやる。これでバックアップ取れますー。このやり方で、おいちゃんは動画や画像、DLしてきたツールなどデータのバックアップを1週間毎に取っております…

Page Top

システム領域のバックアップ anchor.png[7]

ついでに、おいちゃんはサーバの/以下を全てバックアップ取ってます。何故かと言うと、サーバ機のシステムは、大切に育てた唯一無二のもの。データは基本的に積み上げなので、単純同期でよいと思っています。んが、システム領域は、Gentooの場合、こまめにパッケージアップデートが繰り返されます。さらに、パッケージのバージョンアップによっては、サーバが動かなくなる場合もある…ということで、動く状態は保存しておく必要があると思い、フルバックアップ&インクリメンタルバックアップを取っております。

Page Top

インクリメンタルバックアップ anchor.png[8]

インクリメンタルバックアップとは、数回分のバックアップイメージを履歴として取っておくこと。おいちゃんの場合は、週1回バックアップを収集しています。それを3回分保存しているので、都合3週間分のバックアップを保存しているわけです。

でも容量3倍くっちゃうよねぇ??

というのが悩みの種。なのですが、UNIXの場合は、それを回避できる賢い方法があるのですわ。よくUNIXの場合リンクを用いますが、シンボリックリンクとハードリンクと言うものがあります。

シンボリックリンク
Windowsで言うショートカットみたいなもの。ln -sで作る。シンボリックリンクを張ると、どのファイルへのリンクか、という内容を記述したリンクファイルが新たにできます。なのでリンクを大量に作っていくと、容量が増えていきます。
ハードリンク
ただlnで作る。シンボリックが新たにリンクファイルを作るのに対し、ハードリンクはファイルを作らず、iノードを共有する。つまり同一のファイルが2重に見えるようになる。なので一切容量が増加しない。ln /foo/sample /var/sampleとすると、/fooにも/varにもsampleがあるのに、この2つは物理的に全く同じものと言うことになる。だが、/foo/sampleを消しても、/var/sampleは残るようになっているので、安心。/fooと/varのsampleを消して、初めてsampleが消える

これを使って、全く変更がないファイルはハードリンクし、変更があったファイルだけ実体をコピーするようにすれば、容量を極力使用しないで、複数世代のバックアップが管理できる、というわけ。

さて、稼動中の/以下のバックアップっていっても、単純にバックアップしてると、純粋なディスクイメージがコピーできないジャン?特にデバイスファイルなんかアクセスすると変なことが起きるよ?となりますよね。そこで、便利なコマンドがこれ!

# mount -o bind / /mnt/root

これを使うと、/ディレクトリを/mnt/rootに論理的に再マウントしてくれます。こーすると、/dev以下のデバイスファイルはただのファイルとしてしか見えないので、悪さしなくなります。さらに、ルートパーティションとデータパーティションを物理的に分けている場合は、ルートパーティション分だけしか見えないので、バックアップには非常に好都合なんですねぇ。

Page Top

で実際にバックアップ用のシェルを書いてみる anchor.png[9]

mount -o bind / /mnt/root
rm -rf /mnt/backup/backup2
mv /mnt/backup/backup1 /mnt/backup/backup2
mv /mnt/backup/backup0 /mnt/backup/backup1
rsync -a --delete --link-dest=/mnt/backup/backup1 /mnt/root/ /mnt/backup/backup0/

結構単純でしょ?/を/mnt/rootに再マウント。一番古いバックアップを消して、それぞれバックアップの世代を古くして、rsyncで新しいバックアップを取る。--link-dest=っていう新しいオプションが追加されていますが、backup1と比較して、変更がないファイルはハードリンクをする、というオプションですね。コピーよりもハードリンクのほうが処理も軽く、容量も食わないので便利です。

いやーこれで安心。玄箱も活用できるしね♪さらにDVDにバックアップ取れば、もう完璧。壊れたときの保険はかけておいて失敗はないですよ。まぢで。リスクマネージメントせねばね♪


Last-modified: 2009-08-19 (Wed) 00:47:44 (JST) (4126d) by maruo