Как на самом деле перечислить содержание архива, который cpio?

На самом деле это единственный раздел про unix на этом форуме

Модераторы: /dev/random, Модераторы разделов

Аватара пользователя
жучара
Сообщения: 1060
ОС: астралинукс

Как на самом деле перечислить содержание архива, который cpio?

Сообщение жучара »

Друзья! Такой вот файл есть:

Shell

$ file initrd.img-6.1.0-18-amd64
initrd.img-6.1.0-18-amd64: ASCII cpio archive (SVR4 with no CRC)
$
Какой-то он ASCII cpio archive. Ну ладно, попробуем посмотреть, что там у него внутри:

Shell

$ crio --help
...
-t, --list Вывод таблицы с содержимым
входных данных
...
$
То есть как-то подаём на вход cpio входные данные и смотрим содержимое. Хорошо, в мане об этой опции ни слова, кроме того, что она там написана. Смотрим таблицу с содержимым:

Shell

$ cpio -t < initrd.img-6.1.0-18-amd64
.
kernel
kernel/x86
kernel/x86/microcode
kernel/x86/microcode/AuthenticAMD.bin
151 блок
$
Это ложь. Распакуем файл initrd.img-6.1.0-18-amd64

Shell

$ unmkinitramfs initrd.img-6.1.0-18-amd64 foo
$
Смотрим, чё там внутри:

Shell

$ ls foo
early main
$
Во как.

Shell

$ tree foo/early
foo/early/
└── kernel
└── x86
└── microcode
└── AuthenticAMD.bin

4 directories, 1 file
$
Получается, foo/early и есть то наше kernel, а main вообще не упоминается (а там тоже до фига всего). Ну то есть. Мы распакаковали архив, который cpio и получили его содержание. А иначе-то никак? Вопрос у меня, не распаковывая, можно как-нибудь получить содержание архива?

(Строго говоря, если он бы показал ТОЛЬКО early и main, я бы понял. Да, это неполное содержание. Но вдруг early и main сами по себе как-то там ещё заархивированы способом отличным от cpio? следовательно, cpio покажет только то, что умеет распознать, но не всё.)

Тут же часть показал, часть не показал. Странно всё это.
Спасибо, кто откликнется. Debian 12.
Я просто читаю маны.
Спасибо сказали:
Аватара пользователя
ormorph
Сообщения: 2964
ОС: Gentoo

Re: Как на самом деле перечислить содержание архива, который cpio?

Сообщение ormorph »

жучара писал(а):
13.07.2024 01:22
Но вдруг early и main сами по себе как-то там ещё заархивированы способом отличным от cpio? следовательно, cpio покажет только то, что умеет распознать, но не всё.)
Если запакованы, то распаковывать не нужно. Cpio сам по себе архив. Не знаю как у вас, а у меня всё сходится в выводе:

Shell

$ mkdir foo
$ cd foo
$ cpio -i <../initramfs.cpio
$ cpio -t --quiet ../initramfs.cpio | wc -l
367
$ find |wc -l
367
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5382
ОС: Gentoo

Re: Как на самом деле перечислить содержание архива, который cpio?

Сообщение /dev/random »

Проблема у вас в том, что initramfs - это не cpio-архив. Это набор слитых вместе файлов (слитых просто cat'ом, без структуры и разделителей), среди которых обычно есть cpio-архивы. Утилита file заглянула в начало, увидела там cpio-архив, и сказала, что это cpio-архив. Но попытка работать с этой химерой как с cpio-архивом редко приводит к чему-то хорошему.
Спасибо сказали:
Аватара пользователя
жучара
Сообщения: 1060
ОС: астралинукс

Re: Как на самом деле перечислить содержание архива, который cpio?

Сообщение жучара »

binwalk initrd.img-6.1.0-18-amd64 ещё можно. Он даёт больше информации и, что самое главное- в описанном случае больше ПОЛЕЗНОЙ информации (смещения).
Я просто читаю маны.
Спасибо сказали: