Команда для извлечения в cpio, аналогичная ‘tar xzvf’?

Вопрос или проблема

Я получил дистрибутив Unix в виде сжатого файла cpio. Какую команду лучше всего использовать для извлечения файлов?

gzip -cd foo.cpio.gz | cpio -idmv
  • i : извлечение (ввод)
  • d : создание директорий
  • m : сохранение mtime
  • v : подробный вывод
mkdir archive
cd archive
zcat ../archive.cpio.gz | cpio -idmv --no-absolute-filenames

Хотя это старый вопрос, он имеет высокие позиции в Google, поэтому я решил обновить его. Я в целом согласен с принятым ответом, но вы должны добавить “–no-absolute-filenames”, если вы не собираетесь перезаписывать важные системные файлы на вашем компьютере. Также лично я предпочитаю “zcat” вместо “gzip -cd” или “gunzip -c”.

Наконец, обратите внимание, что вам нужно запускать cpio от имени root (например, с помощью sudo), если вы извлекаете корневую файловую систему, содержащую узлы устройств.

Как показано на https://linuxconfig.org/how-to-uncompress-and-list-an-initramfs-content-on-linux, архив cpio может состоять из нескольких частей с разным сжатием, поэтому cpio -idmv совсем не гарантирует извлечение всех файлов, содержащихся в архиве.

Из тестового файла размером 79M в моей системе было извлечено только 60KB.

К сожалению, само сжатие не является частью cpio, поэтому необходимо использовать различные приемы, включая расчет смещений и использование dd.

Инструмент unmkinitramfs (apt-get install initramfs-tools-core) должен охватывать все случаи, о которых также известно ядру:

unmkinitramfs /my/initrd.img /extract/path/

Но и здесь обратите внимание на предупреждение в man-странице:

ОШИБКИ

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

вот полный пример ручного процесса с использованием cpio и dd:

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

часть первая (несжатая)

$ cat /tmp/initrd.img | file -
/dev/stdin: ASCII cpio archive (SVR4 with no CRC)
$ cat /tmp/initrd.img | cpio -idmv
.
kernel
kernel/x86
kernel/x86/microcode
kernel/x86/microcode/AuthenticAMD.bin
151 блоков

часть вторая (несжатая)

$ dd skip=151 if=/tmp/initrd.img | file -
/dev/stdin: ASCII cpio archive (SVR4 with no CRC)
$ dd skip=151 if=/tmp/initrd.img | cpio -idmv
kernel
kernel/x86
kernel/x86/microcode
kernel/x86/microcode/GenuineIntel.bin
15586 блоков

часть третья (сжатая)

$ dd skip=$((151+15586)) if=/tmp/initrd.img | file -
/dev/stdin: XZ compressed data, checksum CRC32
$ dd skip=$((151+15586)) if=/tmp/initrd.img | xz -d | file -
/dev/stdin: ASCII cpio archive (SVR4 with no CRC)
$ dd skip=$((151+15586)) if=/tmp/initrd.img | xz -d | cpio -idmv
[...много файлов]
var/lib
var/lib/dhcp
806862 блоков

часть четвёртая (не существует – конец файла, просто для проверки)

$ dd skip=$((151+15586+806862)) if=/tmp/initrd.img | file -
dd: /tmp/initrd.img: не удалось перескочить к указанному смещению
0+0 записей в
0+0 записей из
скопировано 0 байт, 7.5479e-05 с, 0.0 кБ/с
/dev/stdin: пусто

Например, чтобы извлечь архивное содержимое /etc/httpd/ в текущую директорию, создавая поддиректории ./etc/httpd/

mkdir restored-etc-httpd
cd restored-etc-httpd    
zcat archive.cpio.gz | cpio -idmv --no-absolute-filenames "*etc/httpd/*"

Принятый ответ и ответ Мэтта были для меня полезными, но я долго не мог понять из-за трех деталей:

  1. Шаблон должен быть заключен в кавычки, чтобы работать как шаблон 😛
  2. Опция --no-absolute-filenames должна предшествовать шаблону в командной строке
  3. Поскольку эта опция удаляет начальный / из имен файлов, шаблон также должен опустить начальный /

Эта страница Википедии о cpio содержит некоторые полезные примечания.
Для получения дополнительных деталей, обратитесь к руководству по cpio.

Ссылка с той же страницы Википедии обсуждает сравнение с архивами tar.
И вот пример использования cpio с форматом tar.

Ответ или решение

Если вы получили дистрибутив Unix-системы в виде сжатого файла cpio и ищете команду, эквивалентную tar xzvf для извлечения, то здесь представлены несколько важных деталей и рекомендаций.

Извлечение с использованием cpio

Для извлечения файлов из сжатого архива cpio, можно использовать следующую команду:

gzip -cd yourfile.cpio.gz | cpio -idmv

Объяснение ключей:

  • -i: указывает, что cpio работает в режиме извлечения (input).
  • -d: создает необходимые директории.
  • -m: сохраняет время последней модификации файлов.
  • -v: отображает подробный вывод процесса.

Некоторые эксперты рекомендуют использовать дополнительно параметр --no-absolute-filenames, чтобы избежать риска перезаписи критически важных файлов системы. Это особенно актуально, если файлы в архиве содержат абсолютные пути:

zcat yourfile.cpio.gz | cpio -idmv --no-absolute-filenames

Особые случаи и рекомендации

  1. Запуск от имени суперпользователя: Если извлекаемая файловая система содержит специальные узлы устройств, может потребоваться запуск cpio с правами суперпользователя, например, через sudo.

  2. Многосегментные архивы: В некоторых случаях cpio-архив может состоять из нескольких сегментов, возможно с разными методами сжатия. Инструмент unmkinitramfs может быть полезен для работы с такими архивами.

  3. Читать метаданные частями: Для более сложных случаев, может понадобиться использование dd для извлечения данных по частям, определяя смещения на основе выходных данных предыдущих команд cpio.

Пример полного извлечения конкретной директории

Для извлечения содержимого определенной директории, например, /etc/httpd, в текущую директорию с созданием необходимых поддиректорий, используйте команду:

mkdir restored-etc-httpd
cd restored-etc-httpd
zcat archive.cpio.gz | cpio -idmv --no-absolute-filenames "*etc/httpd/*"

Обратите внимание на важные аспекты:

  • Открывающие и закрывающие кавычки вокруг шаблона устраняют проблемы в интерпретации символов.
  • Опция --no-absolute-filenames должна предшествовать шаблону для корректной работы.
  • При использовании --no-absolute-filenames сами шаблоны должны не содержать ведущего /.

Полезные ресурсы

Для более детального изучения работы с cpio и его сравнения с tar, рекомендуется ознакомиться со следующими источниками:

Использование приведенных рекомендаций и команд позволит эффективно и безопасно извлечь файлы из cpio-архива, обеспечивая при этом безопасность системы и структурированность работы.

Оцените материал
Добавить комментарий

Капча загружается...