![修改bindfs上符号链接的日期](https://linux22.com/image/46304/%E4%BF%AE%E6%94%B9bindfs%E4%B8%8A%E7%AC%A6%E5%8F%B7%E9%93%BE%E6%8E%A5%E7%9A%84%E6%97%A5%E6%9C%9F.png)
我感觉我无法修改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调用utimensat
与AT_SYMLINK_NOFOLLOW
标志来改变符号链接的时间。据我所知,问题是保险丝API没有utimens
(或utime
) 的相应标志,因此文件系统实现仅看到更改时间的请求,而没有指示是否遵循符号链接。由于缺乏任何特定指示,bindfs 和 sshfs 都以向后兼容的方式运行:它们修改符号链接的目标。对于损坏的符号链接,这会导致 ENOENT 错误。
乍一看,我以为这是FUSE的一个bug:因为FUSE无法通过AT_SYMLINK_NOFOLLOW
标志,因此它应该返回一个错误(EINVAL 或 ENOTSUP)。然而,从粗略的阅读来看Linux VFS 代码,看起来文件系统特定的代码是在符号链接或其目标上调用的,因此不应遵循任何符号链接。这是完全有道理的:符号链接的目标可能位于不同的文件系统上。
所以我认为这是bindfs和sshfs中的一个错误(可能在许多其他FUSE文件系统中):如果指示更改符号链接的元数据,它们应该只影响该符号链接,或者如果请求的更改不存在则返回错误可能的。