
Estoy usando Amazon S3 Glacier Deep Archive para almacenar copias de seguridad en mi máquina Ubuntu. Mi flujo de trabajo básicamente se reduce a:
tar cf - $FILES | gzip -3 --stdout | aws s3 cp - $TARGET
Creo que esto funciona bastante bien, pero con archivos muy grandes (más de 1 TB), me preocupa que si mi PC se estropea en alguna parte o se voltea un poco, todo el archivo quedará inutilizable. Lo ideal sería agregar alguna capacidad de corrección de errores a este flujo.
Miré PAR2, que parece hacer lo que quiero, con una advertencia: no puede tomar una tubería como entrada. Me requeriría crear todo el archivo en el disco,entoncesejecútelo a través de PAR2 y luego cárguelo todo. Con archivos de más de 1 TB, esto no siempre es factible en términos de espacio disponible en el disco, y mucho menos ralentiza considerablemente el proceso.
No pude encontrar ninguna herramienta similar para agregar información de corrección de errores hacia adelante a un flujo de datos sin guardarla primero en un archivo. ¿Cómo puedo hacer esto? Realmente no importa si una solución agrega la información a un archivo separado o modifica la secuencia para agregar redundancia.
Respuesta1
Herramienta:redupe
Encontré una herramienta para esto: redupe
. Lee sobre ello:Redupe: Corrección de errores hacia adelante.
Esta publicación presenta la
redupe
[…] herramienta para proporcionar corrección de errores hacia adelante en flujos de datos. […]redupe
, sigue el modelo de herramientas de compresión comogzip
obzip2
, pero agrega redundancia en lugar de eliminarla.redupe
opera sobre los datos directamente, transformándolos a su estado redundante agregando la información redundante en línea con los datos originales.
El comando complementario es reundupe
, en realidad es solo una herramienta y el nombre con el que la llames decide lo que hace.
Puedes obtenerredupe
de GitHub.
Logré compilar y probar redupe
en mi Debian 12. Consulte a continuación para obtener más detalles.
Compilacion
Nota: algunos de los problemas descritos aquí pueden haber ocurrido porque no tengo experiencia con la programación y la compilación, o tal vez porque no había configurado todo correctamente de antemano (o no lo había configurado en absoluto).
Mi sistema operativo es Debian 12. Esto es lo que hice:
yo descargué
redupe-master.zip
de GitHub, descomprimí y me coloqué en el recién creadoredupe-master/
.Mediante pruebas y errores descubrí que necesito los siguientes paquetes:
automake
,make
,gcc
,libpopt-dev
,libtool
*.sudo apt-get update sudo apt-get install automake make gcc libpopt-dev libtool
* Al menos estos paquetes son los que he probado y todos me parecieron importantes.
-
autoreconf -ivf
-
./configure && make && sudo make install
Pude comenzar
redupe
, pero la herramienta no pudo encontrarlolibredupe.so.0
. Descubrí que las bibliotecas relevantes están en/usr/local/lib/
. Constrace redupe
descubrí que la herramienta verifica varias ubicaciones (por ejemplo/usr/lib/
), pero no/usr/local/lib/
. Moví todo lo relacionadoredupe
con/usr/local/lib/
`/usr/lib/:sudo mv /usr/local/lib/libredupe.* /usr/lib/
También descubrí que los archivos recién instalados son idénticos
/usr/local/bin/redupe
y normales./usr/local/bin/reundupe
Un archivo normal es suficiente, el otro nombre puede ser un enlace simbólico:(cd /usr/local/bin/ && sudo rm reundupe && sudo ln -s redupe reundupe)
Mi prueba
- Canalicé 1 GiB desde
/dev/urandom
un archivo normaloriginal
. - Continué
original
yredupe
guardé el resultado comooriginal.rd
. - Continué
original.rd
paratr ab xy
cambiar algunos bytes, guardé el resultado comomodified.rd
. - Me aseguré
original.rd
ymodified.rd
son diferentes (uno puede usarcmp
omd5sum
tal). Es muy, muy poco probable que haya ningúna
nob
en 1 GiB de datos aleatorios, por lo que este paso no es realmente necesario. - Continué
modified.rd
yreundupe
guardé el resultado comoresult
. - Verifiqué (con
cmp
) sioriginal
yresult
son idénticos.
El procedimiento anterior utiliza varios archivos normales. Con un número reducido de archivos normales, el procedimiento se ve así:
</dev/urandom head -c 1G >original \
&& <original redupe | tr ab xy | reundupe | cmp - original
Exitoso cmp
(sin error, estado de salida 0) significa redupe
que funciona. Esto funciona para mi.
También probé sin tr
( … | redupe | reundupe | …
) para ver si todo está bien cuando no hay ningún daño. Es.
Conclusión, notas
redupe
funciona, pero no es una panacea. Sigue leyendo.Invocar
redupe --help
, tenga en cuenta la opción-o
/--overhead
.Si los datos están demasiado dañados para
reundupe
corregirlos, la herramienta imprimiráerror reading input
; un poco engañoso, tenga cuidado.Logré encontrar un archivo (relativamente pequeño) de datos aleatorios que después de aplicar
redupe -o 1
(redundancia débil), alterar (relativamente fuerte) y aplicarreundupe
me dio un archivo diferente sin ningún errorreundupe
. Realmente no sospecho que haya un error, por casualidad probablemente logré crear un archivo que parecía válido parareundupe
. Los cambios de bits ocasionales de OTOH se corrigieron bien.Si bien los cambios ocasionales de bits (y de bytes) se corrigieron correctamente, se corrigieron los bytes faltantes o excesivos en la secuencia.fatal. Parece que la herramienta no está diseñada para corregir este tipo de errores.
Escribiste "Me preocupa que mi PC se estropee en alguna parte". Si su PC se estropea antes
redupe
,redupe
funcionará con un flujo estropeado y lo procesará diligentemente. Basura dentro basura fuera;reundupe
recreará la secuencia original en mal estado. Si tu PC (o lo que sea)en realidadSi se estropea despuésredupe
, lo más probable es que la herramienta tampoco le ayude porque solo maneja cambios de bits.redupe
Funciona dentro de una tubería y esto es lo que querías. Pero esto también significa que tiene que procesar datos utilizando una ventana relativamente pequeña. Varios bytes corruptos cerca unos de otros serán peores que la misma cantidad de bytes corruptos esparcidos por todo un archivo grande.Quieres poner
redupe
entregzip
yaws
, no antesgzip
. Luego, mientras se recupera de la copia de seguridad,reundupe
será antesgunzip
. Hacer esto al revés (es decir ,redupe
antesgzip
,gunzip
antesreundupe
) es incorrecto porque:(razón práctica) un pequeño giro hará que
gunzip
falle (comprueba CRC) y los datos ni siquiera llegarán areundupe
ser corregidos; pero incluso si pudieras hacer quegunzip
continuara, hay otra razón; cual es…(razón teórica) la compresión funciona detectando patrones, similitudes, por lo que reduce la redundancia; no desea agregar redundancia y eliminarla de inmediato; Si desea reducir la redundancia de sus datos reales, luego agregue algo de redundancia deliberada yquédatelo.
Por ahora me parece
redupe
+reundupe
funciona adecuada y firmemente cuando no hay corrupción; puede reparar daños menores (bytes modificados). La corrupción que aparentemente "supera la redundancia" puede ser detectada o noreundupe
(en su caso, una corrupción no detectada probablemente fallarágunzip
). En otras palabras, la herramienta no corrompe los datos buenos y le brinda algunas posibilidades de recuperar datos buenos a partir de datos corruptos. En mi opinión, el valor neto de la herramienta es sin duda positivo.Realiza tus propias pruebas y decide si
redupe
es bueno para ti; y que--overhead
quieres; y si el desempeño es aceptable.