私はbinfsのシンボリックリンクの日付を変更できないようです。以下で私が試したログをご覧ください。
EXT4から:
nailor@needle:~$ mkdir /tmp/ex
nailor@needle:~$ cd /tmp/ex
nailor@needle:/tmp/ex$ touch realfile
nailor@needle:/tmp/ex$ ln -s realfile linkfile
nailor@needle:/tmp/ex$ stat realfile linkfile
File: `realfile'
Size: 0 Blocks: 0 IO Block: 4096 regular empty file
Device: 801h/2049d Inode: 22678377 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 1000/ nailor) Gid: ( 1000/ nailor)
Access: 2013-09-09 00:46:15.356004837 +0200
Modify: 2013-09-09 00:46:15.356004837 +0200
Change: 2013-09-09 00:46:15.356004837 +0200
Birth: -
File: `linkfile' -> `realfile'
Size: 8 Blocks: 0 IO Block: 4096 symbolic link
Device: 801h/2049d Inode: 22678380 Links: 1
Access: (0777/lrwxrwxrwx) Uid: ( 1000/ nailor) Gid: ( 1000/ nailor)
Access: 2013-09-09 00:46:34.299766676 +0200
Modify: 2013-09-09 00:46:27.227855586 +0200
Change: 2013-09-09 00:46:27.227855586 +0200
Birth: -
nailor@needle:/tmp/ex$ touch -h realfile linkfile
nailor@needle:/tmp/ex$ stat realfile linkfile
File: `realfile'
Size: 0 Blocks: 0 IO Block: 4096 regular empty file
Device: 801h/2049d Inode: 22678377 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 1000/ nailor) Gid: ( 1000/ nailor)
Access: 2013-09-09 00:46:46.931607877 +0200
Modify: 2013-09-09 00:46:46.931607877 +0200
Change: 2013-09-09 00:46:46.931607877 +0200
Birth: -
File: `linkfile' -> `realfile'
Size: 8 Blocks: 0 IO Block: 4096 symbolic link
Device: 801h/2049d Inode: 22678380 Links: 1
Access: (0777/lrwxrwxrwx) Uid: ( 1000/ nailor) Gid: ( 1000/ nailor)
Access: 2013-09-09 00:46:49.899570563 +0200
Modify: 2013-09-09 00:46:46.931607877 +0200
Change: 2013-09-09 00:46:46.931607877 +0200
Birth: -
バインドプスから:
nailor@needle:/tmp/ex$ mkdir sub
nailor@needle:/tmp/ex$ bindfs -n . sub
nailor@needle:/tmp/ex$ cd sub
nailor@needle:/tmp/ex/sub$ touch -h realfile linkfile
nailor@needle:/tmp/ex/sub$ stat realfile linkfile
File: `realfile'
Size: 0 Blocks: 0 IO Block: 4096 regular empty file
Device: 17h/23d Inode: 2 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 1000/ nailor) Gid: ( 1000/ nailor)
Access: 2013-09-09 00:47:34.000000000 +0200
Modify: 2013-09-09 00:47:34.000000000 +0200
Change: 2013-09-09 00:47:34.755006803 +0200
Birth: -
File: `linkfile' -> `realfile'
Size: 8 Blocks: 0 IO Block: 4096 symbolic link
Device: 17h/23d Inode: 3 Links: 1
Access: (0777/lrwxrwxrwx) Uid: ( 1000/ nailor) Gid: ( 1000/ nailor)
Access: 2013-09-09 00:46:49.899570563 +0200
Modify: 2013-09-09 00:46:46.931607877 +0200
Change: 2013-09-09 00:46:46.931607877 +0200
Birth: -
ご覧のとおり、binfsのシンボリックリンク時間は変更されていません。これはrsyncなどに問題があります。なぜなら、これは次のような結果が得られるからです。
rsync: failed to set times on "link1": No such file or directory (2)
rsync: failed to set times on "link2": No such file or directory (2)
...
私はこれがsshfsの既知の問題であることがわかりました(http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=640038)しかし、binfsへの言及は見つかりませんでした。さて、欠けている機能についての言及や説明があるのか、それとも一般的にヒューズに影響を与えるのかという答えがあるのではないかと思います。
答え1
ファイルシステムがシンボリックリンクの日付を変更できないのが一般的です。これはそれ自体はbinfsやsshfsのバグではありません。
Rsyncはこの問題を解決するように設計されています。デフォルトのファイルシステムがそれをサポートしていない場合は、シンボリックリンクの時間やその他のメタデータ変更の失敗を無視します。
Linuxではrsyncを呼び出すutimensat
AT_SYMLINK_NOFOLLOW
シンボリックリンクのタイミングを変更するフラグがあります。私が知っている限り、問題はヒューズAPIutimens
(または)に対応するフラグがないため、utime
ファイルシステムの実装では時間を変更する要求のみが表示されますが、シンボリックリンクに従うかどうかは表示されません。特定の指示がない場合、binfsとsshfsはどちらも以前のバージョンと互換性のある方法で動作します。つまり、シンボリックリンクの宛先を変更します。壊れたシンボリックリンクの場合、ENOENTエラーが発生します。
一見するとFUSEのバグだと思いました。 FUSEはAT_SYMLINK_NOFOLLOW
フラグを渡すことができないため、エラー(EINVALまたはENOTSUP)を返す必要があります。しかし、おおよそ読んでみるとLinux VFSコード、ファイルシステム固有のコードがシンボリックリンクまたはそのターゲットから呼び出されるように見えるため、シンボリックリンクをたどってはいけません。これは完全に理解されています。シンボリックリンクの宛先が別のファイルシステムに存在する可能性があります。
したがって、私はこれがbinfsとsshfs(そしておそらく他の多くのFUSEファイルシステム)のバグだと思います。シンボリックリンクのメタデータを変更するように指示された場合は、そのシンボリックリンクにのみ影響を与えるか、要求された変更が不可能な場合はエラーを返す必要があります。
答え2
今このエラーは安定存在するファイルシステムバインディングバージョン1.12.3。
Gilesの答えはエラーを非常によく説明しています。