Всегда думал, что все эти gzip, bzip2, xz и т.п. обладают достаточной восстановимостью. Т.е. если в стриме испортится несколько байт, то декомпрессия пойдет дальше, начиная со следующего блока. Оказалось — шиш!
Провёл небольшую лабораторную работу.
Исходные данные: tar-архив с исходниками 1,3 МБ (1,300,480).
Методика: пакуем файл со стандартными параметрами, меняем 8 байт по смещению (last_offset / 2) на de-ad-be-ef-ff-ff-ff-ff
, пытаемся распаковать и/или восстановить архив.
Результаты:
- 7z — распаковано 47.9%, всё что дальше — не восстанавливается
- bzip2 — распаковано 0%, bzip2recover поделил файл на два якобы годных блока, но первый и больший из них распаковать не смог
- gzip — распаковано 45.8%, gzrecover дает тот же эффект
- lz4 — распаковано 81.76% (на самом деле 100%, но на выходе получился битый tar, который после
cpio -ivd -H tar < my.recovered.tar
дал указанное значение). Некоторые файлы, правда, с частичным мусором внутри. - lzip — распаковано 43.1% (спасибо
PtiCa, за указания по правильному использованию lziprecovery) - lzma — распаковано 0%, чем оно восстанавливается — хз
- lzop — распаковано 40.3%
- rar — распаковано 0%, после восстановления (rar r) файл всё равно поврежден
- rar -rr — распаковано 100% (задействовалась recovery record), после восстановления (rar r) у распакованного файла такая же sha1 как и у неиспорченного
- xz — распаковано 47.8%
- zip — распаковано 45.4%,
zip -F
или-FF
дают тот же результат.---
Ну и чо теперь делать? Паковать всё в .tar.rar?