Добавить информацию для исправления ошибок в передаваемый по конвейеру поток tar.

Я использую Amazon S3 Glacier Deep Archive для хранения резервных копий на своем компьютере с Ubuntu. Мой рабочий процесс в основном сводится к следующему:

      tar cf - $FILES | gzip -3 --stdout | aws s3 cp - $TARGET

Я думаю, что это работает довольно хорошо, но с очень большими архивами (1 ТБ+) я беспокоюсь, что если мой компьютер где-то сломается или немного перевернется, весь архив станет непригодным для использования. В идеале я хочу добавить в этот поток возможность исправления ошибок.

Я посмотрел на PAR2, который, похоже, делает то, что я хочу, с одной оговоркой: он не может принимать канал в качестве входных данных. Мне потребовалось бы собрать весь архив на диске, затем пропустить его через PAR2 и затем загрузить все. С архивами размером более 1 ТБ это не всегда осуществимо с точки зрения доступного дискового пространства, не говоря уже о том, что это существенно замедляет процесс.

Я не смог найти подобного инструмента для добавления информации для прямого исправления ошибок в поток данных без предварительного сохранения ее в файл. Как я могу это сделать? На самом деле не имеет значения, добавляет ли решение информацию в отдельный файл или изменяет поток для добавления избыточности.

1 ответ

Инструмент:

Я нашел инструмент для этого: . Об этом читайте: Redupe: Forward Error Correction.

В этом посте представлен инструмент […] для обеспечения прямого исправления ошибок в потоках данных. […] , создан по образцу таких инструментов сжатия, как илиbzip2, но добавляет избыточность, а не устраняет ее. работает с данными напрямую, преобразуя их в избыточное состояние, добавляя избыточную информацию в исходные данные.

Дополнительная команда — на самом деле это всего лишь один инструмент, и имя, которым вы его называете, определяет, что он делает.

Вы можете получить .

Мне удалось скомпилировать и протестировать его на своем Debian 12. Подробности см. ниже.


Сборник

Примечание: некоторые описанные здесь проблемы могли возникнуть из-за отсутствия у меня опыта программирования и компиляции или из-за того, что я не все настроил заранее (или вообще).

Моя ОС — Debian 12. Вот что я сделал:

  1. Я загрузилredupe-master.zip с GitHubиз GitHub , разархивировал и поместил себя в только что созданныйredupe-master/.

  2. Путем проб и ошибок я обнаружил, что мне нужны следующие пакеты:automake,make,gcc,libpopt-dev,libtool*.

            sudo apt-get update
    sudo apt-get install automake make gcc libpopt-dev libtool
    

    * По крайней мере, я пробовал эти пакеты, и все они показались мне важными.

  3.         autoreconf -ivf
    
  4.         ./configure && make && sudo make install
    
  5. Мне удалось запустить, но инструмент не смог найтиlibredupe.so.0. Я обнаружил, что соответствующие библиотеки находятся в формате . Сstrace redupeЯ обнаружил, что инструмент проверяет несколько мест (например,/usr/lib/) но нет . Я перенес все, что связано с/usr/local/lib/в `/usr/lib/:

            sudo mv /usr/local/lib/libredupe.* /usr/lib/
    
  6. Я также обнаружил, что недавно установленный/usr/local/bin/redupeи/usr/local/bin/reundupeявляются идентичными обычным файлам. Достаточно одного обычного файла, другое имя может быть символической ссылкой:

            (cd /usr/local/bin/ && sudo rm reundupe && sudo ln -s redupe reundupe)
    

Мой тест

  1. Я передал 1 ГиБ из/dev/urandomв обычный файл.
  2. Я пропустил и сохранил результат как .
  3. я прошёл черезtr ab xyчтобы изменить несколько байтов, сохранил результат как .
  4. я убедилсяoriginal.rdи различны (можно использовать илиmd5sumили типа того). Очень, очень маловероятно, что нетaи нетbв 1 ГиБ случайных данных, поэтому этот шаг на самом деле не нужен.
  5. я трубилmodified.rdи сохранил результат как .
  6. Я проверил (с помощью ), еслиoriginalиresultидентичны.

Описанная выше процедура использует несколько обычных файлов. С уменьшенным количеством обычных файлов процедура выглядит так:

      </dev/urandom head -c 1G >original \
&& <original redupe | tr ab xy | reundupe | cmp - original

Успешныйcmp(нет ошибок, статус выхода 0) означает, что работает. Меня устраивает.

я тоже проверял безtr(… | redupe | reundupe | …), чтобы увидеть, все ли в порядке, когда коррупции вообще нет. Это.


Заключение, примечания

  • работает, но это не панацея. Продолжай читать.

  • Вызовredupe --help, Обратите внимание-o/ вариант.

  • Если данные слишком повреждены, чтобы их можно было исправить, инструмент напечатаетerror reading input; немного вводит в заблуждение, будьте осторожны.

  • Мне удалось найти (относительно небольшой) файл случайных данных, который после примененияredupe -o 1(слабая избыточность), изменение (относительно сильное) и применение дали мне другой файл без каких-либо ошибок из . На самом деле я не подозреваю ошибку, вероятно, мне случайно удалось создать файл, который оказался действительным для . Случайные перевороты битов OTOH были исправлены нормально.

  • Хотя случайные перевороты битов (и перевороты байтов) исправлялись нормально, недостающие или чрезмерные байты в потоке были фатальными . Похоже, этот инструмент не предназначен для исправления подобных ошибок.

  • Вы написали: «Я беспокоюсь, что мой компьютер где-нибудь выйдет из строя». Если ваш компьютер выйдет из строя раньше, он будет работать с испорченным потоком и добросовестно его обрабатывать. Мусор на входе, мусор на выходе; воссоздаст исходный испорченный поток. Если после этого ваш компьютер (или что-то еще) действительно выйдет из строя, то, скорее всего, этот инструмент вам тоже не поможет, потому что он обрабатывает только перевороты битов.

  • работает внутри трубы, и это то, что вы хотели. Но это также означает, что ему приходится обрабатывать данные в относительно небольшом окне. Несколько поврежденных байтов, расположенных близко друг к другу, будут хуже, чем такое же количество поврежденных байтов, разбросанных по всему большому файлу.

  • Вы хотите поставить между иaws, не раньше, чем . Тогда при извлечении из резервной копии будет раньше . Делаем это наоборот (т.е. передgzip, before ) ошибочен, потому что:

    • (практическая причина) битовый переворот приведет к сбою ( он проверяет CRC), и данные даже не будут исправлены; но даже если бы вы могли продолжить, есть еще одна причина; который…

    • (теоретическая причина) сжатие работает путем обнаружения закономерностей и сходств, поэтому уменьшает избыточность; вы не хотите добавлять избыточность и сразу ее удаляете; вы хотите уменьшить избыточность ваших фактических данных, затем добавьте некоторую преднамеренную избыточность и сохраните ее .

  • Пока мне кажется + исправно и прочно работает, когда нет коррупции; он может исправить незначительные повреждения (измененные байты). Коррупция, которая явно «превышает избыточность», может или не может быть обнаруженаreundupe(в вашем случае необнаруженная коррупция, вероятно, приведет кgunzipхотя неудачно). Другими словами, инструмент не повреждает хорошие данные и дает вам некоторые шансы восстановить хорошие данные из поврежденных. На мой взгляд, чистая стоимость инструмента, безусловно, положительна.

  • Проведите собственные тесты и решите,redupeэто хорошо для тебя; и что--overheadвы хотите; и приемлемо ли исполнение.

Другие вопросы по тегам