나는 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)를 반환해야 합니다. 그러나 대충 읽어보면리눅스 VFS 코드, 파일 시스템 특정 코드가 심볼릭 링크 또는 해당 대상에서 호출되는 것처럼 보이므로 심볼릭 링크를 따라가서는 안 됩니다. 이것은 완벽하게 이해됩니다. 심볼릭 링크의 대상이 다른 파일 시스템에 있을 수 있습니다.
따라서 나는 이것이 binfs 및 sshfs(그리고 아마도 다른 많은 FUSE 파일 시스템)의 버그라고 생각합니다. 심볼릭 링크의 메타데이터를 변경하라는 지시를 받으면 해당 심볼릭 링크에만 영향을 미치거나 요청한 변경이 가능하지 않은 경우 오류를 반환해야 합니다.
답변2
지금 이 오류는안정적인존재하다파일 시스템 바인딩버전 1.12.3.
Giles의 답변은 오류를 매우 잘 설명합니다.