Hisashi Morita ([info]hisashim) wrote,
@ 2005-12-18 21:45:00
Previous Entry  Add to memories!  Tell a Friend!  Next Entry
[Unix][Administration][Backup] pdumpfs tools: pdumpfs-clean, pdumpfs-rsync
pdumpfs tools: pdumpfs-clean, pdumpfs-rsync
-------------------------------------------

pdumpfsをさらに便利にするツールを安井卓さんが公開されている。pdumpfsでバックアップしたディレクトリを適当に間引いて削減するpdumpfs-cleanと、リモートホストのファイルをpullバックアップするpdumpfs-rsync. どちらも便利なのでメモしておく。

残念なことに、現時点ではどちらもDebianパッケージになっていない。幸い1ファイルなので、CVS先端からもらってきて/usr/local/binあたりに置けば一応動く。

pdumpfs-clean: pdumpfs のバックアップを掃除するツール
http://tach.arege.net/software/pdumpfs-clean/

pdumfs-clean とは

高林さんが作られた pdumpfs のバックアップを 掃除します.pdumpfs では,基本的に毎日ディレクトリツリーの スナップショットをとっていくのですが,ハードリンクでとっていくとは いえ,とり続けるといずれはディスクが溢れてしまいます.pdumpfs-clean を使うことにより,不要なバックアップを削除することができます.

こんな感じで簡単に掃除できる。デフォルトでは、ここ1週間分および2年前までのファイルをそれなりに残してくれる。
  % sudo pdumpfs-clean /pdumpfs

ただし乱雑に使っているホストだと数時間かかるかもしれない。

pdumpfs-rsync: rsync を利用したリモート pdumpfs
http://tach.arege.net/software/pdumpfs-rsync/

pdumpfs-rsync とは

pdumpfs-rsync は,高林さんが作られた pdumpfs と rsync を組み合わせてリモートでディレクトリの差分コピーを行うツールです.pdumpfs 単体ではできない pull 型のコピーが可能になっています.

pdumpfs-rsync は,まず rsync を利用してリモートホストからディレクトリツリーを 取得します.そのあとで,日付のディレクトリに対してハードリンクを張って いきます.変更の有無はすべて rsync の処理に依存します.

pull型なので、リモートホストに他のホストの鍵などを置かなくていい(はず)。いわゆるレンタルサーバのバックアップをとるのに重宝している。

ただしpdumpfs-rsyncは自分の用途ではちょっとした問題点があった。
* pdumpfs-rsyncのssh接続にはport 22が決め打ちで使われるらしい
* pdumpfs-rsyncを同じ日付のうちに再度実行するとエラーが生じる

pdumpfs-rsyncはリモートホストへのssh接続に使うポートを22に固定しているらしい。任意のポートで接続するために、rsyncに--rshオプションが渡るように変更(kludge)を加えた。

(なお、rsyncの--portオプションはrsyncdへの接続時にしか使われないらしいのに気がつかず、時間を無駄にした。)
% diff -u =(curl 'http://cvs.arege.jp/*checkout*/pdumpfs-rsync/pdumpfs-rsync') /usr/local/bin/pdumpfs-rsync
--- /tmp/zshbV0hPj
+++ /usr/local/bin/pdumpfs-rsync
@@ -41,6 +41,7 @@
     ['--exclude-by-glob', '-w',
     GetoptLong::REQUIRED_ARGUMENT],
     ['--base',                         GetoptLong::REQUIRED_ARGUMENT],
     ['--force-hardlink', '-f',         GetoptLong::NO_ARGUMENT],
+    ['--rsh', GetoptLong::REQUIRED_ARGUMENT],
     ['--help', '-h',                   GetoptLong::NO_ARGUMENT],
     ['--version', '-v',
     GetoptLong::NO_ARGUMENT])
   parser.each_option do |name, arg|
@@ -59,6 +60,8 @@
       version
     when '--base'
       base = arg
+    when '--rsh'
+      rsync_options.push(name + '=' + arg)
     else
       options[name.sub(/^--/, "")] = arg
     end
%

こんな具合に使うと、example.org上のjdoeの権限で読めるファイルをバックアップできる模様。
  % sudo pdumpfs-rsync --rsh=/usr/bin/ssh\ -p\ 8022 --exclude='/tmp' \
    'jdoe@example.org:/' /var/backups/example.org

portを操作したいのに--rshオプション追加でごまかしているところに加え、コマンドラインで空白をエスケープしているところなど、我ながら汚らしくてめまいがする。でも目をそらして2分経てば忘れるから大丈夫。

またもうひとつの問題点は、pdumpfs-rsyncを実行した後、日が変わらないうちにもう一度動かした際にエラーが生じるということだ。バックアップ元のディレクトリをいくつかローカルに転送し終わったところで、次のようなエラーが出て止まる。
  /usr/bin/pdumpfs:1058:in `join': can't convert nil into String (TypeError)
          from /usr/bin/pdumpfs:1058:in `update_snapshot'
          from /usr/lib/ruby/1.8/find.rb:40:in `find'
          from /usr/lib/ruby/1.8/find.rb:38:in `find'
          from /usr/bin/pdumpfs:1053:in `update_snapshot'
          from /usr/local/bin/pdumpfs-rsync:150:in `main'
          from /usr/local/bin/pdumpfs-rsync:157

どうやらこういうことらしい。
* pdumpfs-rsyncのmainにあるlatestの値がnilになっている
* pdumpfsのlatest_snapshotがnilを返しているようだ
* pdumpfsのpast_date?が偽を返しているのではないか

とりあえず翌日になれば動くので、直るように念を送りつつ、見なかったことにする(ひどい)。



Create an Account
Forgot your login or password?
Login w/ OpenID
English • Español • Deutsch • Русский…