Практическое руководство по cpio в Linux

Введение

Утилита cpio — один из фундаментальных инструментов Linux, лежащий в основе формирования образов initramfs и низкоуровневого резервного копирования данных. В этом практическом руководстве мы детально разберем три базовых сценария взаимодействия с программой: экспорт в архив (copy-out, -o), извлечение содержимого (copy-in, -i) и сквозное дублирование файловых иерархий (copy-pass, -p). Разбор реальных примеров с сопутствующими параметрами позволит системным администраторам эффективно автоматизировать задачи бэкапа и миграции данных.

1. Развертывание пакета cpio и основы сборки архива (режим copy-out)

Перед началом экспериментов обновим локальный индекс репозиториев Ubuntu и убедимся в наличии бинарного пакета cpio в операционной системе.

sudo apt-get update -qq && sudo apt-get install -y cpio

Подготовим изолированное рабочее пространство: создадим тестовый каталог и наполним его демонстрационными текстовыми файлами.

mkdir -p ~/cpio_demo/src && cd ~/cpio_demo/src && echo ‘file1 content’ > file1.txt && echo ‘file2 content’ > file2.txt

Архитектурная особенность cpio заключается в получении перечня обрабатываемых путей исключительно через стандартный поток ввода (stdin).
Передав вывод утилиты списка файлов через конвейер, сформируем упакованный архив под именем archive.cpio.
⚙️ [Справочник ключевых ключей]

-o (--create) : активирует сценарий copy-out, упаковывая переданный список файлов в единый архивный поток.
-i (--extract) : запускает режим copy-in, выполняя чтение архива и восстановление файлов на диск.
-p (--pass-through) : режим прямого клонирования copy-pass, переносящий файловые деревья между путями без создания промежуточного файла.
-v (--verbose) : выводит подробный журнал обрабатываемых файлов прямо в терминал.
-t (--list) : генерирует таблицу содержимого архива без его фактической распаковки.
-d (--make-directories) : автоматически воссоздает недостающие каталоги в целевой структуре.
-u (--unconditional) : принудительно перезаписывает существующие объекты аналогичными версиями из архива.
-H (--format) : определяет формат заголовков контейнера (например, crc, newc, tar).

ls | cpio -ov > ../archive.cpio

Проверим корректность создания файла archive.cpio, оценив его атрибуты и размер в человекочитаемом формате.

ls -lh ../archive.cpio

2. Инспекция состава контейнера и восстановление файлов (режим copy-in)

Чтобы проинспектировать содержимое упакованного архива archive.cpio вместе с правами доступа без вмешательства в файловую систему, объединим флаги -t и -v.
Такой подход позволяет безопасно оценить состав контейнера через перенаправление ввода до извлечения данных.

cpio -tv < ~/cpio_demo/archive.cpio

Выделим чистую директорию для проверки процедуры развертывания и перейдем в нее.

mkdir -p ~/cpio_demo/restore && cd ~/cpio_demo/restore

Для развертывания исходных файлов из archive.cpio в текущий каталог применим команду cpio -idv.
Флаг -d позаботится об автоматическом формировании вложенных папок, а флаг -v обеспечит наглядную индикацию хода восстановления каждого объекта.

cpio -idv < ~/cpio_demo/archive.cpio

Убедимся в успешном завершении процедуры извлечения, запросив детальный листинг директории с атрибутами файлов.

ls -la

3. Прямое клонирование файловых иерархий без промежуточного архива (режим copy-pass)

Смоделируем многоуровневую файловую структуру: добавим в исходную папку вложенный каталог и запишем туда проверочный файл.

mkdir -p ~/cpio_demo/src/subdir && echo ‘sub file’ > ~/cpio_demo/src/subdir/subfile.txt

Сконфигурируем директорию назначения, куда предстоит скопировать сформированное дерево.

mkdir -p ~/cpio_demo/target_dir

Перейдем в исходный каталог и передадим найденные утилитой find пути в cpio в режиме copy-pass (-p).
Комбинация флагов -d (построение каталогов), -m (сохранение оригинальных временных меток mtime) и -v (подробный протокол) позволяет филигранно дублировать структуру напрямую в целевую директорию без создания временного .cpio файла.

cd ~/cpio_demo/src && find . -depth | cpio -pdmv ~/cpio_demo/target_dir

Выполним рекурсивную проверку целевой директории, чтобы удостовериться в целостности перенесенных подкаталогов и файлов.

ls -laR ~/cpio_demo/target_dir

4. Сборка архива стандартного формата (SVR4/CRC) и компрессия с помощью gzip

Перейдя в рабочий каталог, направим вывод команды find в поток cpio с указанием формата newc — общепринятого стандарта для образов начального загрузочного диска Linux (initramfs). Затем пропустим поток через компрессор gzip с максимальным сжатием (-9), сохранив готовый сжатый архив под именем initramfs_sample.cpio.gz.

cd ~/cpio_demo/src && find . | cpio -ov -H newc | gzip -9 > ../initramfs_sample.cpio.gz

Верифицируем структуру файла initramfs_sample.cpio.gz с помощью утилиты file, чтобы убедиться в корректности gzip-заголовков.

file ~/cpio_demo/initramfs_sample.cpio.gz

Создадим изолированное окружение для отработки сценария распаковки сжатого образа.

mkdir -p ~/cpio_demo/gz_restore && cd ~/cpio_demo/gz_restore

Свяжем команду потоковой декомпрессии zcat и режим извлечения cpio -idv через пайплайн для мгновенного развертывания содержимого архива в текущую рабочую директорию.

zcat ~/cpio_demo/initramfs_sample.cpio.gz | cpio -idv

Проверим финальный результат: убедимся, что все структурные элементы, включая скрытые объекты и поддиректории, благополучно извлечены.

ls -la

Мы подробно рассмотрели практическое использование cpio в среде Ubuntu: от генерации базовых архивных файлов до интеграции с компрессионными потоками и прямого клонирования директорий. Грамотное сочетание конвейеров ввода-вывода и флагов cpio открывает широкие возможности для создания надежных скриптов обслуживания системы и восстановления критически важных данных.