
Я пытаюсь извлечь gcc-4.9.0.tar.gz, скачанный с одного из зеркал gcc. Чтобы проверить подпись md5 перед тем, как я его распакую, я сделал
digest -a md5 -v gcc-4.9.0.tar.gz
который дал
md5 (gcc-4.9.0.tar.gz) = fe8786641134178ecfeee2dc7644a0d8
Это совпадает с md5.sum в каталоге, загруженном из источника.
Тогда я сделал
gzip -dc gcc-4.9.0.tar.gz | tar xvf -
Добыча началась, но вскоре прекратилась
tar: directory checksum error
Я также пробовал сжимать и распаковывать архивы по отдельности, вот так
gunzip gcc-4.9.0.tar.gz
Затем
tar -xvf gcc-4.9.0.tar
но он также завершился ошибкой контрольной суммы.
Пожалуйста, как мне решить эту проблему?
решение1
Похоже, что архив tar поврежден или не соответствует стандарту.
Обратите внимание, что я скачал архив как образ bz2 и не испытал никаких проблем с его использованием bzip2 -d gcc-4.9.0.tar.bz2 < tar tvf -
.
Распакованный архив имеет контрольную сумму md5: 6b8f599053a52e7c2076485d1ad3e747.
Сейчас я извлекаю файл .gz, посмотрим, что получится...
Хорошо, вот контрольная сумма md5 из gcc-4.9.0.tar.gz fe8786641134178ecfeee2dc7644a0d8, которая совпадает с той, которую вы видите.
Обратите внимание, что проблема обычно возникает, когда архив создается с помощью gtar
, но в редких случаях приводит к появлению directory checksum error
.
Если вы хотите лучше понять, что происходит, я рекомендую вам использовать программу, tartest
которая идет в комплекте star
.
Последние новости можно найти schilytools
здесь:
http://sourceforge.net/projects/schilytools/files/
скомпилируйте и запустите программу tartest/OBJ/*/tartest < gcc-4.9.0.tar
.
Я сделал это и обнаружил, что причина в том, что архив использует специфичный для поставщика GNU «тип файла» «L» в заголовке tar.
ВАЖНО: если бы GNU tar был наполовину стандартно совместимым или хотя бы наполовину безошибочным, эта проблема не возникала бы, поскольку имя файла в вопросе идеально вписывалось в схему имен POSIX.1-1988 100+255. Так что это еще один намек на то, почему людям следует избегать использования GNU tar вообще.
Рекомендую использовать star
.
Каждая отдельная функция star
полностью контролируется структурой описания свойств. Если вы укажете формат архива, star
никогда не будет создано содержимое архива, связанное с другим форматом архива.
Если вы, например, позвоните:
star -c -f out.tar -Hustar somedir
star
будет использовать формат архива, полностью соответствующий POSIX.1-1988, и в случае, если файл не помещается в этот формат архива, star
выведет предупреждение вместо того, чтобы архивировать файл нестандартными методами.
Кстати: Вот набор изменений, в который Sun добавила поддержку этой уникальной функции поставщика:
changeset: 11995:caff1bd711f5
user: Rich Burridge <[email protected]>
date: Thu Mar 25 13:21:39 2010 -0700
description:
6202362 Solaris tar can't unpack files created with GNU tar
modified:
usr/src/cmd/tar/tar.c
решение2
Вам необходимо использовать gtar, он обычно предустановлен вместе с пакетом SUNWgtar:
gzip -dc gcc-4.9.0.tar.gz | /usr/sfw/bin/gtar -xf -
echo $?
0
У родного Solaris unpatched tar могут быть проблемы с файлами, созданными с помощью GNU tar. Смотрите ответ @schily, почему.