rsync mkstemp 失败 Box.com 云的 davfs 挂载无效参数 (22)

rsync mkstemp 失败 Box.com 云的 davfs 挂载无效参数 (22)

我根据以下内容使用 davfs 安装了 Box.com 云存储这些说明。我将 Box.com 帐户安装在 /home/me/Cloud/Box 下

我可以通过 Dolphin 以及终端访问已安装的文件系统。它有点慢,但我可以列出(ls)并导航整个目录结构,没有错误。

接下来我尝试运行 rsync,如下所示:

rsync -auvz  --max-size=250M --exclude '.*' /home/me/Music/ /home/me/Cloud/Box/Music

我也尝试过:

rsync -auv  /home/me/Music/A /home/me/Cloud/Box/Music

以及 rsync 命令的其他变体。该命令通过 davfs 挂载将我的音乐从本地文件系统 (/home/me/Music/) 复制到 Box 云 (/home/me/Cloud/Box/Music)。

我总是收到很多这种形式的错误:

rsync: mkstemp <filename> failed: Invalid argument (22)

一个具体的例子是:

rsync: mkstemp "/home/me/Cloud/Box/Music/VariousArtists/.01_Track_1.mp3.YVmFI9" failed: Invalid argument (22)

这一切都发生在 Kubuntu 12.04 LTS 64 位服务器级硬件上,具有快速/可靠的电缆调制解调器连接(12 Mb/s 上传速度)。

答案1

1. 文件名中特殊字符的问题

文件名中是否有特殊字符?.例如,根据您将这些文件写入到的文件系统,它们可能不允许您在文件前添加点 ( ) 前缀。

2.rsync修改时间和webdav2的问题

我遇到了这个博客文章其中描述的问题是rsync在 webdav2 安装的 box.com 目录中写入/跟踪文件修改时间时出现问题。

问题在已安装的文件系统中显示如下:

david@sydney:~/Pictures$ ls -l /mnt/box/bwca/08/09/IMG_3084.CR2
-rw-r--r-- 1 david david 12564061 Aug 14 16:08 /mnt/box/bwca/08/09/IMG_3084.CR2
david@sydney:~/Pictures$ ls -l 2012/08/09/IMG_3084.CR2
-rw-rw-r-- 1 david david 12564061 Aug  9 13:00 2012/08/09/IMG_3084.CR2

同一篇文章显示了一种解决方法:

$ rsync -avhP --size-only --bwlimit=64 2012/08 /mnt/box/bwca/

这是一种不错的使用方法rsync,但它现在只是根据文件的大小而不是校验和来比较文件。

3. davfs2 (WebDAV) 的问题

我遇到了这个标题为:通过 davfs2 进行 rsync?在 Sourceforge 上的 WebDAV (davfs) 论坛中。有人询问类似的情况,他们想要使用 WebDAV 挂载在线存储提供商并通过 WebDAV 对挂载的存储执行 rsync。这就是其中之一WebDAV 的开发者 (Werner Baumann) 不得不说一下这个话题

维尔纳回应摘录

  • davfs2 只会上传完整的文件。它无法完成 rsync 通常所做的增量工作,这使得 rsync 非常高效。

  • davfs2 使用磁盘上的本地缓存。这将使其响应更快,您的应用程序也应该从中受益。但它需要本地磁盘空间。您应该允许较大的缓存大小,以便 rsync 可以使用本地缓存完成大部分工作,并且当 rsync 完成时,davfs2 将在后台上传大部分文件。

维尔纳继续提出以下建议

在这种情况下这可能是一个缺点。当 rsync 读取远程主机上的文件时,必须先由 davfs2 将其传输到本地缓存中(如果尚不存在)。这可能会使这个过程变得真正且不必要的缓慢。由于 rsync 在您的情况下仅用作复杂的复制程序,因此最好使用 cp 代替。 cp 有一个选项(-u),用于仅复制比 davfs2 文件系统(= smartdrive)中的文件更新的文件,并且不需要读取文件,而只读取文件元数据(如 mtime)。

像“cp -pru directory/to/backup dav/”这样的命令可能会完成这项工作。它不应该下载文件(就像 rsync 可能会做的那样,但我不确定)(请查看 cp 和 rsync 的手册)。

选项?

因此,正如 @Anthon 所建议的,您可以使用该cp -u方法来复制文件。意识到这种方法仅将文件大小作为比较因素,因此并不完全可靠。

在比较文件时,不应使用仅查看修改时间的任何内容cp -pru维尔纳在这个帖子中解释了原因:

关于 mod 时间问题的摘录

当您卸载 davfs2 文件系统并在稍后重新安装时,文件时间可能会根据服务器的时间信息发生变化。 cp -pu 和 rsync 等工具不能依赖这些时间来确定哪些文件已更改。

因此,考虑到有关修改时间的各种问题,使用纯粹校验和的方法似乎更合适:

$ rsync -avvz --omit-dir-times --checksum --human-readable --progress <local dir> <remote dir>

答案2

出现此问题的原因是使用rsyncbox.com 和/或 davfs 无法识别的文件名创建临时文件。因此该文件.01_Track_1.mp3.YVmFI9在您的系统上不存在,而是一个临时文件人工制品rsync。我的一些猜测:如果您没有在所有文件上收到错误,您可能只会在已上传(和更改)的文件上收到错误。

曾经是不可能的关闭此临时文件生成,但现在通过添加选项可能会更幸运--inplace。然而,如果您不与 rsync 守护进程(如果您使用 davfs 则不是)对话,那么使用 rsync 的优势对我来说并不清楚。

因此,作为替代方案,您可以尝试cp --update,它仅在源为时复制文件较新的比目的地。新文件和任何 ID3 标签发生更改的文件都将被复制,其他文件则不会。

或者,如果您需要更多控制,请使用find

cd /home/me/Music/
find * -size -250M -print0 | cpio -pdmv0 /home/me/Cloud/Box/Music

这会保留层次结构,并且cpio不会覆盖不旧的现有文件。

答案3

为了停止该Invalid argument (22)错误,我必须停止 rsync 在 davfs 目标上创建其临时文件。

rsync --temp-dir=/tmp

我认为发生的情况是 rsync 的临时文件名以 开头.,而 davfs 不允许这样做。所以我更进一步,告诉 rsync 忽略名称以..由于我使用的是--delete,我还告诉它不要尝试删除lost+founddavfs 目标中的目录。

rsync --temp-dir=/tmp --exclude lost+found --exclude '.*'

相关内容