3CPIO(1) 3cpio 3CPIO(1)

3cpio - ابزار پیشرفته استخراج، بازپک کردن و ساخت آرشیوهای cpio و initramfs

3cpio --count ARCHIVE

3cpio {-c|--create} [-v|--debug] [-C DIR] [--data-align ALIGNMENT] [ARCHIVE] < manifest

3cpio {-e|--examine} [--raw] ARCHIVE

3cpio {-t|--list} [-v|--debug] [-P LIST] ARCHIVE [pattern...]

3cpio {-x|--extract} [-v|--debug] [-C DIR] [-P LIST] [-p] [-s NAME] [--to-stdout] [--force] [-F] ARCHIVE [-F|--file ARCHIVE...] [pattern...]

3cpio {-V|--version}

3cpio {-h|--help}

برنامه 3cpio ابزاری برای مدیریت فایل‌های cpio مربوط به initramfs برای کرنل لینوکس است. قالب بافر initramfs https://www.kernel.org/doc/html/latest/driver-api/early-userspace/buffer-format.html کرنل لینوکس بر پایه قالب‌های cpio از نوع newc یا crc است. چندین آرشیو cpio را می‌توان به یکدیگر متصل کرد و آخرین آرشیو می‌تواند فشرده‌سازی شود. بسته به اینکه چه پشتیبانی‌هایی در کرنل لینوکس کامپایل شده باشد، می‌توان از الگوریتم‌های فشرده‌سازی مختلفی استفاده کرد. 3cpio برای فایل‌های cpio در initramfs طراحی شده است و پشتیبانی از سایر قالب‌های cpio به آن اضافه نخواهد شد.

قالب‌های فشرده‌سازی زیر پشتیبانی می‌شوند: bzip2، gzip، lz4، lzma، lzop، xz، zstd.

--count ARCHIVE

تعداد آرشیوهای متصل‌شده cpio را چاپ می‌کند.

-c, --create [ARCHIVE]

یک آرشیو cpio جدید ایجاد می‌کند. مانیفست را از ورودی استاندارد می‌خواند. برای توضیحات مربوط به ساختار مانیفست، بخش MANIFEST را ببینید. آرشیو cpio را در خروجی استاندارد یا در صورت تعیین، در فایل ARCHIVE مشخص‌شده می‌نویسد. مجوزهای فایل ARCHIVE بر اساس مجوزهای فایل‌های ورودی تعیین می‌شود (برای جلوگیری از افشای اطلاعات حساس).

-e, --examine ARCHIVE

آفست‌های آرشیوهای cpio و نوع فشرده‌سازی آن‌ها را در یک جدول قالب‌بندی‌شده فهرست می‌کند. پیشوندهای SI برای یکای اندازه استفاده می‌شوند (برای مثال 1 kB = 1000 بایت). به ساختار چیدمان خروجی متکی نباشید. برای یک خروجی ماشین‌خوان از گزینه --raw استفاده کنید. در این صورت، هر خط شامل این پنج مقدار جداشده با تب خواهد بود:

Start

ابتدای آرشیو cpio به بایت.

End

انتهای آرشیو cpio به بایت.

Size

اندازه آرشیو cpio روی دیسک به بایت (end - start).

Compression

نوع فشرده‌سازی آرشیو cpio (در صورتی که فشرده نشده باشد، cpio).

Extracted size

اندازه فایل‌های درون آرشیو cpio به بایت پس از استخراج.

-t, --list ARCHIVE [pattern...]

محتویات آرشیوهای cpio را فهرست می‌کند. به‌طور پیش‌فرض فقط نام فایل‌ها چاپ می‌شود. اگر --verbose مشخص شده باشد، قالب تفصیلی فهرست استفاده می‌شود (مشابه ls --long). اگر --debug مشخص شده باشد، شماره inode علاوه بر قالب تفصیلی چاپ می‌شود. اگر یک یا چند pattern مشخص شود، فقط نام فایل‌هایی که حداقل با یکی از آن patternها مطابقت دارند فهرست می‌شوند. این patternها الگوهای جانشینی شل (wildcard) هستند (به glob(7) مراجعه کنید).

