Блогосайт Алисы и Alv’а

Июль 20, 2009

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

Рубрика: Мир Linux, Бэкап, Shell&Utils — alv @ 8:26 пп

Автор: Алексей Федорчук
Мир 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, предписывающую создавать промежуточные подкаталоги при распаковке архива — она почти наверняка понадобится.

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

. .

4 Комментариев »

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

    Комментарий от popov.v.n — Июль 21, 2009 @ 8:57 пп

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

    Комментарий от alv — Июль 22, 2009 @ 4:55 пп

  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.

    Комментарий от anonymous — Июль 22, 2009 @ 7:10 пп

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

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

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

    Комментарий от popov.v.n — Июль 22, 2009 @ 8:23 пп

RSS лента комментариев этой записи.

Оставить комментарий

Я не робот.

Сайт работает на WordPress

Утилиты для компьютера - Norton Utilits Windows версия . | Внутренняя отделка русской бани. Что такое внутренняя отделка бани. Печи для бань.