CPIO(5) File Formats Manual CPIO(5)

cpio — قالب پرونده‌های بایگانی cpio

قالب بایگانی cpio هر تعداد فایل، دایرکتوری و سایر اشیای سیستم فایل (پیوندهای نمادین، گره‌های دستگاه و غیره) را در یک جریان بایت منفرد گردآوری می‌کند.

هر شیء سیستم فایل در یک بایگانی cpio شامل یک رکورد سرآیند با فراداده‌های عددی اساسی است که پس از آن نام مسیر کامل مدخل و داده‌های فایل قرار می‌گیرد. رکورد سرآیند مجموعه‌ای از مقادیر صحیح را ذخیره می‌کند که عموماً از فیلدهای موجود در struct stat پیروی می‌کنند. (برای جزئیات به stat(2) مراجعه کنید.) گونه‌های مختلف عمدتاً در نحوه ذخیره‌سازی این اعداد صحیح (دودویی، مبنای هشت یا شانزده‌شانزدهی) با یکدیگر تفاوت دارند. به دنبال سرآیند، نام مسیر مدخل (طول نام مسیر در سرآیند ذخیره می‌شود) و هرگونه داده فایل قرار می‌گیرد. پایان بایگانی با یک رکورد ویژه با نام مسیر “TRAILER!!!” مشخص می‌شود.

قالب دودویی PWB cpio قالب اولیه است، زمانی که cpio به عنوان بخشی از سیستم Programmer's Work Bench (گونه‌ای از ویرایش ششم یونیکس) معرفی شد. این قالب اعداد را به صورت مقادیر دودویی ۲ بایتی و ۴ بایتی ذخیره می‌کند. هر مدخل با یک سرآیند در قالب زیر آغاز می‌شود:

struct header_pwb_cpio {
        short   h_magic;
        short   h_dev;
        short   h_ino;
        short   h_mode;
        short   h_uid;
        short   h_gid;
        short   h_nlink;
        short   h_majmin;
        long    h_mtime;
        short   h_namesize;
        long    h_filesize;
};

فیلدهای short در اینجا مقادیر صحیح ۱۶ بیتی هستند، در حالی که فیلدهای long اعداد صحیح ۳۲ بیتی می‌باشند. از آنجا که PWB UNIX، مانند ویرایش ششم یونیکس که بر پایه آن بود، تنها بر روی رایانه‌های PDP-11 اجرا می‌شد، این فیلدها در قالب ترتیب بایتی PDP (یا PDP-endian) هستند که مقادیر short در آن به صورت کم‌ارزش-نخست و مقادیر long به صورت باارزش-نخست ذخیره می‌شوند. بدین معنی که عدد صحیح long با نمایش شانزده‌شانزدهی 0x12345678 در چهار بایت متوالی به صورت 0x34، 0x12، 0x78، 0x56 ذخیره می‌شود. فیلدها به شرح زیر هستند:

h_magic
مقدار صحیح مبنای هشت 070707.
h_dev, h_ino
شماره‌های دستگاه و inode از دیسک. این مقادیر توسط برنامه‌هایی که بایگانی‌های cpio را می‌خوانند استفاده می‌شوند تا مشخص شود چه زمانی دو مدخل به یک فایل اشاره دارند. برنامه‌هایی که بایگانی‌های cpio را ایجاد می‌کنند باید دقت داشته باشند که این فیلدها را برای هر مدخل روی مقادیر متمایزی تنظیم کنند.
h_mode
حالت هم مجوزهای معمول و هم نوع فایل را مشخص می‌کند، و همچنین شامل دو بیت است که به قالب cpio ارتباطی ندارند، زیرا این فیلد در واقع یک کپی خام از فیلد mode در inode معرف فایل است. این‌ها پرچم IALLOC (که نشان می‌دهد مدخل inode در حال استفاده است) و پرچم ILARG (که نشان می‌دهد فایلِ نشان داده شده آن‌قدر بزرگ است که اشاره‌گرهای بلوک غیرمستقیم در inode داشته باشد) هستند. حالت به صورت زیر رمزگشایی می‌شود:
0100000
پرچم IALLOC - برای cpio نامربوط است.
0060000
این ماسک بیت‌های نوع فایل است.
0040000
مقدار نوع فایل برای دایرکتوری‌ها.
0020000
مقدار نوع فایل برای دستگاه‌های ویژه نویسه‌ای.
0060000
مقدار نوع فایل برای دستگاه‌های ویژه بلوکی.
0010000
پرچم ILARG - برای cpio نامربوط است.
0004000
بیت SUID.
0002000
بیت SGID.
0001000
بیت چسبنده (Sticky bit).
0000777
۹ بیت پایین‌تر مجوزهای خواندن/نوشتن/اجرا را برای دیگران (world)، گروه و کاربر طبق قراردادهای استاندارد POSIX مشخص می‌کنند.
h_uid, h_gid
شناسه عددی کاربر و شناسه گروه مالک.
تعداد پیوندها به این فایل. دایرکتوری‌ها همیشه مقداری حداقل برابر با ۲ در اینجا دارند. توجه داشته باشید که فایل‌های دارای پیوند سخت همراه با هر نسخه در بایگانی داده‌های فایل را شامل می‌شوند.
h_majmin
برای مدخل‌های ویژه بلوکی و ویژه نویسه‌ای، این فیلد شامل شماره دستگاه مربوطه است، که در آن شماره اصلی در بایت باارزش و شماره فرعی در بایت کم‌ارزش قرار دارد. برای تمام انواع دیگر مدخل‌ها، این فیلد باید توسط نویسنده‌ها روی صفر تنظیم شده و توسط خواننده‌ها نادیده گرفته شود.
h_mtime
زمان تغییر فایل، که به صورت تعداد ثانیه‌های گذشته از مبدأ زمانی یونیکس (Epoch)، یعنی ساعت 00:00:00 UTC در ۱ ژانویه ۱۹۷۰ نشان داده می‌شود.
h_namesize
تعداد بایت‌های موجود در نام مسیر که به دنبال سرآیند می‌آید. این شمارش شامل بایت NUL پایانی نیز می‌شود.
h_filesize
اندازه فایل. توجه داشته باشید که این قالب بایگانی به اندازه فایل ۱۶ مگابایت محدود است، زیرا PWB UNIX همانند ویرایش ششم، در ساختار داخلی تنها از یک عدد صحیح ۲۴ بیتی بدون علامت برای اندازه فایل استفاده می‌کرد.

نام مسیر بلافاصله پس از سرآیند ثابت قرار می‌گیرد. اگر h_namesize فرد باشد، یک بایت NUL اضافی پس از نام مسیر اضافه می‌شود. سپس داده‌های فایل اضافه می‌شوند، و در صورت نیاز مجدداً یک بایت NUL الحاق می‌شود تا سرآیند بعدی در یک آفست زوج قرار گیرد.

با فایل‌های دارای پیوند سخت رفتار ویژه‌ای نمی‌شود؛ محتویات کامل فایل در هر نسخه از فایل گنجانده می‌شود.

قالب دودویی جدید cpio زمانی پدیدار شد که cpio در اواخر ویرایش هفتم یونیکس به کار گرفته شد. این قالب دقیقاً مشابه قالب دودویی PWB است که در بالا شرح داده شد، به جز سه تغییر:

نخست اینکه، یونیکس اکنون روی بیش از یک نوع سخت‌افزار اجرا می‌شد، بنابراین ترتیب بایت‌ها برای اعداد صحیح ۱۶ بیتی باید با بررسی عدد جادویی در ابتدای سرآیند مشخص می‌شد. با این وجود، اعداد صحیح ۳۲ بیتی همچنان همیشه با کلمه پرارزش‌تر در ابتدا ذخیره می‌شوند، بنابراین هر یک از آن دو مقدار، در ساختار نشان‌داده‌شده در بالا، به صورت آرایه‌ای از دو عدد صحیح ۱۶ بیتی با ترتیب سنتی ذخیره می‌شدند. به این اعداد صحیح ۱۶ بیتی، همانند تمام موارد دیگر در ساختار، با استفاده از ماکرویی دسترسی پیدا می‌شد که در صورت نیاز بایت‌های آن‌ها را جابه‌جا می‌کرد.

مورد بعد اینکه، ویرایش هفتم انواع فایل بیشتری برای ذخیره‌سازی داشت، و بیت‌های پرچم IALLOC و ILARG برای تطبیق با این موارد تغییر کاربرد یافتند. استفاده بازنگری‌شده از بیت‌های مختلف به صورت زیر است:

0170000
این ماسک بیت‌های نوع فایل است.
0140000
مقدار نوع فایل برای سوکت‌ها.
0120000
مقدار نوع فایل برای پیوندهای نمادین. برای پیوندهای نمادین، متن پیوند به عنوان داده فایل ذخیره می‌شود.
0100000
مقدار نوع فایل برای فایل‌های عادی.
0060000
مقدار نوع فایل برای دستگاه‌های ویژه بلوکی.
0040000
مقدار نوع فایل برای دایرکتوری‌ها.
0020000
مقدار نوع فایل برای دستگاه‌های ویژه نویسه‌ای.
0010000
مقدار نوع فایل برای لوله‌های نام‌گذاری‌شده یا FIFOها.
0004000
بیت SUID.
0002000
بیت SGID.
0001000
بیت چسبنده (Sticky bit).
0000777
۹ بیت پایین‌تر مجوزهای خواندن/نوشتن/اجرا را برای دیگران (world)، گروه و کاربر طبق قراردادهای استاندارد POSIX مشخص می‌کنند.

در نهایت، فیلد اندازه فایل اکنون نشان‌دهنده یک عدد صحیح علامت‌دار ۳۲ بیتی در سیستم فایل زیربنایی است، بنابراین حداکثر اندازه فایل به ۲ گیگابایت افزایش یافته است.

توجه داشته باشید که هیچ راه واضحی برای تشخیص اینکه یک بایگانی از کدام‌یک از دو قالب دودویی استفاده می‌کند وجود ندارد، مگر اینکه بررسی شود کدام‌یک منطقی‌تر به نظر می‌رسد. سناریوی خطای معمول این است که اگر یک بایگانی قالب PWB به گونه‌ای استخراج شود که گویی در قالب جدید است، به جای دایرکتوری‌ها سوکت‌های نام‌گذاری‌شده ایجاد می‌کند، و سپس در استخراج فایل‌هایی که باید در آن دایرکتوری‌ها قرار گیرند با شکست مواجه می‌شود. اجرای bsdcpio -itv روی یک بایگانی ناشناخته به وضوح مشخص می‌کند که با کدام قالب روبرو هستید: اگر قالب PWB باشد، دایرکتوری‌ها به جای نویسه ‘d’ با نویسه ‘s’ به عنوان نخستین نویسه از رشته mode فهرست می‌شوند، و فایل‌های بزرگ‌تر دارای یک ‘’? در آن موقعیت خواهند بود.

استاندارد Version 2 of the Single UNIX Specification (“SUSv2”) یک گونه اسکی را استانداردسازی کرد که در میان تمام پلتفرم‌ها قابل حمل است. این قالب عموماً به عنوان قالب “نویسه‌ای قدیمی” یا به عنوان قالب “odc” شناخته می‌شود. این قالب همان فیلدهای عددی قالب دودویی قدیمی را ذخیره می‌کند، اما آن‌ها را به صورت مقادیر مبنای هشت ۶ نویسه‌ای یا ۱۱ نویسه‌ای نمایش می‌دهد.

struct cpio_odc_header {
        char    c_magic[6];
        char    c_dev[6];
        char    c_ino[6];
        char    c_mode[6];
        char    c_uid[6];
        char    c_gid[6];
        char    c_nlink[6];
        char    c_rdev[6];
        char    c_mtime[11];
        char    c_namesize[6];
        char    c_filesize[11];
};

فیلدها دقیقاً مشابه موارد موجود در قالب دودویی جدید هستند. نام و بدنه فایل به دنبال سرآیند ثابت قرار می‌گیرند. برخلاف قالب‌های دودویی، هیچ فاصله‌گذاری (padding) اضافی بعد از نام مسیر یا محتویات فایل وجود ندارد. اگر فایل‌هایی که بایگانی می‌شوند خودشان کاملاً اسکی باشند، بایگانی حاصل نیز کاملاً اسکی خواهد بود، به جز بایت NUL که پایان فیلد نام را مشخص می‌کند.

قالب اسکی "جدید" از فیلدهای شانزده‌شانزدهی ۸ بایتی برای تمامی اعداد استفاده می‌کند و شماره‌های دستگاه را به فیلدهای جداگانه‌ای برای شماره‌های اصلی و فرعی تفکیک می‌نماید.

struct cpio_newc_header {
        char    c_magic[6];
        char    c_ino[8];
        char    c_mode[8];
        char    c_uid[8];
        char    c_gid[8];
        char    c_nlink[8];
        char    c_mtime[8];
        char    c_filesize[8];
        char    c_devmajor[8];
        char    c_devminor[8];
        char    c_rdevmajor[8];
        char    c_rdevminor[8];
        char    c_namesize[8];
        char    c_check[8];
};

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

magic
رشته “070701”.
check
این فیلد همیشه توسط نویسنده‌ها روی صفر تنظیم شده و توسط خواننده‌ها نادیده گرفته می‌شود. برای جزئیات بیشتر به بخش بعدی مراجعه کنید.

