HOME / コンピュータTips / UNIXツール / WebDAVサーバとwebdav-syncでrsyncするには!

Date: 2014/10/06 |  このエントリーをはてなブックマークに追加  |  Tags: rsync, webdav, webdav-sync

ファイル同期の定番、rsync

UNIX使いには毎度おなじみのrsync

rsyncはとても便利なツールで、2つのディレクトリをPermissionまであわせてコピーしたり、タイムスタンプでの比較、ファイルの増分での比較など、2つのディレクトリの同期コピーでは最強といえます。

さらにSSHと一緒に利用すると利便性はUp。SSHのログインさえできるサーバなら、2つのコンピュータのディレクトリを完全に同期させることができるのです。

それゆえ、UNIX使いにとって、最後の最後に頼れるバックアップツールはrsyncという、不動の地位を持っているのです。

WebDAVサーバに対してrsyncする

一番簡単な方法は、WebDAVボリュームをUNIXにマウントしてそこにrsyncする方法なのですが、この方法には大きな問題があります。

rsyncは、fstat(ファイルのステータス情報を調べるsyscall)を使って調査し、その上でファイルのコピーを決めるツールなのですが、このとき、大量のチェックを行います。

これをネットワーク的に離れたサーバのボリュームをマウントしたファイルシステムに対して行うと、たとえばMac OSXのWebDAVクライアントでは、1ファイル転送する度に平均20弱のHTTPコマンドを発効することになり、いつまで経っても終わらない、残念な状態になります。

確かに、rsyncはssh越しでもリモート側でもrsyncが立ち上がり、rsyncがローカルファイルシステムとして、fstatを発効するのです。

リモート専用のツールWebDAV-syncを使う

webdav-sync.png

そこでリモート同期には、やっぱりリモート同期に最適化した仕組みが欲しくなります。

実はWebDAVの場合、プロトコルにPROPFINDというコマンドがあり、このコマンドをつかうとディレクトリ単位でファイルの諸情報を教えてくれたり、ETagsを使ったファイルのシグネチャまで含めて調査できます。

これを使えば、理論上、ファイルの調査含めて、1ファイルあたりのファイル転送時のコマンド発行数が1〜2回となり、ネットワーク的に離れたリモートデータ転送に有利です。

ここではWebDAV-syncというjavaで作られた「コマンドラインツール」を使います。

マニュアルがあるので、すぐに使いこなせるとは思いますが、ここでは、1G無料、1Tでも年1万程度で使えるWebDAVサービスのTeraクラウドでの、利用方法を書いてみます。

下記はちなみにMac OSXの例ですが、SolarisでもLinuxでもJavaが動く環境であれば、何でも使えるはずです。

まずはローカルの~/Documents(書類フォルダ)を、TeraクラウドのDocumentsにコピーする方法です。バックアップ用ですね。

/path-to-inst/webdav_sync.jarは、適当なところにインストールして呼び出してくださいという意味です。ホスト名は、Teraクラウドのアカウント画面から調べてください。

java -jar /path-to-inst/webdav_sync.jar -up \
-u https://ユーザID:パスワード@ホスト名.teracloud.jp/dav/Documents/ \
-d ~/Documents/

起動時直後に、リモート側とローカル側のディレクトリ情報の照合を行うので、そこそこの時間がかかります。私のDocumentsは3分ぐらいかかりましたが、ローカルはSSDだったのでファイル量や、ディスク状況によって大分違うでしょう。

これをcronで回せば、ガンガンコピーしてもらえます。

ただコマンドラインにパスワードが乗るのはいささか気分が良くないので、ファイルにする方法もあります。これとて、ファイルは自分用のPermissionにしておかないと、同じように気分が悪いのですが(笑)まずは、このようなファイルを、ユーザディレクトリの直下に、webdav_sync.confという名前で適当に作っておき、(下記の日本語の文字は適当に貴方の環境に合わせて書き換えること)

