rsync mkstemp falló Argumento no válido (22) con el montaje davfs de la nube Box.com

10

Monté el almacenamiento en la nube Box.com usando davfs de acuerdo con estas instrucciones . Monté mi cuenta de Box.com en / home / me / Cloud / Box

Puedo acceder al sistema de archivos montado a través de Dolphin, así como a través de la terminal. Es un poco lento, pero puedo enumerar (ls) y navegar por toda la estructura del directorio sin errores.

Luego intenté ejecutar rsync de la siguiente manera:

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

También probé:

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

y otras variaciones de los comandos rsync. El comando está copiando mi Música de mi sistema de archivos local (/ home / me / Music /) a la nube de Box (/ home / me / Cloud / Box / Music) a través del soporte davfs.

Siempre recibo muchos errores de esta forma:

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

Un ejemplo específico es:

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

Todo esto sucede en Kubuntu 12.04 LTS 64 bit, hardware de nivel de servidor, con una conexión de módem de cable rápida / confiable (velocidades de carga de 12 Mb / s).

MountainX
fuente

Respuestas:

7

El problema ocurre debido a la rsynccreación de archivos temporales con nombres de archivo que box.com y / o davfs no entienden. Por lo tanto, el archivo .01_Track_1.mp3.YVmFI9no existe en su sistema, pero es un artefacto temporal de rsync. Algunas conjeturas de mi parte: si no obtiene el error en todos los archivos, probablemente solo obtenga los errores en los archivos que ya se cargaron (y cambiaron).

Se solía ser imposible de apagar esta generación de archivos temporales, pero es posible que hoy en día tienen más suerte mediante la adición de la opción --inplace. Sin embargo, las ventajas de usar rsync si no estás hablando con un rsync-daemon (que no lo estás si estás usando davfs) no me quedan claras.

Por lo tanto, como alternativa, puede intentarlo cp --update, que solo copia un archivo cuando el origen es más nuevo que el destino. Los nuevos archivos y cualquier archivo con cambios en las etiquetas ID3 se copiarán, otros no.

O si necesita tener más control de uso find:

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

Esto preserva la estructura jerárquica y cpiono sobrescribe los archivos existentes que no son más antiguos.

Anthon
fuente
1
Una razón para usar rsync es que ya sé cómo limitarlo a copiar archivos de menos de 250 MB y archivos o directorios que no están ocultos. Yo uso --max-size=250M --exclude '.*' . Estoy seguro de que cpse puede hacer esto ... ¿tal vez canalizando la salida de find en cp? Pero todavía no sé cómo hacerlo. Si encontramos una solución, lo intentaré cp -ru. Gracias
MountainX
En ese caso, no necesita cp -u en absoluto, use cpio (vea la respuesta actualizada)
Anthon
Gracias. Creo que esto lo resolverá por mí. Me educaste en el proceso, lo cual aprecio. (Para su información, en mi caso quiero archivos de menos de 250 MB, no más de.)
MountainX
Eso es lo que ... -size -250Mhace, de lo contrario usaría +250M(hubo una versión incorrecta aquí brevemente, pero me di cuenta antes de que se corrigiera la edición)
Anthon
3

1. Problemas con caracteres especiales en los nombres de archivo

¿Hay caracteres especiales en los nombres de archivo? Dependiendo del sistema de archivos en el que está escribiendo estos archivos, es posible que no le permitan prefijar archivos con un punto ( .), por ejemplo.

2. Problemas con los tiempos de modificación de rsync y webdav2

Me encontré con esta publicación de blog donde se describe rsyncun problema con un problema al escribir / rastrear los tiempos de modificación de archivos en los directorios de box.com montados en webdav2.

El problema aparece así en el sistema de archivos montado:

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

Ese mismo artículo mostró una solución alternativa:

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

Esta es una forma correcta de usar rsync, pero solo está comparando archivos en función de su tamaño ahora, no sus sumas de verificación.

3. Problemas con davfs2 (WebDAV)

Me encontré con este hilo titulado: rsync a través de davfs2? en el foro WebDAV (davfs) en sourceforge. Alguien estaba preguntando acerca de una situación similar en la que querían usar WebDAV para montar un proveedor de almacenamiento en línea y realizar rsync en el almacenamiento montado a través de WebDAV. Esto es lo que dijo uno de los desarrolladores (Werner Baumann) de WebDAV sobre este tema .

