理系学生日記

おまえはいつまで学生気分なのか

Snow Leopard + Time Machine で エラー 45 が出る原因

我が家の NAS は LinkStation の LS-CHL なんですが、これ、Mac の Time Machine に対応しています。対応しているはずなんですが、Snow Leopard から Time Machine でマウントしようとすると、エラー 45 とか出てきてもうマジ意味わからんしバックアップとれない。
ASIN:B0027FJVPQ:detail
この NAS、半年以上前に買って、エラー 45 出てきて、あぁ後で調べよう後で調べよう、今日できることは明日できるし、明日できることは半年後でだってできる、そんなかんじで半年が経ちましたので、さしものぼくも重い腰を上げ、なんとかバックアップを完成させて快適な睡眠を得るために動きはじめたのです。

解決策

ググったらすぐわかるとおり、このエントリの方法でできる。

要するに、Time Machine で直接ディスクイメージを作るのではなく、予めローカルにディスクイメージを作っておいて、それを NAS に転送し、Time Machine で使うという方法です。plist も必要なようで、上記エントリではそのテンプレもダウンロードできてたようですが、ぼくはダウンロードできませんでした。
下記エントリで必要な plist の作成方法が説明されてるので、それも参考にすると良いです。

原因

確証は持てないのですが、hdiutil のマニュアルを読んでいたところ、気になる記述を発見。

OS X 10.6 removed support for attaching SPARSEBUNDLE images from network file servers that don't support F_FULLFSYNC.

Snow Leopard では、F_FULLSYNC をサポートしてない NAS 上の SPARSEBUNDLE イメージをサポートしなくなりました。F_FULLSYNC については、fsync のマニュアルに記載があります。

Does the same thing as fsync(2) then asks the drive to flush all buffered data to the permanent storage device (arg is ignored). This is currently implemented on HFS, MS-DOS (FAT), and Universal Disk Format (UDF) file systems. The operation may take quite a while to complete. Certain FireWire drives have also been known to ignore the request to flush their buffered data.

NAS で F_FULLFSYNC をサポートしているか確認するために、以下のようなコードを実行してみたところ、やはり、errno の値は 45 でした。というわけで、このあたりが原因なんじゃないですかね。

#include <stdio.h>
#include <fcntl.h>
#include <errno.h>

int main() {
  int fid = open( "/Volumes/backup/test.txt", O_CREAT );
  if( fid < 0 ) { perror("open"); }

  int retval = fcntl( fid, F_FULLFSYNC );
  if ( retval < 0 ) { perror("fcntl"); }

  printf( "errno: %d\n", errno );

  return retval;
}
% ./a.out
fcntl: Operation not supported
errno: 45

まー Operation not supported だったら基本 45 なんだけどな。