![rsync mkstemp 失败 Box.com 云的 davfs 挂载无效参数 (22)](https://linux22.com/image/32879/rsync%20mkstemp%20%E5%A4%B1%E8%B4%A5%20Box.com%20%E4%BA%91%E7%9A%84%20davfs%20%E6%8C%82%E8%BD%BD%E6%97%A0%E6%95%88%E5%8F%82%E6%95%B0%20(22).png)
我根据以下内容使用 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
出现此问题的原因是使用rsync
box.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+found
davfs 目标中的目录。
rsync --temp-dir=/tmp --exclude lost+found --exclude '.*'