| CPIO(5) | File Formats Manual | CPIO(5) |
نام (NAME)
cpio —
قالب
پروندههای
بایگانی cpio
توضیحات (DESCRIPTION)
قالب
بایگانی
cpio هر
تعداد
فایل،
دایرکتوری
و سایر
اشیای
سیستم فایل
(پیوندهای
نمادین،
گرههای
دستگاه و
غیره) را در
یک جریان
بایت منفرد
گردآوری
میکند.
قالب کلی (General Format)
هر شیء
سیستم فایل
در یک
بایگانی
cpio شامل
یک رکورد
سرآیند با
فرادادههای
عددی اساسی
است که پس از
آن نام مسیر
کامل مدخل و
دادههای
فایل قرار
میگیرد.
رکورد
سرآیند
مجموعهای
از مقادیر
صحیح را
ذخیره
میکند که
عموماً از
فیلدهای
موجود در
struct stat پیروی
میکنند.
(برای
جزئیات به
stat(2)
مراجعه
کنید.)
گونههای
مختلف
عمدتاً در
نحوه
ذخیرهسازی
این اعداد
صحیح
(دودویی،
مبنای هشت
یا
شانزدهشانزدهی)
با یکدیگر
تفاوت
دارند. به
دنبال
سرآیند،
نام مسیر
مدخل (طول
نام مسیر در
سرآیند
ذخیره
میشود) و
هرگونه
داده فایل
قرار
میگیرد.
پایان
بایگانی با
یک رکورد
ویژه با نام
مسیر “TRAILER!!!”
مشخص
میشود.
قالب PWB (PWB format)
قالب
دودویی 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_nlink
- تعداد پیوندها به این فایل. دایرکتوریها همیشه مقداری حداقل برابر با ۲ در اینجا دارند. توجه داشته باشید که فایلهای دارای پیوند سخت همراه با هر نسخه در بایگانی دادههای فایل را شامل میشوند.
- h_majmin
- برای مدخلهای ویژه بلوکی و ویژه نویسهای، این فیلد شامل شماره دستگاه مربوطه است، که در آن شماره اصلی در بایت باارزش و شماره فرعی در بایت کمارزش قرار دارد. برای تمام انواع دیگر مدخلها، این فیلد باید توسط نویسندهها روی صفر تنظیم شده و توسط خوانندهها نادیده گرفته شود.
- h_mtime
- زمان تغییر فایل، که به صورت تعداد ثانیههای گذشته از مبدأ زمانی یونیکس (Epoch)، یعنی ساعت 00:00:00 UTC در ۱ ژانویه ۱۹۷۰ نشان داده میشود.
- h_namesize
- تعداد بایتهای موجود در نام مسیر که به دنبال سرآیند میآید. این شمارش شامل بایت NUL پایانی نیز میشود.
- h_filesize
- اندازه فایل. توجه داشته باشید که این قالب بایگانی به اندازه فایل ۱۶ مگابایت محدود است، زیرا PWB UNIX همانند ویرایش ششم، در ساختار داخلی تنها از یک عدد صحیح ۲۴ بیتی بدون علامت برای اندازه فایل استفاده میکرد.
نام مسیر
بلافاصله
پس از
سرآیند
ثابت قرار
میگیرد.
اگر h_namesize
فرد باشد،
یک بایت NUL
اضافی پس از
نام مسیر
اضافه
میشود. سپس
دادههای
فایل اضافه
میشوند، و
در صورت
نیاز
مجدداً یک
بایت NUL
الحاق
میشود تا
سرآیند
بعدی در یک
آفست زوج
قرار گیرد.
با فایلهای دارای پیوند سخت رفتار ویژهای نمیشود؛ محتویات کامل فایل در هر نسخه از فایل گنجانده میشود.
قالب دودویی جدید (New Binary Format)
قالب
دودویی
جدید 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 فهرست میشوند، و فایلهای بزرگتر دارای یک ‘’? در آن موقعیت خواهند بود.
قالب اسکی قابل حمل (Portable ASCII Format)
استاندارد 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 که پایان فیلد نام را مشخص میکند.
قالب اسکی جدید (New ASCII Format)
قالب اسکی "جدید" از فیلدهای شانزدهشانزدهی ۸ بایتی برای تمامی اعداد استفاده میکند و شمارههای دستگاه را به فیلدهای جداگانهای برای شمارههای اصلی و فرعی تفکیک مینماید.
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 جدید (New CRC Format)
قالب CRC دقیقاً مشابه قالب اسکی جدید است که در بخش پیشین شرح داده شد، با این تفاوت که فیلد magic روی “070702” تنظیم میشود و فیلد check روی مجموع تمام بایتهای موجود در دادههای فایل تنظیم میگردد. این مجموع با در نظر گرفتن تمام بایتها به عنوان مقادیر بدون علامت و با استفاده از محاسبات بدون علامت محاسبه میشود. تنها ۳۲ بیت کمارزشتر مجموع ذخیره میشود.
گونههای HP (HP variants)
پیادهسازی
cpio
توزیعشده
همراه با HPUX
از XXXX
استفاده
میکرد اما
شمارههای
دستگاه را
به گونه
متفاوتی
ذخیره
میکرد XXX.
سایر پسوندها و گونهها (Other Extensions and Variants)
سیستم Sun Solaris از انواع فایل تکمیلی برای ذخیره دادههای گسترشیافته فایل، از جمله فهرستهای کنترل دسترسی (ACL) و صفات گسترشیافته، به عنوان مدخلهای ویژه در بایگانیهای cpio استفاده میکند.
XXX Others? XXX
همچنین ببینید (SEE ALSO)
استانداردها (STANDARDS)
ابزار
cpio دیگر
بخشی از POSIX یا
Single Unix Standard نیست.
این ابزار
آخرین بار
در Version 2 of the Single UNIX
Specification (“SUSv2”)
ظاهر شد. در
استانداردهای
بعدی،
ابزار
pax(1)
جایگزین آن
شده است.
قالب اسکی
قابل حمل در
حال حاضر
بخشی از
مشخصات
ابزار
pax(1) است.
تاریخچه (HISTORY)
ابزار اصلی 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
اشکالات (BUGS)
نام قالب “CRC” نادرست انتخاب شده است، چرا که از یک چِکسام ساده استفاده میکند و نه از یک بررسی افزونگی چرخشی (cyclic redundancy check).
قالبهای دودویی برای شناسه کاربر، شناسه گروه، شمارههای دستگاه و inode به ۱۶ بیت محدود هستند. آنها به ترتیب برای گونههای قدیمیتر و جدیدتر به اندازههای فایل ۱۶ مگابایت و ۲ گیگابایت محدود میباشند.
قالب اسکی قدیمی برای شناسه کاربر، شناسه گروه، شمارههای دستگاه و inode به ۱۸ بیت محدود است. این قالب به اندازه فایل ۸ گیگابایت محدود میباشد.
قالب اسکی جدید به اندازه فایل ۴ گیگابایت محدود است.
هیچیک از قالبهای cpio نامهای کاربر یا گروه را ذخیره نمیکنند، در حالی که این نامها هنگام انتقال فایلها بین سیستمهایی با شمارهگذاری کاربری یا گروهی ناهمسان ضروری هستند.
به ویژه هنگام نوشتن گونههای قدیمیتر cpio، ممکن است لازم باشد مقادیر واقعی دستگاه/inode به مقادیر ساختگی که در فیلدهای موجود میگنجند نگاشت شوند. در سیستمهای فایل بسیار بزرگ، ممکن است این امر حتی برای قالبهای جدیدتر نیز ضروری باشد.
| December 23, 2011 | Linux 6.12.107+deb13-amd64 |