Автор: Алексей Федорчук
Мир 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 не знал…
А ещё не знаю, как это cpio в последние годы вытеснила gzip из процедуры создания initrd. Буквально, не менее 2-3 дистров/livecd раньше сжимали initrd gzip-ом, сейчас — cpio. С чего бы? Не встречал?
2 popov.v.n
Что cpio стал чаще применяться в initrd — тоже обратил внимание. А вот с чем это связано — тоже не знаю. Я понимаю, в rpm он используется по той же причине, почему ar в deb-пакетах: чтобы не менять то, что работает больше 10 лет. А вот почему init-дисках к нему обратились? Мода на стиль ретро?
Или действительно из-за возможностей конвертации из формата в формат?
Кстати, в официальной документации перечислено дохренища опций cpio. Надо будет покопаться на досуге.
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.
Беда с этими анонимами… Лучше бы ссылку дал. Тогда что-то, может быть, и удалось бы выяснить. Хотя, судя по упоминанию pacman-а, это — из Arch-а — стоит, наверное, посмотреть.
mkinitcpio — только скрипт, использующий cpio. И большая часть перечисленных достоинств имеет отношение к создаваемому initrd и самому скрипту. А они (скрипты и утилиты создания initrd), разные бывают. Я, большей частью, и не использовал никогда ни mkinitrd (RH), ни mkramfs (Deb), хотя и смотрел: как они работают. Так что, почему cpio, а не gzip, мне по-прежнеу не ясно…
Другое дело, что это не столь интересно, чтобы специально этим заняться :-)