نام مسیر با بایت‌های NUL دنبال می‌شود تا اندازه کل سرآیند ثابت به اضافه نام مسیر مضربی از چهار باشد. به همین ترتیب، داده‌های فایل نیز تا مضربی از چهار بایت پر می‌شوند. توجه داشته باشید که این قالب تنها از فایل‌های تا ۴ گیگابایت پشتیبانی می‌کند (برخلاف قالب اسکی قدیمی‌تر که از فایل‌های ۸ گیگابایتی پشتیبانی می‌کرد).

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

قالب CRC دقیقاً مشابه قالب اسکی جدید است که در بخش پیشین شرح داده شد، با این تفاوت که فیلد magic روی “070702” تنظیم می‌شود و فیلد check روی مجموع تمام بایت‌های موجود در داده‌های فایل تنظیم می‌گردد. این مجموع با در نظر گرفتن تمام بایت‌ها به عنوان مقادیر بدون علامت و با استفاده از محاسبات بدون علامت محاسبه می‌شود. تنها ۳۲ بیت کم‌ارزش‌تر مجموع ذخیره می‌شود.

پیاده‌سازی cpio توزیع‌شده همراه با HPUX از XXXX استفاده می‌کرد اما شماره‌های دستگاه را به گونه متفاوتی ذخیره می‌کرد XXX.

سیستم Sun Solaris از انواع فایل تکمیلی برای ذخیره داده‌های گسترش‌یافته فایل، از جمله فهرست‌های کنترل دسترسی (ACL) و صفات گسترش‌یافته، به عنوان مدخل‌های ویژه در بایگانی‌های cpio استفاده می‌کند.

XXX Others? XXX

cpio(1), tar(5)

ابزار cpio دیگر بخشی از POSIX یا Single Unix Standard نیست. این ابزار آخرین بار در Version 2 of the Single UNIX Specification (“SUSv2”) ظاهر شد. در استانداردهای بعدی، ابزار pax(1) جایگزین آن شده است. قالب اسکی قابل حمل در حال حاضر بخشی از مشخصات ابزار pax(1) است.

ابزار اصلی cpio توسط دیک هایت (Dick Haight) در زمان فعالیتش در گروه پشتیبانی یونیکس AT&T نوشته شد. این ابزار در سال ۱۹۷۷ به عنوان بخشی از PWB/UNIX 1.0 ظاهر شد؛ “Programmer's Work Bench” مشتق‌شده از Version 6 AT&T UNIX که در داخل AT&T مورد استفاده قرار می‌گرفت. طبق سورس System III منتشرشده توسط SCO تحت مجوز “Ancient Unix” آن‌ها، هر دو قالب دودویی جدید و نویسه‌ای قدیمی تا سال ۱۹۸۰ مورد استفاده بودند. قالب نویسه‌ای به عنوان بخشی از IEEE Std 1003.1-1988 (“POSIX.1”) پذیرفته شد. XXX when did "newc" appear? Who invented it? When did HP come out with their variant? When did Sun introduce ACLs and extended attributes? XXX

نام قالب “CRC” نادرست انتخاب شده است، چرا که از یک چِک‌سام ساده استفاده می‌کند و نه از یک بررسی افزونگی چرخشی (cyclic redundancy check).

قالب‌های دودویی برای شناسه کاربر، شناسه گروه، شماره‌های دستگاه و inode به ۱۶ بیت محدود هستند. آن‌ها به ترتیب برای گونه‌های قدیمی‌تر و جدیدتر به اندازه‌های فایل ۱۶ مگابایت و ۲ گیگابایت محدود می‌باشند.

قالب اسکی قدیمی برای شناسه کاربر، شناسه گروه، شماره‌های دستگاه و inode به ۱۸ بیت محدود است. این قالب به اندازه فایل ۸ گیگابایت محدود می‌باشد.

قالب اسکی جدید به اندازه فایل ۴ گیگابایت محدود است.

هیچ‌یک از قالب‌های cpio نام‌های کاربر یا گروه را ذخیره نمی‌کنند، در حالی که این نام‌ها هنگام انتقال فایل‌ها بین سیستم‌هایی با شماره‌گذاری کاربری یا گروهی ناهمسان ضروری هستند.

به ویژه هنگام نوشتن گونه‌های قدیمی‌تر cpio، ممکن است لازم باشد مقادیر واقعی دستگاه/inode به مقادیر ساختگی که در فیلدهای موجود می‌گنجند نگاشت شوند. در سیستم‌های فایل بسیار بزرگ، ممکن است این امر حتی برای قالب‌های جدیدتر نیز ضروری باشد.

December 23, 2011 Linux 6.12.107+deb13-amd64