LINUX.ORG.RU

Как решить проблему с битым zip*ом?


0

2

Сейчас докачал один нужный архив и оказалось что он по пути побился.
Качался архив порядка 4х дней, с кучей рестартов (инет падал), качался обычным wget*ом на мой сервак (centos).

Сейчас мне надо удостовериться в его целостности и перепаковать (зачем было паковать в зип я не знаю).
Я уже нашел «правильный» zip который умеет распаковывать большие архивы на x86_x64.
Но тут случилось неожиданное:

[ad@torrent ex]# unzip server.vdi.zip
error:  Zip file too big (greater than 4294959102 bytes)
Archive:  server.vdi.zip
warning [server.vdi.zip]:  8589934592 extra bytes at beginning or within zipfile
  (attempting to process anyway)
retry - request = 0x8589934592
error [server.vdi.zip]:  attempt to seek before beginning of zipfile
  (please check that you have transferred or created the zipfile in the
  appropriate BINARY mode and that you have compiled UnZip properly)
  (attempting to re-compensate)
replace server.vdi? [y]es, [n]o, [A]ll, [N]one, [r]ename: y
  inflating: server.vdi
  error:  invalid compressed data to inflate
 bad CRC 0796aee8  (should be b1ebe84a)
file #2:  bad zipfile offset (local header sig):  1009485668
  (attempting to re-compensate)
retry - request = 0x9599420315
error [server.vdi.zip]:  attempt to seek before beginning of zipfile
  (please check that you have transferred or created the zipfile in the
  appropriate BINARY mode and that you have compiled UnZip properly)
Если я правильно понимаю, то где то в районе 1009485668 не совпадает проверочная сумма.
Перекачивать его снова я просто умру, поэтому нужен какой то быстрый способ перекачать только битый кусок.
На другом конце к сожалению находятся люди, которым сложно было объяснить даже про архиватор, поэтому мне желательно это сделать без их прелестного участия.

1 - Можно ли как то распаковать архив с игнорированием битых кусков?
2 - Чем можно быстро скачать кусочек из архива (с побайтовым указанием откуда и докуда)?
3 - Чем можно наложить скачанный кусок на этот 9 гиговый блоб?

★★★

1 - Можно ли как то распаковать архив с игнорированием битых кусков?

сжатый файл? только до первого сбоя.

2 - Чем можно быстро скачать кусочек из архива (с побайтовым указанием откуда и докуда)?

man curl

-C/--continue-at <offset> Continue/Resume a previous file transfer at the given offset. The given offset is the exact number of bytes that will be skipped, counting from the beginning of the source file before it is transferred to the destination. If used with uploads, the FTP server command SIZE will not be used by curl.

Use "-C -" to tell curl to automatically find out where/how to resume the transfer. It then uses the given output/input files to figure that out.

If this option is used several times, the last one will be used.

размер вроде тоже как-то задаётся. А можно просто прервать CTRL+C. Хотя сервер такого может и не понять...

3 - Чем можно наложить скачанный кусок на этот 9 гиговый блоб?

man head, man tail

вырезаете нужные кусочки, а потом их склеиваете командой cat. Такое вот макраме...

drBatty ★★
()
Ответ на: комментарий от drBatty

Ну размер у него правильный, поэтому я сомневаюсь, что побилось много чего.

вырезаете нужные кусочки

Тут тоже интересный вопрос, по какому именно куску высчитывается CRC, т.е по куску какого размера.

winddos ★★★
() автор топика
Ответ на: комментарий от winddos

Ну размер у него правильный, поэтому я сомневаюсь, что побилось много чего.

ну во первых обновите unzip, ваша версия не умеет извлекать большие файлы. Умеет она начиная с 4.6.

Ну а потом копайте исходники, в поисках формата. ЕМНИП там он очень простой.

drBatty ★★
()
Ответ на: комментарий от drBatty

info zip

A companion program (unzip(1L)) unpacks zip archives. The zip and unzip(1L) programs can work with archives produced by PKZIP (supporting most PKZIP features up to PKZIP version 4.6), and PKZIP and PKUNZIP can work with archives produced by zip (with some exceptions, notably streamed archives, but recent changes in the zip file standard may facilitate better compatibility). zip version 3.0 is compatible with PKZIP 2.04 and also supports the Zip64 extensions of PKZIP 4.5 which allow archives as well as files to exceed the previous 2 GB limit (4 GB in some cases). zip also now supports bzip2 compression if the bzip2 library is included when zip is compiled. Note that PKUNZIP 1.10 can- not extract files produced by PKZIP 2.04 or zip 3.0. You must use PKUN- ZIP 2.04g or unzip 5.0p1 (or later versions) to extract them.

