SSHFS 挂载到 AWS Transfer for SFTP:无法创建常规文件

SSHFS 挂载到 AWS Transfer for SFTP:无法创建常规文件

我正在尝试通过 Amazon 的新服务 Transfer for SFTP 设置 SSHFS 挂载点。我可以使用 sftp 顺利进入端点sftp并获取/放置文件。

我可以使用 来挂载它sshfs。我遇到了复制和移动文件时出现错误的问题。每当我这样做时,它都会创建 0 字节文件。我使用rm删除它们没有问题。同样奇怪的是,如果我发出第二个cp命令,它会询问我是否要覆盖,然后文件就完美地存在了。

以下是一些带有 SSHFS 调试的示例。

请注意,我以 root 身份执行所有操作:

~$ sshfs -o workaround=all -o reconnect -o delay_connect -o sshfs_sync \
-o sync_readdir -o no_readahead -o debug -o noauto_cache \
-o cache=no [email protected]:/my-bucket /mnt/s3

FUSE library version: 2.9.7
nullpath_ok: 1
nopath: 1
utime_omit_ok: 0
unique: 1, opcode: INIT (26), nodeid: 0, insize: 56, pid: 0
INIT: 7.26
flags=0x001ffffb
max_readahead=0x00020000
   INIT: 7.19
   flags=0x00000011
   max_readahead=0x00020000
   max_write=0x00020000
   max_background=0
   congestion_threshold=0
   unique: 1, success, outsize: 40
unique: 2, opcode: ACCESS (34), nodeid: 1, insize: 48, pid: 2285
access / 04
   unique: 2, success, outsize: 16
unique: 3, opcode: LOOKUP (1), nodeid: 1, insize: 47, pid: 2285
LOOKUP /.Trash
getattr /.Trash
X11 forwarding request failed on channel 0
   unique: 3, error: -2 (No such file or directory), outsize: 16
unique: 4, opcode: LOOKUP (1), nodeid: 1, insize: 52, pid: 2285
LOOKUP /.Trash-1000
getattr /.Trash-1000
   unique: 4, error: -2 (No such file or directory), outsize: 16

这似乎确实成功安装。我可以ls快速得到回复。

如您所见,我已通过选项关闭了所有缓存和异步。我还启用了所有可能的解决方法。我尝试了这些选项的多种不同组合。

但当我尝试做cp任何事情时:

~$ cp temp.txt /mnt/s3
cp: cannot create regular file './temp.txt': No such file or directory

unique: 86, opcode: GETATTR (3), nodeid: 1, insize: 56, pid: 18222
getattr /
   unique: 86, success, outsize: 120
unique: 87, opcode: LOOKUP (1), nodeid: 1, insize: 49, pid: 18222
LOOKUP /temp.txt
getattr /temp.txt
   unique: 87, error: -2 (No such file or directory), outsize: 16
unique: 88, opcode: LOOKUP (1), nodeid: 1, insize: 49, pid: 18222
LOOKUP /temp.txt
getattr /temp.txt
   unique: 88, error: -2 (No such file or directory), outsize: 16
unique: 89, opcode: CREATE (35), nodeid: 1, insize: 65, pid: 18222
create flags: 0x80c1 /temp.txt 0100644 umask=0022
   unique: 89, error: -2 (No such file or directory), outsize: 166

奇怪的是,短暂的延迟之后它确实创建了一个 0 字节的文件:

~$ ls /mnt/s3
-rwxr--r-- 1 root root 0 Mar  7 12:19 temp.txt

如果我发出第二个,cp它将毫无问题地覆盖:

~$ cp temp.txt /mnt/s3
cp: overwrite './temp.txt'? y

unique: 65, opcode: GETATTR (3), nodeid: 1, insize: 56, pid: 18131
getattr /
   unique: 65, success, outsize: 120
unique: 66, opcode: LOOKUP (1), nodeid: 1, insize: 49, pid: 18131
LOOKUP /temp.txt
getattr /temp.txt
   NODEID: 6
   unique: 66, success, outsize: 144
unique: 67, opcode: LOOKUP (1), nodeid: 1, insize: 49, pid: 18131
LOOKUP /temp.txt
getattr /temp.txt
   NODEID: 6
   unique: 67, success, outsize: 144
unique: 68, opcode: OPEN (14), nodeid: 6, insize: 48, pid: 18131
open flags: 0x8001 /temp.txt
   open[139699381340688] flags: 0x8001 /temp.txt
   unique: 68, success, outsize: 32
unique: 69, opcode: SETATTR (4), nodeid: 6, insize: 128, pid: 18131
truncate /temp.txt 0
getattr /temp.txt
   unique: 69, success, outsize: 120
unique: 70, opcode: WRITE (16), nodeid: 6, insize: 539, pid: 18131
write[139699381340688] 459 bytes to 0 flags: 0x8001
   write[139699381340688] 459 bytes to 0
   unique: 70, success, outsize: 24
unique: 71, opcode: FLUSH (25), nodeid: 6, insize: 64, pid: 18131
flush[139699381340688]
   unique: 71, success, outsize: 16
unique: 72, opcode: RELEASE (18), nodeid: 6, insize: 64, pid: 0
release[139699381340688] flags: 0x8001
   unique: 72, success, outsize: 16

~$ ls /mnt/s3
-rwxr--r-- 1 root root 459 Mar  7 12:26 temp.txt

使用rm没有问题。工作如预期。

mv命令与 有同样的问题cp

我不想使用 s3fs,因为它不可靠,所以请不要提供解决方案。

答案1

不是要死机,但 s3ql 可以做你想做的事。提供一个完全正常的 POSIX 文件系统,您可以在其中安装它,并将其存储到 S3 对象存储中。重复数据删除、压缩选择(我使用 zlib 来提高速度),也可以对其进行加密。它使用缓存(默认 5GB)

它提供了一个非常普通的 POSIX 文件系统,我已经编译过它,运行过 VirtualBox 图像、wine 应用程序,以及 sshfs 和 rsync。我使用的是本地后端(将它指向一个目录,它会将对象存储在其中,最终会得到一个包含大量 10MB 或更小文件的目录树。)但当然,顾名思义,它主要用于 S3,并且还支持其他一些云对象存储系统。它使用缓存来存储当前正在使用的文件块(用于读取和写入),我认为默认为 5GB,对于我的使用,我将其设置为 50。(我用它来扩展我的存储空间,由于重复数据删除和压缩,我的 4TB 硬盘上有大约 6TB 的文件,还有大约 1TB 的可用空间。)

一个可能的缺点是,s3ql 是独占访问,您不能有多个实例指向同一个对象存储。不过,您可以将其安装在一个实例上,然后通过 sshfs 或 nfs 或其他方式共享。

相关内容