d0nrumata ([info]d0nrumata) wrote,
@ 2008-03-29 18:25:00
Previous Entry  Add to memories!  Tell a Friend  Next Entry
Current location:Abbots Way, Auckland, NZ
Current mood: content
Current music:Thievery Corporation - The Outernational Sound
Entry tags:Полезное, Проблема, Сделано, ТипоТрюк

Тип-о-Трюк: Проверка и "починка" файлов (о контрольных суммах и не только)

Тип-о-Трюк #4: Как проверить целостность файла и при необходимости "починить" испорченный файл, не скачивая/копируя его заново целиком.

Предисловие. Эту лирику можно не читать.
Подзаголовок этой записи может звучать как "...или как я восстанавливал свой ноутбук без диска-реаниматора под рукой". Дело в том, что я забыл реаниматор (dvd с заводским образом жёсткого диска) в России в эти каникулы. В прошлые выходные же я этого ещё не знал и подготовил всё к переустановке системы, потому как делаю это минимум раз в год из-за любви к чистой системе. Итак, когда я был готов начать автоматизированный процесс сноса и установки системы, я понял, что диска нет. Диск нашёлся дома в России, а так как к этому моменту я сумел привести ноут в нерабочее состояние  некоторыми экспериментами, необходимость получить реаниматор возросла. Вариант DHL рассматривать не хотелось из-за цены вопроса, поэтому было решено сделать .iso образ диска и переправить его сюда по сети. Сделали образ, положили на FTP и я его скачал. "Медленно и очень занудно", но скачал. Нарезал на диск, попробовал - не работает, выдаёт ошибку. Было обидно... Да и машину восстанавливать всё равно надо. Не мне пришла в голову мысль сверить контрольные суммы образа исходного и того, что получился у меня. Сверили, не сошлось. Перекачивать 2.7Гб снова я не был готов совершенно. Тогда было решено провести эксперимент: "распилить" исходный и полученный файл на 100 частей и сверить контрольные суммы частей. Сделали, получилось, что ошибки только в 14 из 100 кусков, а это около всего 300Мб. Перекачали эти 14 файлов по новой, проверили суммы - сошлось. Дальше я склеил образ обратно, но с заменеными кусками и всё чудесным образом заработало. Теперь у меня чистая родная система и я могу подробно описать сам процесс.

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

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

Необходимые условия: доступ к исходному файлу.

Как и чем. Итак, если у вас есть возможность производить определённые действия с исходным файлом (или самостоятельно каким-то образом... или же попросить того, кто файл вам предоставил), тогда можно претворить решение в жизнь.

Шаг 1.Контрольная сумма - некоторое значение, рассчитанное путём применения определённых операций над входными данными (Википедия). Нам важно понимать только одно - если файлы идентичны, то их контрольная сумма тоже идентична и наоборот, т.е. если контрольные суммы различаются, то и содержание файлов различно (может быть различие в одном байте, а может это и совершенно разные файлы).
Для расчёта и сверки контрольных сумм существует множество утилит, например MD5summer подойдёт пользователям Windows.. Пользоваться ей предельно просто. Скачиваем, запускаем. В основном окне видим дерево каталогов, в котором нужно выбрать папку с интересующим файлом. Тип суммы оставим MD5. Теперь для исходного файла создадим сумму, и потом сверим с ней полученный файл. То есть человек отправивший, выложивший для вас файл нажмёт Create sums и увидит список файлов в выбранной папке, в котором нужно выбрать интересующий файл кнопкой Add. Когда нужные файлы выбраны, нажимаем ОК и программа просчитает контрольные суммы и сохранит их в файле. Дальше можно или переслать файл туда, где находится полученный неработающий файл. Получив файл с контрольной суммой проверим испорченный файл. Для этого в первом окне программы выбираем папку, где находится неработающий файл, нажимаем на кнопку Verify sums и выбираем полученный файл с контрольной суммой. После этого программа сверит полученную сумму с суммой неработающего файла и сообщит, сходятся они или нет. Если не сходятся, то значит что файл при пересылке был испорчен, а если сходятся, то значит файл изначально был такой и дальше можно не читать.

