Uso Linux la mayor parte del tiempo pero en ocasiones tengo que arrancar una máquina virtual con Windows para poder realizar algunas tareas.
Ya saben como es esto, empiezas con un disco duro de 10 GB, que luego resulta que no es suficiente. Aumentas el tamaño a 20 GB y para no hacer el cuento largo, actualmente uno de los discos duros virtuales es de 30 GB.
Todas las semanas hago una copia simple de los archivos .vdi a manera de respaldo con rsync, y todo estaba funcionado perfectamente hasta que me empezaron a salir una serie de errores.
Después de hacer el último ajuste de tamaño empecé a ver un problema al copiar los archivos con rsync del tipo File exists (17).
sent 134,815,726 bytes received 6,719 bytes 1,057,430.94 bytes/sec
total size is 126,432,193,215 speedup is 937.77
sending incremental file list
10GB.vdi
10,716,446,720 100% 11.16MB/s 0:15:15 (xfr#1, to-chk=15/18)
Windows 7 Ultimate.vdi
32,138,960,896 100% 11.40MB/s 0:44:49 (xfr#2, to-chk=6/18)
rsync: [receiver] rename "/respaldos/virtualbox/.10GB.vdi.G0Vx0b" -> "10GB.vdi": File exists (17)
rsync: [receiver] rename "/respaldos/virtualbox/.Windows 7 Ultimate.vdi.tdPBjd" -> "Windows 7 Ultimate.vdi": File exists (17)
sent 42,865,871,109 bytes received 350 bytes 11,659,423.76 bytes/sec
total size is 192,383,238,656 speedup is 4.49
rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1287) [sender=3.2.2]
Buscando una solución
Me tomó un poco en encontrar una solución, primero por la falta de tiempo ocupado en otras tareas y segundo porque hacer una prueba se lleva su tiempo, en mi caso no es raro que se tarde más de 45 minutos en completar el respaldo.
Intenté varias opciones con poco éxito. Intenté este consejo rsync fails if it cannot stat destination file.
Esto se debe a la utilización de un directorio temporal en un sistema de archivos diferente al del archivo de destino. En este caso, rsync intenta renombrar el archivo terminado en su lugar, pero si no puede, lo copia en su lugar y luego debe terminar de actualizar los permisos, la propiedad, etc. después de la copia. Si el archivo desaparece durante esta actualización, rsync se quejará de ello.
Básicamente recomienda agregar el parámetro –temp-dir para que apunte a una carpeta en el mismo disco duro que sirve como destino de los archivos.
La instrucción quedaría más o menos así:
rsync -avuP --temp-dir=/respaldos/tmp /home/usuario/virtualbox/ /respaldos/virtualbox/
Pero no funcionó, parece que justo al finalizar la copia ocurre el error. Simplemente no puede renombrar el archivo temporal a el archivo final, por eso tuve que buscar otra opción.
Las opciones inplace y whole-file
La solución que mejor me ha funcionado es combinar los parámetros inplace y whole-file. Que ví aquí: Rsync without creating hidden file in destination.
inplace evita la creación de un archivo temporal, trabaja directamente con el archivo de destino. De esa forma evito ese problema al final de la copia durante la transición de archivo temporal a archivo definitivo.
whole-file copia todo el archivo, lo vi en un consejo sobre copias de archivos grandes. Sospecho que todo mi problema tiene algo que ver con Error al unir el archivo, un problema al copiar archivos grandes a una USB. Error que todavía me ocurre pero tengo una esperanza de solución con el kernel 5.8.
Dicho esto, la instrucción quedaría más o menos así:
rsync -avuPW --inplace /home/usuario/virtualbox/ /respaldos/virtualbox/
Con este ajuste parece que todo ha vuelto a la normalidad y el error File exists (17) ha desaparecido.
De todos modos estaré al pendiente de los resultados del script de respaldos por si aparece este u otros errores.
¡Hasta la próxima!