Agregar información de corrección de errores al flujo de alquitrán canalizado

Agregar información de corrección de errores al flujo de alquitrán canalizado

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 como gzipo bzip2, pero agrega redundancia en lugar de eliminarla. redupeopera 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 redupeen 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:

  1. yo descarguéredupe-master.zip de GitHub, descomprimí y me coloqué en el recién creado redupe-master/.

  2. 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.

  3. autoreconf -ivf
    
  4. ./configure && make && sudo make install
    
  5. Pude comenzar redupe, pero la herramienta no pudo encontrarlo libredupe.so.0. Descubrí que las bibliotecas relevantes están en /usr/local/lib/. Con strace redupedescubrí que la herramienta verifica varias ubicaciones (por ejemplo /usr/lib/), pero no /usr/local/lib/. Moví todo lo relacionado redupecon /usr/local/lib/`/usr/lib/:

    sudo mv /usr/local/lib/libredupe.* /usr/lib/
    
  6. También descubrí que los archivos recién instalados son idénticos /usr/local/bin/redupey normales. /usr/local/bin/reundupeUn 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

  1. Canalicé 1 GiB desde /dev/urandomun archivo normal original.
  2. Continué originaly redupeguardé el resultado como original.rd.
  3. Continué original.rdpara tr ab xycambiar algunos bytes, guardé el resultado como modified.rd.
  4. Me aseguré original.rdy modified.rdson diferentes (uno puede usar cmpo md5sumtal). Es muy, muy poco probable que haya ningún ano ben 1 GiB de datos aleatorios, por lo que este paso no es realmente necesario.
  5. Continué modified.rdy reundupeguardé el resultado como result.
  6. Verifiqué (con cmp) si originaly resultson 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 redupeque 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

  • redupefunciona, 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 reundupecorregirlos, 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 aplicar reundupeme dio un archivo diferente sin ningún error reundupe. Realmente no sospecho que haya un error, por casualidad probablemente logré crear un archivo que parecía válido para reundupe. 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, redupefuncionará con un flujo estropeado y lo procesará diligentemente. Basura dentro basura fuera; reunduperecreará la secuencia original en mal estado. Si tu PC (o lo que sea)en realidadSi se estropea después redupe, lo más probable es que la herramienta tampoco le ayude porque solo maneja cambios de bits.

  • redupeFunciona 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 redupeentre gzipy aws, no antes gzip. Luego, mientras se recupera de la copia de seguridad, reundupeserá antes gunzip. Hacer esto al revés (es decir , redupeantes gzip, gunzipantes reundupe) es incorrecto porque:

    • (razón práctica) un pequeño giro hará que gunzipfalle (comprueba CRC) y los datos ni siquiera llegarán a reundupeser corregidos; pero incluso si pudieras hacer que gunzipcontinuara, 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+ reundupefunciona 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 no reundupe(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 redupees bueno para ti; y que --overheadquieres; y si el desempeño es aceptable.

información relacionada