-x, --extract [-F|--file] ARCHIVE [-F|--file ARCHIVE] [pattern...]

آرشیوهای cpio را استخراج می‌کند. چندین آرشیو را می‌توان با -F مشخص کرد. گزینه -F را می‌توان برای آرشیو اول نادیده گرفت. اگر یک یا چند pattern مشخص شود، فقط فایل‌هایی که حداقل با یکی از آن patternها مطابقت دارند استخراج می‌شوند. این patternها الگوهای جانشینی شل (wildcard) هستند (به glob(7) مراجعه کنید).

-V, --version

شماره نسخه را چاپ می‌کند.

-h, --help

پیام راهنما را چاپ می‌کند.

--data-align ALIGNMENT

هنگام ایجاد یک آرشیو cpio، متادیتای cpio را پد (pad) می‌کند تا داده‌های فایل بر روی ALIGNMENT به بایت تراز شوند. این گزینه برای reflink کردن داده‌های فایل cpio در فایل‌سیستم‌هایی که از reflink پشتیبانی می‌کنند مفید است. این پدینگ/ترازسازی برای فایل‌های کوچک‌تر از ALIGNMENT، فایل‌هایی که فیلد نام پدشده آن‌ها از PATH_MAX بیشتر شود، و برای آرشیوهای cpio فشرده‌شده نادیده گرفته می‌شود. مقدار ALIGNMENT باید مضربی از ۴ بایت باشد. این گزینه فقط در حالت --create در نظر گرفته می‌شود.

آرشیو cpio حاصل ممکن است بسیار تکه‌تکه (fragmented) شود، که می‌تواند منجر به افت کارایی هنگام خواندن/استخراج ایمیج از دستگاه‌هایی با ورودی/خروجی تصادفی کُند (مانند دیسک‌های مکانیکی) شود.

نکته: استفاده از این گزینه مشخصات cpio newc را کمی تغییر می‌دهد تا با تزریق بایت‌های صفر پس از نام فایل، تراز قطعه داده فراهم شود. این بایت‌های صفر در فیلد namesize لحاظ می‌شوند، اما برخی برنامه‌ها ممکن است تنها یک کاراکتر پایانی صفر (و تراز ۴ بایتی) را انتظار داشته باشند. تا زمانی که اندازه از PATH_MAX فراتر نرود، GNU cpio و Linux initramfs بدون مشکل با آن کار می‌کنند.

دستور زیر را می‌توان برای تعیین اندازه بهینه انتقال فایل‌سیستم استفاده کرد (که در آن $path مسیری است که آرشیو cpio در آن نوشته خواهد شد):

stat --file-system -c "%s" -- "$path"

-C DIR, --directory=DIR

پیش از انجام هرگونه عملیات، اما پس از باز کردن ARCHIVE، دایرکتوری کاری را تغییر می‌دهد. این گزینه فقط در حالت --extract در نظر گرفته می‌شود.

--make-directories: پوشه‌های والد مورد نیاز را در صورت لزوم ایجاد می‌کند. این گزینه فقط در حالت --extract در نظر گرفته می‌شود.

-P LIST, --parts LIST

فقط روی آرشیوهای cpio که با LIST مطابقت دارند کار می‌کند. این گزینه فقط در حالت‌های --list و --extract در نظر گرفته می‌شود. LIST از یک محدوده یا چندین محدوده جداشده با ویرگول تشکیل شده است. هر محدوده یکی از موارد زیر است:

N

آرشیو cpio شماره Nام، شمارش‌شده از ۱

N-

از آرشیو cpio شماره Nام (شامل خودش) تا آخرین آرشیو

N-M

از آرشیو cpio شماره Nام تا Mام (شامل هر دو)

-M

از اولین آرشیو تا آرشیو cpio شماره Mام (شامل خودش)

-p, --preserve-permissions

