修改bindfs上符号链接的日期

修改bindfs上符号链接的日期

我感觉我无法修改bindfs 上符号链接的日期。请参阅以下我尝试过的记录。

在 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: -

在bindfs上:

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: -

正如您所看到的,bindfs 上符号链接的时间没有改变。这是 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)但没有发现任何提到bindfs的内容。现在我想知道是否有任何这样的提及和/或解释缺少的功能和/或答案,如果这通常会影响保险丝......

答案1

无法更改符号链接日期的文件系统很常见。这本身并不是bindfs或sshfs的bug。

Rsync 就是为了解决这个问题而设计的。如果底层文件系统不支持,它会忽略更改符号链接的时间和其他元数据的失败。

Linux下,rsync调用utimensatAT_SYMLINK_NOFOLLOW标志来改变符号链接的时间。据我所知,问题是保险丝API没有utimens(或utime) 的相应标志,因此文件系统实现仅看到更改时间的请求,而没有指示是否遵循符号链接。由于缺乏任何特定指示,bindfs 和 sshfs 都以向后兼容的方式运行:它们修改符号链接的目标。对于损坏的符号链接,这会导致 ENOENT 错误。

乍一看,我以为这是FUSE的一个bug:因为FUSE无法通过AT_SYMLINK_NOFOLLOW标志,因此它应该返回一个错误(EINVAL 或 ENOTSUP)。然而,从粗略的阅读来看Linux VFS 代码,看起来文件系统特定的代码是在符号链接或其目标上调用的,因此不应遵循任何符号链接。这是完全有道理的:符号链接的目标可能位于不同的文件系统上。

所以我认为这是bindfs和sshfs中的一个错误(可能在许多其他FUSE文件系统中):如果指示更改符号链接的元数据,它们应该只影响该符号链接,或者如果请求的更改不存在则返回错误可能的。

答案2

这个错误现在固定的绑定文件系统版本 1.12.3。

吉尔斯的回答很好地解释了这个错误。

相关内容