Шаг 2. Это мы делаем для того, чтобы можно было обойтись пересылкой только испорченных частей файла, а не пересылать заново весь файл. Для этого нам понадобится программа, "разрезающая" файлы без их изменения, например кросс-платформная утилита JSplit (для её использования вам понадобится Java Runtime, среда запуска приложений Ява). Как и предыдущая программа, эта не требует установки. Просто скачиваем, распаковываем и запускаем (учтите, что вместо привычного .exe, здесь .jar - его и запускаем). Не пугайтесь интерфейса на французском, его можно переключить на английский, выбрав соответствующий вариант в списке справа. Также здесь нужно выбрать на сколько частей делить файл (по умолчанию) или же указать размер частей (если выбрать вариант By Size). Вписывайте число по своему усмотрению, главное, чтобы условия деления были одинаковыми для исходного и полученного файлов. Теперь переходим на вкладку Split и выбираем нужный файл (Select), и нажимаем красную кнопку Split.
После того, как файл был разделён, нужно повторить первый шаг, но теперь для получившихся частей. То есть, с одной стороны нужно просчитать суммы, отправить их на другой конец и там сделать проверку. Если проверка показала, что не все части расходятся в контрольных суммах, то нам повезло и можно перекачать только части с ошибками (т.е. несовпавшими суммами).

Шаг 3. Кроме самих частей стоит перекачать и файл с контрольными суммами всех "правильных" частей, чтобы по завершении закачки можно было убедиться в успехе всё тем же методом. Если после повторной закачки фрагментов все суммы сошлись, то можно склеивать наш файл. Для этого снова используем JSplit, только теперь переходим на вкладку Merge, предварительно заменив испорченные фрагменты файла на заново скаченные и проверенные по контрольным суммам. Учтите, что лучше производить эти операции в той же папке, где вы делили испорченный файл, иначе вам придётся вручную править файл конфигурации (mergeConf) делителя, чтобы он корректно собрал фрагменты вместе. Итак, когда все исправные фрагменты собраны вместе, на вкладке Merge выбираем файл mergeConf (а не все фрагменты вручную!) нажимаем красную кнопку Assemble и указываем имя для получившегося файла (лучше использовать оригинальное имя, чтобы проще было сверить контрольные суммы). После окончания операции остаётся только сверить контрольные суммы получившегося и исходного файла и надеяться, что они совпадают. Если да, то всё получилось и файл должен работать, а если нет... то скорее всего придётся перекачивать файл целиком, потому как данное решение не помогло, по какой-то причине.

Другие записи из серии "Тип-о-Трюк" || Серия записей myweb
RSS этого журнала || RSS из интересного прочитанного мною

P.S. Очень удобно было сохранить настройки Semagic в .ini файле и секундно их восстановить на новой системе.
P.S.#2 Как раз перед всеми этими проблемами (5 дней назад) счётчик прослушанного на
Last.fm перевалил за 10 тысяч. Треком под номером 10000 стал Pode Ficar от Arto Lindsay.




(5 comments) - (Post a new comment)


[info]lusfert
2008-03-29 12:17 pm UTC (link)
Только надо учесть, что алгоритм MD5 не совсем надёжен. Вот разные файлы с одинаковыми xэш-суммами:

1. http://slil.ru/25631762

MD5
a25f7f0b29ee0b3968c860738533a4b9 *letter_of_rec.ps
a25f7f0b29ee0b3968c860738533a4b9 *order.ps


SHA256
de4e4c6e2b94e95a3c5bd72a9a6af29bc5f83bf759325d9921943a6fc08ea245 ?SHA256*letter_of_rec.ps
077046dd66015e05c3e03a43a6e4de129038e0701de5a4103fc7ed91c3782d06 ?SHA256*order.ps


2. http://slil.ru/25631764

MD5
cdc47d670159eef60916ca03a9d4a007 *erase.exe
cdc47d670159eef60916ca03a9d4a007 *hello.exe

SHA256
1316543942a8c6cd754855500cd37068edbbd8b31c4979d2825a4e799fed6102 ?SHA256*erase.exe
60d13913155644883f130b85eb24d778314014c9479aedb5f6323bf38ad3a451 ?SHA256*hello.exe

(Reply to this) (Thread)


[info]lusfert
2008-03-29 12:19 pm UTC (link)
Взято со следующих сайтов:
http://www.cits.rub.de/MD5Collisions/ (уже не работает)
http://www.mathstat.dal.ca/~selinger/md5collision/

(Reply to this) (Parent)


[info]d0nrumata
2008-03-29 08:57 pm UTC (link)
То есть лучше использовать алгоритм SHA256, я так понимаю?

(Reply to this) (Parent)(Thread)


[info]lusfert
2008-03-30 04:29 pm UTC (link)
Обычно и MD5 хватает, я привёл лишь исключения (которых достаточно, что признать его ненадёжным для серьёзного применения). Я бы использовал оптимальные на настоящий момент по соотношению скорости и надёжности: RIPEMD-160 или SHA-1.

(Reply to this) (Parent)

(Reply from suspended user)

(5 comments) - (Post a new comment)

Create an Account
Forgot your login or password?
Login w/ OpenID
English • Español • Deutsch • Русский…