See the EXAMPLES section at the bottom of this page for examples of some typical uses of zip.

Large Archives and Zip64. zip automatically uses the Zip64 extensions when files larger than 4 GB are added to an archive, an archive con- taining Zip64 entries is updated (if the resulting archive still needs Zip64), the size of the archive will exceed 4 GB, or when the number of entries in the archive will exceed about 64K. Zip64 is also used for archives streamed from standard input as the size of such archives are not known in advance, but the option -fz- can be used to force zip to create PKZIP 2 compatible archives (as long as Zip64 extensions are not needed). You must use a PKZIP 4.5 compatible unzip, such as unzip 6.0 or later, to extract files using the Zip64 extensions.

drBatty ★★
()
Ответ на: комментарий от drBatty

Я обновил его, а вот лог не оттуда запостил.
Сейчас вот эта версия стоит:
UnZip 6.00 of 20 April 2009, by Info-ZIP. Maintained by C. Spieler. Send

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

winddos ★★★
() автор топика
Ответ на: комментарий от YAR

У меня интернет совершенно нормальный, да и я вообще сервером качаю. А вот на другой стороне с интернетом очень и очень плохо.

Вообще я уже перепроверил md5 архива (еле объяснил), получил я все совершенно правильно, а вот архив у меня не открывается.

7za l -slt:

Listing archive: server.vdi.zip

----
Path = server.vdi.zip
Type = Zip

----------
Path = server.vdi
Folder = -
Size = 2604745216
Packed Size = 1009485593
Modified = 2011-12-01 12:19:54
Created = 
Accessed = 
Attributes = .....
Encrypted = -
Comment = 
CRC = B1EBE84A
Method = Deflate
Host OS = Unix

Path = __MACOSX
Folder = +
Size = 0
Packed Size = 0
Modified = 2011-12-01 07:16:28
Created = 
Accessed = 
Attributes = D....
Encrypted = -
Comment = 
CRC = 
Method = Store
Host OS = Unix

Path = __MACOSX/._server.vdi
Folder = -
Size = 82
Packed Size = 40
Modified = 2011-12-01 12:19:54
Created = 
Accessed = 
Attributes = .....
Encrypted = -
Comment = 
CRC = 9B997259
Method = Deflate
Host OS = Unix

Т.е 7z думает что в архиве и должно быть 2.6 гб, и все, при этом crc не совпадает.
Уже несколько часов мучаюсь, и не могу понять, почему на зондо-ос получился такой странный архив.

winddos ★★★
() автор топика
Ответ на: комментарий от winddos

Размер архива, если что: 9599420683
Размер исходного файла 20 гигабайт.

winddos ★★★
() автор топика
Ответ на: комментарий от winddos

Пока есть только одна идея: попробовать руками поправить хедеры и по идее он ведь будет вынужден дальше идти распаковывать.. хм.

winddos ★★★
() автор топика
Ответ на: комментарий от winddos

Т.е 7z думает что в архиве и должно быть 2.6 гб, и все, при этом crc не совпадает.

Уже несколько часов мучаюсь, и не могу понять, почему на зондо-ос получился такой странный архив.

в чём странность-то? Я не пойму, вы правильно скачали, и вам не открыть? Или?

drBatty ★★
()

md5 совпали, но архив битый? забавно.

sha512sum совпадают?

Файл можно порезать с помощью split(1) у тебя локально и на удалённой машине, ну и сраввнить хэши кусков.

Rzhepish
()
Ответ на: комментарий от Rzhepish

Архив не битый, он просто не правильно созданный (по идее).
У него в хедере размер меньше, чем должен быть на самом деле.

winddos ★★★
() автор топика
Ответ на: комментарий от drBatty

Size = 2604745216 - 2.6 гб
Packed Size = 1009485593 - 1 гб
А размер server.vdi должен быть 9гб, т.е его Packed Size должно быть более чем 9599420000

winddos ★★★
() автор топика
Ответ на: комментарий от Rzhepish

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

winddos ★★★
() автор топика
Ответ на: комментарий от record

.exe

Ну ты понел... хотя наверное для этого и есть вайн, придется установить.
Я уже находил такой файлик, но увы не обнаружив сорцов отбросил этот вариант.

