[0] WindowsベースのNFSにDovecotのMaildirをrsyncしようとしたら困った件。-[Id of Radiance ver.5]





■ WindowsベースのNFSにDovecotのMaildirをrsyncしようとしたら困った件。

 タイトル通り。
 ありがちなPostfix+Dovecot環境(Maildirベース)を構築。今回バックアップ用にWindows Storage ServerベースのNASを用意していたためNFS共有を作成しメールサーバからマウント。そこにrsyncをかけようと試みた
 が、試みたところいくつかのファイルでエラーが発生している。いくつかとゆーか結構な数のエラーが出ている。エラー内容は以下の通り。

 rsync: recv_generator: failed to stat [rsync先]: Input/output error (5)

 大したエラーではなさそうと思いつつもネットで調べると「ディスク不良じゃね」的な話が多い。しかし成功してるファイルもあるし、NASにもサーバにもこれといってディスク不良の兆候は見られない。
 エラーが出てるファイルをよく見る。すると各ユーザのMaildir/cur内にある=一度閲覧されたメールで、メールファイルの最後に「:2~」とか着いたファイルであることに気づく。

 最初はrsyncがコロン(:)に対応してないのかと思って調べたが(※rsyncもコマンドの中でのデリミタに使ってたので)どうもそーゆー話は見られない。
 しばらくしてはたと「…ああ、そういやWindows Storage Serverだっけな」とゆー事を思い出す。NFSマウントなんかしてたからつい「Windowsである」とゆー認識が抜けていた。そりゃWindowsだったらコロンの着いたファイルが作れないのは当然であるさ。

 さて困った。このままではシンプルなrsyncがうまくいかない。バックアップをとるだけなら1圧縮ファイルにまとめるあり文字列コンバートするなりの方法はあるけれど、できればrsyncでカタを付けたい。一度内部の別領域にrsyncかけてからtarとかもあるだろうけれども今後のメールサーバの利用状況次第ではバックアップ用の領域までまかなえるかどーか分からない。
 Dovecotの設定で上記デリミタをコロンから変更できないものかとかも調べたができなそう。rsync単体で何か上手くコンバートしながら渡す方法はないかと調べて見たがそれっぽい方法に当たらない。(※複数の処理を連動させたシェルでも作れれば可能かもしれないが…)

 もーこんなんWindowsのせいなんだからなんとかしてよ!と思いなんとなく「Windows Server NFS ファイル名置換」とかでググったところ、以下の情報に辿り着く。

   ファイル名の文字変換の概要
   ファイル名の文字変換を構成する

 要するに特定文字を変換して保存しようというもの。試しに上記のサンプルにある通りコロン(:)をハイフン(-)に変換するよう設定し、Linux側でコロンの付いたファイルを生成したところ無事保存に成功!Linuxからはちゃんとコロン付きのファイル名で見えつつWindows側ではハイフン付きのファイルとして保存されてる。これで勝つる!


 …わけにいかないのがWindowsのWindowsたる所以。最近とあるMSの中の人がアンチMSの人に対して「今は問題ないんだから和解しよーぜへらへら」(意訳)とかブログで言ったらしいが、ぶちゃけ現在進行形でMSの問題は積み上がってるちゅーねん。先日アップデートされたIE11でも早速問題起きてるっちゅーねん。対MSの戦闘は相手の殲滅しかありえないねぶちゃけ。
 まあそれは良いとして。上記の変換、フツーに考えればすぐ気づくことだが「じゃあ変換後の文字を最初から使ったらどーなるか」とゆー疑問が出る。こんなファイル名に関するものだったら単純な変換ではなくうまく切り分けてマッピングしてくれる…などと(無駄な)期待して試してみたのだが、例えば「test:test-.txt」というファイルを作成してls打ってみると「test:test:.txt」とゆーふーに、本来変換されて欲しくない明示的なハイフンまで変換されてるじゃないですか。
 とするとこの機能を使って対応しようとした場合、Linux側で使う予定のない文字を変換対象として割り当てるしか手がない。しかしながら「Linuxでファイル名に使えない文字」とゆーのはスラッシュ(/)とNULLコードの2つだけ。そんなんWindowsでも使えるわけない。
 また、せめてこのマッピングが有効になる範囲を限定できればなと思ったのだが、この設定は「NFSサーバ全体」に対して反映されるため、このNFSサーバを利用する全てのLinuxサーバが同様の影響を受ける。正直あちこちのファイルをバックアップしてるため「それら全てで使われることのない文字」なんてのを特定することはとても困難だし、将来的な確約ももちろん持てない。
 となると1文字→複数文字の置換ができればとも思うが、どうもこの機能だと1文字単位でのマッピングしかできないらしい。


 …とゆー感じで振り出しに戻ったところ。ただまあある程度ファイル名の規則性を注意してれば文字置換でなんとかできそうではあるのでその方向で検討中。どっちにしてもNFSなんて明らかにxNIX向けの機能提供するんだったらカンペキな対応しとけっての。WindowsなんだからCIFSでやれって意見は却下ねw


追記:
 1バイト文字→2バイト文字、あるいは2バイト→1バイトへの置換が可能な事を確認。半角コロン(:)を、少なくともLinuxシステムのファイル名には使わなさそうな全角文字に変換することで対応。

関連タグ:LinuxWindows
2014-02-28 [技術・作業]

関連記事: