Вопрос или проблема
Я получил дистрибутив 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/*"
Принятый ответ и ответ Мэтта были для меня полезными, но я долго не мог понять из-за трех деталей:
- Шаблон должен быть заключен в кавычки, чтобы работать как шаблон 😛
- Опция
--no-absolute-filenames
должна предшествовать шаблону в командной строке - Поскольку эта опция удаляет начальный
/
из имен файлов, шаблон также должен опустить начальный/
Эта страница Википедии о 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
Особые случаи и рекомендации
-
Запуск от имени суперпользователя: Если извлекаемая файловая система содержит специальные узлы устройств, может потребоваться запуск cpio с правами суперпользователя, например, через
sudo
. -
Многосегментные архивы: В некоторых случаях cpio-архив может состоять из нескольких сегментов, возможно с разными методами сжатия. Инструмент
unmkinitramfs
может быть полезен для работы с такими архивами. -
Читать метаданные частями: Для более сложных случаев, может понадобиться использование
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-архива, обеспечивая при этом безопасность системы и структурированность работы.