مجوزهای فایل‌های استخراج‌شده را برابر با مقادیر ثبت‌شده در آرشیو تنظیم می‌کند (پیش‌فرض برای کاربر ارشد/ریشه). این گزینه فقط در حالت --extract در نظر گرفته می‌شود.

--raw

از یک قالب خروجی ماشین‌خوان استفاده می‌کند. این قالب برای تجزیه آسان و استفاده در اسکریپت‌ها طراحی شده است. این گزینه فقط در حالت --examine در نظر گرفته می‌شود.

-s NAME, --subdir=NAME

آرشیوهای cpio را در زیرپوشه‌های جداگانه استخراج می‌کند (با استفاده از NAME داده‌شده به همراه یک عدد افزایشی). این گزینه فقط در حالت --extract در نظر گرفته می‌شود.

--to-stdout

فایل‌ها را در خروجی استاندارد استخراج می‌کند. فقط محتوای فایل‌ها در خروجی استاندارد نوشته می‌شود. دایرکتوری‌ها و پیوندهای نمادین نادیده گرفته می‌شوند. این گزینه فقط در حالت --extract در نظر گرفته می‌شود.

-v, --verbose

خروجی با جزئیات کامل. این گزینه فقط در حالت‌های --extract و --list در نظر گرفته می‌شود.

--debug

خروجی اشکال‌زدایی. این گزینه فقط در حالت‌های --extract و --list در نظر گرفته می‌شود.

--force

رونویسی اجباری فایل‌های موجود. این گزینه فقط در حالت --extract در نظر گرفته می‌شود.

هنگام ساخت آرشیوهای initrd cpio، قالب مانیفست زیر استفاده خواهد شد. مانیفست یک قالب متنی است که خط به خط تجزیه می‌شود.

اگر خطی با #cpio شروع شود، به‌عنوان نشانگر بخش برای شروع یک cpio جدید تفسیر می‌شود. فشرده‌سازی را می‌توان با افزودن دونقطه و به‌دنبال آن قالب فشرده‌سازی و سطح فشرده‌سازی اختیاری مشخص کرد. مثال برای cpio فشرده‌شده با Zstandard با سطح فشرده‌سازی ۹:

#cpio: zstd -9

تمام خطوطی که با # شروع می‌شوند به جز #cpio (توضیح داده شده در بالا) به‌عنوان توضیحات (کامنت) در نظر گرفته شده و نادیده گرفته می‌شوند.

هر عنصر در خط با تب (tab) جدا می‌شود و انتظار می‌رود یکی از انواع فایل‌های زیر باشد:

<location> <name> file <mode> <uid> <gid> <mtime> <filesize>
<location> <name> dir <mode> <uid> <gid> <mtime>
<location> <name> block <mode> <uid> <gid> <mtime> <major> <minor>
<location> <name> char <mode> <uid> <gid> <mtime> <major> <minor>
<location> <name> link <mode> <uid> <gid> <mtime> <target>
<location> <name> fifo <mode> <uid> <gid> <mtime>
<location> <name> sock <mode> <uid> <gid> <mtime>

نوع fifo همچنین به عنوان لوله نام‌گذاری‌شده (named pipe) شناخته می‌شود (به fifo(7) مراجعه کنید).

در صورتی که عنصری خالی یا برابر با - باشد، به عنوان مشخص‌نشده در نظر گرفته شده و از فایل ورودی استخراج می‌شود.

<location>

مسیر فایل ورودی. در صورتی که تمام فیلدهای مورد نیاز دیگر مشخص شده باشند (و فایل خالی باشد)، می‌توان این فیلد را خالی گذاشت. محدودیت: مسیر نباید با # شروع شود، برابر با - باشد، یا شامل کاراکتر تب باشد.

<name>

مسیر فایل در داخل cpio. اگر نام مشخص نشود، از <location> گرفته خواهد شد. محدودیت: مسیر نباید برابر با - باشد یا شامل کاراکتر تب باشد.

<mode>

حالت دسترسی فایل (mode) که در مبنای ۸ (اکتال) مشخص می‌شود.

<uid>

شناسه کاربری (مالک) فایل که در مبنای ۱۰ مشخص می‌شود.