winddos ★★★
() автор топика
Ответ на: комментарий от record

Ну в данный момент она гордо написала «Salvage in Progress» и пошла копаться в файлах находящихся на образе диска (а не в самом архиве). :(

winddos ★★★
() автор топика
Ответ на: комментарий от winddos

А пока я думаю как поправить хидеры

скорее всего ничего не получится... Если действительно образ снят при рабочей VM. Распаковать-то распакуете (возможно), но не взлетит.

drBatty ★★
()
Ответ на: комментарий от drBatty

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

winddos ★★★
() автор топика
Ответ на: комментарий от winddos

но попробовать исправить архив это приятнее, чем ещё 3 дня качать новый.

я-бы уже качал. Скорее всего получится каша из файловой системы, которая никак не вылечится.

drBatty ★★
()
Ответ на: комментарий от drBatty

Ну у меня появилась идея, что надо попробовать с хедером.
Качать все равно начинать вечером :)

winddos ★★★
() автор топика

rsync умеет исправлять битые файлы

eagleivg ★★★★★
()
Ответ на: комментарий от eagleivg

Тред уже совсем не о том :)

Вопрос в том, что не ясно, почему хедеры в архиве не верные:
- или сделан архив не правильно
- либо сделан каким то странным софтом (не знаю чем он мог его сделать на маке)
- либо как то оказался поврежден

winddos ★★★
() автор топика

Идей.

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

1 - Образно говоря, усть архив размером в 30300 байт в котором хранятся всего 3 файла. и выглядит это как то так:

общий заголовок
хедер_один запакованные_данные __разделитель__
хедер_два запакованные_данные __разделитель__
хедер_три запакованные_данные __разделитель__

2 - Предположим, что каждый файл имеет размер в упакованном виде 10000 байт, а 300 байт делят между собой хедеры и структура «контейнера».
3 - В хедерах второго и третьего файла написано: имя 111.jpg/222.jpg, размер сжатых данных 10000 байт, размер распакованных XXX.
4 - А в первом написано, размер сжатых данных 2000 байт, а размер распакованных YYY.
5 - Т.е по причине какой то не определенной ошибки упаковщик записал в хедеры не верную информацию о количество сжатых данных относящихся к первому файлу.
6 - Естественно unzip/etc читает хедер, и видит что для первого файла надо распаковать 2000 байт, распаковывает их, и контрольная сумма не сходится.
7 - Контрольная сумма налогается только на файл целиком, и наверняка соответствует 10000 байтам, а не 2000.
8 - Выкидывается ошибка, и далее распаковщик пропускает 8000 байт как мусор и доходит до разделителя.
9 - Оставшиеся 2 файла извлекаются корректно.
Не буду рассуждать, как могло произойти, что архиватор лаганул, но ведь последние файлы распаковались корректно а значит архив не просто битый.

Если в хедер первого файла прописать правильный его запакованный размер и правильный распакованный (а может и без него можно?) то он может распаковаться корректно.

winddos ★★★
() автор топика
Ответ на: комментарий от trycatch

Оно то что то сканит, да не то.

Такое ощущение что этот софт молится на хедер с не верными данными :(



$: zip -FF «server.vdi.zip» --out test.zip
Fix archive (-FF) - salvage what can
Found end record (EOCDR) - says expect single disk archive
Scanning for entries...
copying: server.vdi
zip warning: no end of stream entry found: server.vdi
zip warning: rewinding and scanning for later entries
zip warning: zip file empt

winddos ★★★
() автор топика
Ответ на: комментарий от winddos

Ну т.е проблема в чем:

Один "-F" заставляет его почему то думать, что содержимое VDI это такой битый архив..
А "-FF" он что то делает, но опять же ничего не меняется.


Скажем я сначала сделал скан c -FF как сверху, а потом test.zip попытался проверить с одной "-F".

Получилось как то так:


zip -F test.zip --out test2.zip
Fix archive (-F) - assume mostly intact archive
Zip entry offsets appear off by 8589934592 bytes - correcting...
copying: server.vdi
zip warning: Did not find entry for server.vdi
zip warning: bad - skipping: server.vdi
copying: __MACOSX/
copying: __MACOSX/._server.vdi

В итоге оно удалило из архива server.vid (архив стал размером в 8 гиг, но содержит как бы только директорию _MACOSX).
.

winddos ★★★
() автор топика

torrent же как раз подходит!

bhfq ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.