extracto de la respuesta de Werner

  • davfs2 solo cargará archivos completos. No puede hacer las cosas incrementales que normalmente hace rsync, y eso hace que rsync sea muy eficiente.

  • davfs2 usa un caché local en el disco. Esto lo hará más receptivo y su aplicación también debería beneficiarse de esto. Pero necesita espacio en disco local para esto. Debe permitir un gran tamaño de caché, de modo que rsync pueda hacer la mayor parte de su trabajo con el caché local, y davfs2 cargará la mayoría de los archivos en segundo plano, cuando rsync ya haya finalizado.

Werner continúa sugiriendo lo siguiente

Esto podría ser una desventaja en este caso. Cuando rsync lee un archivo en el host remoto, primero debe ser transferido por davfs2 al caché local (si aún no está allí). Esto podría hacer que el proceso sea realmente lento e innecesario. Como rsync solo funciona como un sofisticado programa de copia en su caso, podría ser mejor usar cp en su lugar. cp tiene una opción (-u) para copiar solo archivos que son más nuevos que los del sistema de archivos davfs2 (= unidad inteligente) y no necesitaría leer los archivos, sino que solo lee metadatos de archivos como mtime.

Un comando como "cp -pru directory / to / backup dav /" podría hacer el trabajo. No debe descargar archivos (como rsync podría hacerlo, pero no estoy seguro) (consulte los manuales de cp y rsync).

Opciones?

Entonces, como ha sugerido @Anthon, puede usar el cp -umétodo para copiar los archivos. Al darse cuenta de que este método solo analiza el tamaño de un archivo como un factor en comparación, por lo que no es completamente confiable.

Usted no debe usar cualquier cosa que sólo se basa en tiempos de modificación al comparar archivos, cp -pru. Werner explica por qué en este hilo :

extracto en cuestión con tiempos de modificación

Cuando desmonta un sistema de archivos davfs2 y lo monta nuevamente en algún momento posterior, los tiempos de archivo pueden haber cambiado de acuerdo con la información de tiempo del servidor. Herramientas como cp -pu y rsync no pueden confiar en estos tiempos para determinar qué archivos han cambiado.

Entonces, dados los diversos problemas que rodean los tiempos de modificación, un enfoque que utiliza sumas de comprobación puramente parece mejor:

$ rsync -avvz --omit-dir-times --checksum --human-readable --progress <local dir> <remote dir>
slm
fuente
Hola. No hay caracteres especiales en los nombres de archivo. Mi nombre de archivo en el disco es simplemente "01_Track_1.mp3". El prefijo de punto no forma parte del nombre de archivo normal ni la extensión adicional (por ejemplo, .mp3.YVmFI9). También tenga en cuenta que no todos los archivos fallan. Las fallas no parecen tener un patrón.
MountainX
¿Es esto suficiente información? got file_sum recv_files(Some_Music_[1999]/Some_Music_[1999]Zuni_SongVarious_Artists24.mp3) rsync: mkstemp "/home/me/Cloud/Box/Music/Some_Music_[1999]/.Some_Music_[1999]Zuni_SongVarious_Artists24.mp3.1aWWRY" failed: Invalid argument (22) got file_sum
MountainX
otro ejemplo:got file_sum recv_files(Carlos/Dance/05-Tapestry-Carlos.mp3) rsync: mkstemp "/home/me/Cloud/Box/Music/Carlos/Dance/.05-Tapestry-Carlos.mp3.WeGbGS" failed: Invalid argument (22) got file_sum recv_files(Carlos/Dance/06-Dance-Turquoise_Dance-Carlos.mp3)
MountainX
@MountainX: mira si mi actualización es tu problema. ¿También qué versión de rsyncestás usando? rsync --version.
slm
rsync version 3.0.9 protocol version 30y estoy probando tu solución actualizada ahora. ¡Gracias!
MountainX
3

Para detener el Invalid argument (22)error, tuve que evitar que rsync creara sus archivos temporales en el destino davfs.

rsync --temp-dir=/tmp

Creo que lo que sucede es que los nombres de los archivos temporales de rsync comienzan con .y davfs no permite esto. Así que fui más allá y le dije a rsync que ignorara los archivos fuente con nombres que comenzaran con .. Como estoy usando --delete, también le dije que no intentara eliminar el lost+founddirectorio en el destino davfs.

rsync --temp-dir=/tmp --exclude lost+found --exclude '.*'
Dzamo Norton
fuente
Encontré este problema en Cygwin y esta pregunta fue el principal éxito del motor de búsqueda. La respuesta aceptada no funcionó para mí, ya que estaba trabajando en una sincronización remota de archivos a través de Internet, por lo que usar rsync era obligatorio. La sugerencia --temp-dir en esta respuesta fue la solución para mí.
nickcrabtree