<gid>

شناسه گروهی فایل که در مبنای ۱۰ مشخص می‌شود.

<mtime>

زمان آخرین تغییر فایل به صورت ثانیه‌های سپری‌شده از مبدأ یونیکس (Epoch) (1970-01-01 00:00 UTC). زمان مشخص‌شده ممکن است با زمان تعیین‌شده در متغیر محیطی SOURCE_DATE_EPOCH محدود شود.

<filesize>

اندازه فایل ورودی به بایت. در صورتی که فایل ورودی از اندازه ارائه‌شده کوچک‌تر باشد، 3cpio با خطا مواجه خواهد شد.

<major>

شماره اصلی دستگاه بلوکی/کاراکتری در مبنای ۱۰.

<minor>

شماره فرعی دستگاه بلوکی/کاراکتری در مبنای ۱۰.

<target>

مقصد پیوند نمادین. محدودیت: مسیر مقصد نباید برابر با - باشد یا شامل کاراکتر تب باشد.

محدودیت‌ها: فایل‌ها نمی‌توانند با # شروع شوند (به عنوان کامنت در نظر گرفته می‌شوند)، برابر با - باشند (به عنوان مشخص‌نشده در نظر گرفته می‌شوند)، یا شامل کاراکتر تب باشند (با تب تفکیک می‌شوند). انتظار نمی‌رود این محدودیت‌های فایل مانیفست در عمل مشکلی ایجاد کنند.

SOURCE_DATE_EPOCH

این متغیر محیطی هنگام ایجاد آرشیو cpio در نظر گرفته خواهد شد. تمام زمان‌های تغییری که جدیدتر از زمان مشخص‌شده در "SOURCE_DATE_EPOCH" باشند محدود خواهند شد. ابزارهای فشرده‌سازی در صورتی که پیاده‌سازی چندنخی آن‌ها تکرارپذیر نباشد، تنها با یک نخ (thread) اجرا می‌شوند. آرشیو cpio ایجادشده در چندین اجرای مختلف تکرارپذیر (reproducible) خواهد بود.

0

موفقیت‌آمیز.

1

شکست و خطا.

2

خطا در حین پردازش و تجزیه آرگومان‌های خط فرمان.

فهرست کردن تعداد آرشیوهای cpio موجود در یک فایل initramfs:

$ 3cpio --count /boot/initrd.img
4

بررسی محتوای initramfs cpio در یک سیستم Ubuntu 24.04:

$ 3cpio --examine /boot/initrd.img
Start     End       Size      Compr.   Extracted
0 B       148 kB    148 kB    cpio     147 kB
148 kB    13.3 MB   13.1 MB   cpio     13.1 MB
13.3 MB   55.2 MB   41.9 MB   cpio     41.7 MB
55.2 MB   62.0 MB   6.74 MB   zstd     15.6 MB

همچنین یک قالب خروجی ماشین‌خوان در دسترس است:

$ 3cpio --examine --raw /boot/initrd.img
0        148480        148480        cpio        147350
148480        13275136        13126656        cpio        13125632
13275136        55215104        41939968        cpio        41692226
55215104        61956920        6741816        zstd        15616306

این initramfs cpio از سه آرشیو cpio فشرده‌نشده و به دنبال آن یک آرشیو cpio فشرده‌شده با Zstandard تشکیل شده است.

فهرست کردن محتوای initramfs cpio در یک سیستم Ubuntu 24.04:

$ 3cpio --list /boot/initrd.img
.
kernel
kernel/x86
kernel/x86/microcode
kernel/x86/microcode/AuthenticAMD.bin
kernel
kernel/x86
kernel/x86/microcode
kernel/x86/microcode/.enuineIntel.align.0123456789abc
kernel/x86/microcode/GenuineIntel.bin
.
usr
usr/lib
usr/lib/firmware
usr/lib/firmware/3com
usr/lib/firmware/3com/typhoon.bin.zst
[...]