<?xml version="1.0"?>
<config>
  <sync>
    <directory>/Users/あなたのユーザ名/Documents/</directory>
    <url>https://あなたのID:あなたのパスワード@ホスト名.teracloud.jp/dav/Documents/</url>
    <direction>up</direction>
    <acl xmlns="DAV:">
      <ace>
        <principal>
          <authenticated/>
        </principal>
        <grant>
          <privilege>
            <read/>
          </privilege>
        </grant>
      </ace>
    </acl>
    <exclude>^\.DS_Store$</exclude>
    <exclude>^\.DocumentRevisions-V100</exclude>
    <exclude>^\.TemporaryItems$</exclude>
    <exclude>^core$</exclude>
    <exclude>^.*\~$</exclude>
    <exclude>^\#</exclude>
    <exclude>^\.\#</exclude>
    <exclude>^\#.*\#$</exclude>
    <exclude>^\.Trashes$</exclude>
    <exclude>^\.csync</exclude>
    <hidden-folder-name>.Hidden</hidden-folder-name>
  </sync>
</config>

下記の様に実行します。

java -jar /path-to-inst/webdav_sync.jar -i 300 -c ~/webdav_sync.conf

-i 300は、300秒ごとに自動実行するという意味です。

<sync />ディレクティブの単位で、複数のジョブを設定できるので、これはリモートアップロード、これはダウンロード専用、これは双方向同期など、選ぶことができます。

javaなので、ファイルサーバなどに設定しておくこともできて便利ですよね。

これで、MacやSolarisやLinuxでも、ガンガン、Teraクラウドにバックアップができますね!

ちなみに・・・、Teraクラウドの容量は公式にも色んなところに書かれてるように、ZFSがファイルシステムとして実際に使っている容量での算出ですから、実際にはローカルのデータ占有率と異なります。この辺はこのブログを参照してるかたはわかりそうですが、比べてみるとZFSはディスク容量食いですね。

引数の抜粋

rsyncやcpと違って、ソースとディスティネーションの指定ではなく、ローカル、リモートの設定になります。

コマンドラインXML説明
-d<directory>dir</directory>ローカルのディレクトリ。アップロード元、或いはダウンロード先
-u<url>https://...</url>リモートのURL。ダウンロード元、或いはアップロード先
-down/-up/-bi<direction>down</direction>down:ダウンロード(-u → -d)
up:アップロード(-d → -u)
bi:双方向
※ダウンロード、アップロードの場合は、ファイルが更新されていたらアップデートしたり、なくなっていたら削除したりします。つまり、ソースと同じものにします。biは正直不明。ETagsを使って矛盾が起きないようにするそうですが・・・
-rename<rename/>アップロード先を削除するのではなく、.1,.2というサフィックスをつけて保存します。-biがついているときに向いているのかも
-rename-depth<rename-depth>10<rename-depth>リネームする時のサフィックスを何世代持つのか?
-hidden-folder<hidden-folder-name>.Hidden<hidden-folder-name>ローカルとリモートに、このプログラム用のファイルを保存するようです
-resetなし?最初から同期をやり直す
-iなし?常駐して指定した秒単位でもう一度同期を試みる
-e<exclude>filename pattern 1</exclude>除外ファイル、exclude
-r<recursive/>サーバがPROPFINDのDepth Infinityをサポートしていない場合でも再帰的にファイルを転送しようとします。Teraクラウドの場合はサーバ側がPROPFINDのDepth Infinityをサポートするため不要です。
-no-recursion<no-recursion/>サーバがPROPFINDのDepth Infinityに対応していても再帰しません

既知のバグっぽいもの

この場合、ファイル名に特殊キャラクタがあるときに起きるみたいです。僕は+と、%で発生しました。

be.re.io.IOException
	at be.re.webdav.cmd.Sync$ListenerAdapter.exception(Sync.java:4807)
	at be.re.webdav.cmd.Sync.put(Sync.java:2938)
	at be.re.webdav.cmd.Sync.exchange(Sync.java:949)
... 割愛

こちらの場合は、XMLでのdirectory directiveで、~/Documentsなど、変数展開しないと存在しないディレクトリを設定するとエラーが出ました。

java.lang.NullPointerException
       at be.re.webdav.cmd.Sync.getFiles(Sync.java:1330)
       at be.re.webdav.cmd.Sync.sync(Sync.java:3908)
       at be.re.webdav.cmd.Sync.run(Sync.java:3380)
       at be.re.webdav.cmd.Sync.sync(Sync.java:3990)
       at be.re.webdav.cmd.Sync.main(Sync.java:2343)

ソースコードが公開されているので、回避バグパッチも作ったのですが、いちいちビルドするよりは、回避策をとった方が多分楽だと思います。

オマケ:rsyncにはVPN越しのNFSが良いか、SSHが良いか?

VPNが貼られた環境でNFSマウントができる環境がしばしばあります。

