Архивирование и компрессия. Утилита cpio

Автор: Алексей Федорчук
Мир Linux. Наброски к книге

Команда cpio — наверное, древнейшее средство архивирования в UNIX, существующее с незапамятных времён. Архивные файлы в создаваемой ей формате понимаются в любых Unix-системах. И хотя она сама как архиватор пользовательских данных практически вышла из употребления, именно ею собираются воедино компоненты пакетов в формате rpm. По этим причинам о cpio необходимо сказать несколько слов.

Как можно понять из названия, утилита cpio (Copy Input/Outup) занимается копированием входящих файлов в выходящий архив и наоборот, развёртыванием входящего архива в выходящие файлы. Существует три режима её работы.

Первый режим, copy-out, задаваемый опцией -o (или --create), предусматривает считывание списка файлов (name list) со стандартного ввода и объединяет их в архив, который может быть направлен в архивный файл или непосредственно на устройство для записи резервных копий. Список файлов для архивирования может представлять собой вывод какой-либо иной команды. Так, в примере

$ find ./* | cpio -o > arch.cpio

файлы текущего каталога, найденные командой find, при посредстве команды cpio будут направлены в архивный файл arch.cpio.

Второй режим, copy-in, вызываемый  опцией -i, или --extract) осуществляет обратную процедуру: развертывание ранее созданного архива в текущем каталоге:

$ cpio -i < arch.cpio

Здесь нужно заметить, что если разворачиваемый архив включает подкаталоги, автоматически они созданы не будут, и последует сообщение об ошибке. Для создания промежуточных каталогов команда cpio должна использоваться с опцией -d (--make-directories).

В третьем режиме (copy-pass, опция -p, или --pass-through) команда cpio выполняет копирование файлов из одного дерева каталогов в другой, комбинируя режимы copy-out и copy-in, но без образования промежуточного архива. Список файлов для копирования (name list) считывается со стандартного ввода, а каталог назначения указывается в качестве аргумента:

$ cpio -p dir2 < name_list

Команда cpio имеет множество опций, позволяющих создавать, в частности, архивы в различных форматах (для межплатформенной переносимости). Однако я на них останавливаться не буду, отсылая заинтересованных к соответствующей man-странице: она не кажется мне удобной в применении. А затрону только вопрос о «потрошении» rpm-пакетов — такая необходимость время от времени возникает не только у пользователей основанных на нём дистрибутивов.

На этот предмет существует специальная утилита rpm2cpio. Она считывает данные с rpm-файла (или, если таковой не указан, со стандартного ввода), преобразуя их в формат архива cpio.

Делается это так:

$ rpm2cpio  file.rpm > file.cpio

Далее образовавшийся cpio-архив распаковывается стандартным образом:

$ cpio -i -d < file.cpio

Обращаю внимание на опцию -d, предписывающую создавать промежуточные подкаталоги при распаковке архива — она почти наверняка понадобится.

[Содержание]

Архивирование и компрессия. Утилита cpio: 4 комментария

  1. Я, кстати о «древности» cpio не знал…
    А ещё не знаю, как это cpio в последние годы вытеснила gzip из процедуры создания initrd. Буквально, не менее 2-3 дистров/livecd раньше сжимали initrd gzip-ом, сейчас — cpio. С чего бы? Не встречал?

  2. 2 popov.v.n
    Что cpio стал чаще применяться в initrd — тоже обратил внимание. А вот с чем это связано — тоже не знаю. Я понимаю, в rpm он используется по той же причине, почему ar в deb-пакетах: чтобы не менять то, что работает больше 10 лет. А вот почему init-дисках к нему обратились? Мода на стиль ретро?
    Или действительно из-за возможностей конвертации из формата в формат?
    Кстати, в официальной документации перечислено дохренища опций cpio. Надо будет покопаться на досуге.

  3. mkinitcpio is the next generation of initramfs creation. It has many advantages above the old mkinitrd and mkinitramfs scripts.

    * It uses klibc and kinit which are developed by Linux kernel devs to provide a small and lightweight base for early userspace.
    * It can use udev for hardware autodetection at runtime, thus prevents you from having tons of unnecessary modules loaded.
    * Its hook-based init script is easily extendable with custom hooks, which can easily be included in pacman packages without having to modifiy mkinitcpio itself.
    * It already supports lvm2, dm-crypt for both legacy and luks volumes, raid, mdadm, swsusp and suspend2 resuming and booting from usb mass storage devices.
    * Many features can be configured from the kernel command line without having to rebuild the image.
    * The mkinitcpio script makes it possible to include the image in a kernel, thus making a self-contained kernel image is possible.

  4. Беда с этими анонимами… Лучше бы ссылку дал. Тогда что-то, может быть, и удалось бы выяснить. Хотя, судя по упоминанию pacman-а, это — из Arch-а — стоит, наверное, посмотреть.

    mkinitcpio — только скрипт, использующий cpio. И большая часть перечисленных достоинств имеет отношение к создаваемому initrd и самому скрипту. А они (скрипты и утилиты создания initrd), разные бывают. Я, большей частью, и не использовал никогда ни mkinitrd (RH), ни mkramfs (Deb), хотя и смотрел: как они работают. Так что, почему cpio, а не gzip, мне по-прежнеу не ясно…

    Другое дело, что это не столь интересно, чтобы специально этим заняться :-)

Обсуждение закрыто.