اولین cpio فقط شامل میکروکد AMD است. دومین cpio فقط شامل میکروکد Intel است. سومین cpio شامل فایل‌های میان‌افزار (firmware) و ماژول‌های کرنل است.

استخراج محتوای initramfs cpio در زیرپوشه initrd در یک سیستم Ubuntu 24.04:

$ 3cpio --extract -C initrd /boot/initrd.img
$ ls initrd
bin   cryptroot  init    lib    lib.usr-is-merged  run   scripts  var
conf  etc        kernel  lib64  libx32             sbin  usr

ایجاد یک آرشیو cpio مشابه سایر ابزارهای cpio با استفاده از دستور find:

$ cd inputdir && find . | sort | 3cpio --create ../example.cpio

به دلیل پشتیبانی از قالب فایل مانیفست، 3cpio می‌تواند بدون نیاز به کپی کردن فایل‌ها در یک دایرکتوری موقت، آرشیوهای cpio ایجاد کند. مثالی برای ایجاد مستقیم یک ایمیج cpio میکروکد اولیه با استفاده از فایل‌های نصب‌شده روی سیستم:

$ cat manifest
-        kernel        dir        755        0        0        1751654557
-        kernel/x86        dir        755        0        0        1752011622
/usr/lib/firmware/amd-ucode        kernel/x86/microcode
/usr/lib/firmware/amd-ucode/microcode_amd_fam19h.bin        kernel/x86/microcode/AuthenticAMD.bin
$ 3cpio --create amd-ucode.img < manifest
$ 3cpio --list --verbose amd-ucode.img
drwxr-xr-x   2 root     root            0 Jul  4 20:42 kernel
drwxr-xr-x   2 root     root            0 Jul  8 23:53 kernel/x86
drwxr-xr-x   2 root     root            0 Jun 10 10:51 kernel/x86/microcode
-rw-r--r--   1 root     root       100684 Mar 23 22:42 kernel/x86/microcode/AuthenticAMD.bin

مثالی برای ایجاد یک ایمیج initrd شامل یک cpio میکروکد اولیه فشرده‌نشده و به دنبال آن یک cpio فشرده‌شده با Zstandard:

$ cat manifest
#cpio
-        kernel        dir        755        0        0        1751654557
-        kernel/x86        dir        755        0        0        1752011622
/usr/lib/firmware/amd-ucode        kernel/x86/microcode
/usr/lib/firmware/amd-ucode/microcode_amd_fam19h.bin        kernel/x86/microcode/AuthenticAMD.bin
#cpio: zstd -9
/
/bin
/usr
/usr/bin
/usr/bin/bash
# This is a comment. Leaving the remaining files as task for the reader.
$ 3cpio --create initrd.img < manifest
$ 3cpio --examine initrd.img
Start     End       Size      Compr.   Extracted
0 B       101 kB    101 kB    cpio     101 kB
101 kB    786 kB    685 kB    zstd     1.45 MB
$ 3cpio --list --verbose initrd.img
drwxr-xr-x   2 root     root            0 Jul  4 20:42 kernel
drwxr-xr-x   2 root     root            0 Jul  8 23:53 kernel/x86
drwxr-xr-x   2 root     root            0 Jun 10 10:51 kernel/x86/microcode
-rw-r--r--   1 root     root       100684 Mar 23 22:42 kernel/x86/microcode/AuthenticAMD.bin
drwxr-xr-x   2 root     root            0 Jun  5 14:11 .
lrwxrwxrwx   1 root     root            7 Mar 20  2022 bin -> usr/bin
drwxr-xr-x   2 root     root            0 Apr 20  2023 usr
drwxr-xr-x   2 root     root            0 Jul  9 09:56 usr/bin
-rwxr-xr-x   1 root     root      1446024 Mar 31  2024 usr/bin/bash

bsdcpio(1), cpio(1), lsinitramfs(8), lsinitrd(1)

کپی‌رایت © 2024-2026 Benjamin Drung.
استفاده آزاد از این نرم‌افزار تحت شرایط مجوز ISC مجاز است.

Benjamin Drung

2026-02-15 3cpio 0.5.1