このときNFSでマウントしているため、

  • NFSマウントしたディレクトリを直接rsyncした方が良いのか?
  • ssh経由コピーした方がいいのか?

という命題がたまにあります。

この記事の上の方を一通り読んだ方は、すぐに答えがわかると思います。

比べた方ならわかるのですが、最近のマシンだと暗号化コストが小さいため、RTTがそこそこある環境では、だいたいsshの方が有利です。

RTTがある環境では、NFSのfstatロスがそこそこにある為ですね。


コンピュータTips/UNIXツール

Recent Updates

openjdk(SPARC)

SPARC用のJAVA。 最近は新しいバージョンがSPARCでリリースされず、苦労している人も多いのですが、SPARC Solarisの界隈人達がビルドして代わりに使われているものです。 Solaris 11 SPARC jdk builds
»続きを読む

Solaris11のCPU(Critical Patch Unit)の当て方

コンピュータTips/Solaris/Solaris11のCPU(Critical Patch Unit)の当て方

Solaris 11.4には4つのリビジョンがあります。 2024年4月現在、Solaris自体の開発はメンテナンスフェーズになったわけでもなく、SRU毎に、最新機能がモリモリ入っていきます。 GA(Release 版) 一応、無償のOTNライセンスの利用も可能 いわゆる、リリース時点のバージョンのことですが、現在は 利用しません 。 以前は、1〜2年に1度の頻度でリリ …
»続きを読む

Emacs.appで書類(Documents)がアクセス出来ないとき

コンピュータTips/MacOSX/Emacs.appで書類(Documents)がアクセス出来ないとき

Catalina以降の権限問題なので、システム設定のセキュリティとポリシーの中にあるプライバシー内のFull Disk Accessに、Emacs.appと/usr/bin/rubyを入れればすむ。 /usrフォルダを、プライバシーの+から入れるのは、ちょっと面倒なので、あらかじめFinderのお気に入りの中に入れておくと良いでしょう。   rubyが入るのは、Emac …
»続きを読む

SONY WH-1000XM3

自分用メモです。 ノイズキャンセラーの性能が良い。 WH-1000Xのころは、ノイズキャンセラーを有効すると、音は聞こえないのに妙な音圧があったが、それがかなり軽減。個人的には気にならなくなった。 また、WH-1000Xのころは、ノイズキャンセラーを無効にしても、なんか作られたような音が出ていたような気がしたが、割と普通に聞こえる。 USB-Cになったのも良い。飛行機でも使う …
»続きを読む

Catalina(10.15)

Catalina Beta を入れ始めたので、自分用のまとめ。 2019/10/8、Catalinaが振ってきたので製品版用に記載を変えました。 32bitアプリを確認すること。 Activity Monitorで32bitアプリがわかるので、そういうアプリがあるなら代替品を見つけておくこと。 /etc以下のいくつかのファイルをバックアップしておくこと。 /etc …
»続きを読む

ディスクの不良を確認する(iostat -EnのError等)

ディスク関係のスタックをざっくり書くと次の様になっています 例、SAS Expanderを使う場合、 例、AHCIなどを使う場合、 これらのエラーは、次の様なコマンドで知ることができます。 出力結果例 このなかで、 たとえば、SATAディスクを利用している際に負荷が上がってしまい、ディスクの応答が間に合わないシチュエーションでは、Transport Errorが一気に …
»続きを読む

2017年、新年明けまして、おめでとうございます。

日記/2017年、新年明けまして、おめでとうございます。

新年明けまして、おめでとうございます。今年もよろしくお願いします。 昨年中は、皆様にお世話になりました。 昨年は、コツコツと3年程前から行ってきた改革がある程度完成された年で、この先5年、10年を見据えて、次のフェーズへと進む為の土台が完成した年でもありました。 それにキャッチアップする形で、個々の従業員一同が、役割を自覚し、明確に動けた年であったかと考えています。 …
»続きを読む

RSA鍵認証のみにし、Password認証を無効化する

意外に覚えきれなくて、いつも忘れるので、メモついでに残しておきます。 古いOpenSSHや、SunSSHの場合は、これも無効にします。 ユーザ目線でのザックリとした説明を。OpenSSHではなく別のSSH実装も含めて考えているので、OpenSSHのソースをじっくり読んだわけではないため、間違ってたらすみません。 まず、Password認証を無効にする場合、 PasswordAut …
»続きを読む

最新  |  << 前ページ  |  次ページ >>  |  最初