rsync mkstemp 失败 Invalid argument (22) with davfs mount of Box.com cloud

Mou*_*inX 14 ubuntu rsync dropbox cloud davfs2

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

我可以通过 Dolphin 和终端访问挂载的文件系统。它有点慢,但我可以列出 (ls) 并在没有错误的情况下浏览整个目录结构。

接下来,我尝试按如下方式运行 rsync:

rsync -auvz  --max-size=250M --exclude '.*' /home/me/Music/ /home/me/Cloud/Box/Music
Run Code Online (Sandbox Code Playgroud)

我也试过:

rsync -auv  /home/me/Music/A /home/me/Cloud/Box/Music
Run Code Online (Sandbox Code Playgroud)

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

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

rsync: mkstemp <filename> failed: Invalid argument (22)
Run Code Online (Sandbox Code Playgroud)

一个具体的例子是:

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

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

Ant*_*hon 8

出现此问题是因为rsync使用 box.com 和/或 davfs 不理解的文件名制作临时文件。因此,文件.01_Track_1.mp3.YVmFI9没有您的系统上存在,但是是暂时的假象rsync。我的一些猜测:如果您没有在所有文件上收到错误,您可能只会在已经上传(和更改)的文件上收到错误。

曾经是不可能关掉这个临时文件生成,但你可以通过添加选项现在有更多的运气--inplace。但是,如果您不与 rsync-daemon 交谈(如果您使用 davfs 则不是),使用 rsync 的优势我不清楚。

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

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

cd /home/me/Music/
find * -size -250M -print0 | cpio -pdmv0 /home/me/Cloud/Box/Music
Run Code Online (Sandbox Code Playgroud)

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


slm*_*slm 6

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
Run Code Online (Sandbox Code Playgroud)

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

$ rsync -avhP --size-only --bwlimit=64 2012/08 /mnt/box/bwca/
Run Code Online (Sandbox Code Playgroud)

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

3. davfs2 (WebDAV) 的问题

我遇到了这个主题为:rsync via davfs2?在 sourceforge 上的 WebDAV (davfs) 论坛中。有人询问了类似的情况,他们想使用 WebDAV 挂载在线存储提供程序并通过 WebDAV 对挂载的存储执行 rsync。这是WebDAV 的一位开发人员 (Werner Baumann) 对这个话题所说的话

沃纳的回应摘录

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

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

Werner 继续提出以下建议

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

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

选项?

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

在比较文件时,您不应该使用任何只查看修改时间的东西,cp -pru. Werner 在此线程中解释了原因

关于模组时间问题的摘录

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

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

$ rsync -avvz --omit-dir-times --checksum --human-readable --progress <local dir> <remote dir>
Run Code Online (Sandbox Code Playgroud)


Dza*_*ton 5

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

rsync --temp-dir=/tmp
Run Code Online (Sandbox Code Playgroud)

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

rsync --temp-dir=/tmp --exclude lost+found --exclude '.*'
Run Code Online (Sandbox Code Playgroud)