Bindfsのシンボリックリンク日付を修正

Bindfsのシンボリックリンク日付を修正

私は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を呼び出すutimensatAT_SYMLINK_NOFOLLOWシンボリックリンクのタイミングを変更するフラグがあります。私が知っている限り、問題はヒューズAPIutimens(または)に対応するフラグがないため、utimeファイルシステムの実装では時間を変更する要求のみが表示されますが、シンボリックリンクに従うかどうかは表示されません。特定の指示がない場合、binfsとsshfsはどちらも以前のバージョンと互換性のある方法で動作します。つまり、シンボリックリンクの宛先を変更します。壊れたシンボリックリンクの場合、ENOENTエラーが発生します。

一見するとFUSEのバグだと思いました。 FUSEはAT_SYMLINK_NOFOLLOWフラグを渡すことができないため、エラー(EINVALまたはENOTSUP)を返す必要があります。しかし、おおよそ読んでみるとLinux VFSコード、ファイルシステム固有のコードがシンボリックリンクまたはそのターゲットから呼び出されるように見えるため、シンボリックリンクをたどってはいけません。これは完全に理解されています。シンボリックリンクの宛先が別のファイルシステムに存在する可能性があります。

したがって、私はこれがbinfsとsshfs(そしておそらく他の多くのFUSEファイルシステム)のバグだと思います。シンボリックリンクのメタデータを変更するように指示された場合は、そのシンボリックリンクにのみ影響を与えるか、要求された変更が不可能な場合はエラーを返す必要があります。

おすすめ記事