انواع فایل سیستم های لینوکس و ویژگی های آنها ایجاد و توسعه سیستم فایل EXT2 فایل سیستم Ext2 3

اکنون ما محبوب ترین سیستم فایل دیسک لینوکس ، ext2 را شرح می دهیم. اولین نسخه لینوکس از سیستم فایل MINIX 1 استفاده کرد که دارای نام فایل های کوتاه و حداکثر حجم فایل 64 مگابایت بود. سیستم فایل MINIX 1 سرانجام با اولین سیستم فایل توسعه یافته ، ext جایگزین شد ، که نام فایل های طولانی تر و اندازه فایل های بزرگتر را امکان پذیر می کرد. به دلیل بازدهی پایین (از نظر عملکرد) ، ext با جانشین ext2 جایگزین شد که امروزه نیز بسیار مورد استفاده قرار می گیرد.

یک پارتیشن دیسک ext2 شامل سیستم فایل نشان داده شده در شکل 1 است. طرح 10.17. بلوک 0 توسط لینوکس استفاده نمی شود و شامل کد بوت برای رایانه است. پس از بلوک 0 ، پارتیشن دیسک به گروههای بلوک (بدون در نظر گرفتن محدوده استوانه های دیسک) تقسیم می شود. هر گروه به شرح زیر سازماندهی شده است.


اولین بلوک یک ابر بلوک است که اطلاعات مربوط به طرح سیستم فایل را شامل تعداد گره های i ، تعداد بلوک های دیسک ، ابتدای لیست بلوک های دیسک رایگان (این معمولاً چند صد عنصر است) ذخیره می کند. سپس یک توصیف گر گروهی حاوی اطلاعاتی در مورد محل قرارگیری بیت مپ ها ، تعداد بلوک های رایگان و i-nodes در گروه و تعداد دایرکتوری های گروه به دنبال دارد. این اطلاعات مهم است زیرا سیستم فایل ext2 سعی می کند دایرکتوری ها را به طور مساوی در دیسک توزیع کند.

این دو نقشه بیت بلاک های رایگان و i-node های رایگان را پیگیری می کند (این نیز از سیستم فایل MINIX 1 به ارث رسیده است و آن را از اکثر فایل سیستم های UNIX که از لیست بلاک های رایگان استفاده می کنند متمایز می کند). اندازه هر نقشه بیت یک بلوک است. با اندازه بلوک 1 کیلوبایت ، این طرح اندازه گروه بلوک را به 8192 بلوک و 8192 گره i محدود می کند. عدد اول یک محدودیت واقعی است و دومی عملاً هیچ. برای بلوک های 4KB ، اعداد چهار برابر بزرگتر هستند.

سپس خود گره های i واقع می شوند. آنها از 1 تا حداکثر شماره گذاری می شوند. اندازه هر گره i 128 بایت است و دقیقاً یک فایل را توصیف می کند. i-node شامل اطلاعات حسابداری (شامل همه چیز که توسط stat بازگردانده می شود ، و به سادگی آن را از i-node می گیرد) ، و همچنین اطلاعات کافی برای قرار دادن تمام بلوک های دیسک که حاوی داده های فایل هستند ، می باشد.

گره های i با بلوک های داده دنبال می شوند. همه فایلها و فهرستها در اینجا ذخیره می شوند. اگر یک فایل یا فهرست از بیش از یک بلوک تشکیل شده باشد ، لازم نیست این بلوک ها روی دیسک مجاور باشند. در حقیقت ، بلوک های یک فایل بزرگ به احتمال زیاد در سراسر دیسک پراکنده شده اند.

گره های مربوطه در همه گروه های بلوک دیسک پراکنده شده اند. Ext2 سعی می کند فایلهای معمولی را در گروه بلاک مشابه فهرست اصلی و فایلهای داده را در همان بلوک i-node منبع منبع قرار دهد (با فرض وجود فضای کافی در آنجا). این ایده از سیستم فایل سریع برکلی (McKusick و همکاران ، 1984) وام گرفته شده است. از Bitmap برای تصمیم گیری در مورد تخصیص سریع استفاده می شود

فضایی برای داده های جدید سیستم فایل

هنگامی که بلوک های فایل جدید اختصاص داده می شوند ، ext2 همچنین چند (هشت) بلوک اضافی را برای همان فایل پیش تخصیص می دهد (برای به حداقل رساندن تکه تکه شدن فایل به دلیل نوشتن های بعدی). این طرح سیستم فایل را در کل دیسک توزیع می کند. همچنین عملکرد خوبی دارد (به دلیل تمایل متقابل و کاهش تکه تکه شدن).

برای دسترسی به فایل ، ابتدا باید از یکی از فراخوان های سیستم لینوکس (مانند باز) استفاده کنید ، که برای آن باید مسیر فایل را مشخص کنید. این مسیر تجزیه شده و فهرستهای تشکیل دهنده آن از آن استخراج می شوند. اگر یک مسیر نسبی مشخص شده باشد ، جستجو از فهرست فعلی فرآیند و در غیر این صورت - از فهرست اصلی شروع می شود. در هر صورت ، i-node اولین فهرست به آسانی یافت می شود: در توصیف کننده فرآیند اشاره گر آن وجود دارد ، یا (در مورد فهرست اصلی) در یک بلوک خاص روی دیسک ذخیره می شود.

دایرکتوری به شما اجازه می دهد تا از نام فایلها تا حداکثر 255 کاراکتر استفاده کنید (شکل 10.18). هر فهرست شامل تعدادی بلوک دیسک است (به طوری که فهرست را می توان بصورت اتمی روی دیسک نوشت). در یک فهرست ، موارد مربوط به پرونده ها و فهرست ها به ترتیب مرتب نشده اند (هر مورد بلافاصله پس از مورد قبلی). عناصر نمی توانند از مرزهای بلوک عبور کنند ، بنابراین معمولاً در انتهای هر بلوک دیسک مقداری بایت استفاده نشده وجود دارد.


هر ورودی فهرست در شکل. 10.18 شامل چهار فیلد با طول ثابت و یک فیلد با طول متغیر است. اولین فیلد شماره i-node 19 برای فایل عظیم ، 42 برای فایل حجیم و 88 برای فهرست bigdir است. پس از آن فیلد rec_len اندازه کل ورودی فهرست به بایت (احتمالاً با متغیرهایی بعد از نام) را ارائه می دهد. این فیلد برای یافتن رکورد بعدی مورد نیاز است (در صورتی که نام فایل با تعداد نامعلوم بایت ضمیمه شود). در شکل ، این قسمت با یک پیکان مشخص شده است. سپس فیلدی از نوع فایل ، فهرست و غیره وجود دارد. آخرین فیلد با طول ثابت شامل طول نام فایل در بایت است (برای این مثال 8 ، 10 و 6). سرانجام ، نام فایل وجود دارد ، که توسط یک بایت تهی خاتمه یافته و به یک مرز 32 بیتی اضافه می شود. ممکن است بایت های پرکننده دیگری در پی داشته باشد.

در شکل 10.18b همان فهرست را پس از حذف مورد برای voluminous نشان می دهد. تنها کاری که در دایرکتوری انجام می شود این است که تعداد فیلد اندازه رکورد فایل عظیم قبلی افزایش یابد و بایت های پرونده دایرکتوری برای فایل حجیم از راه دور برای اولین رکورد به متغیرهایی تبدیل شوند. بعداً ، از این بایت ها می توان هنگام نوشتن یک فایل جدید برای نوشتن استفاده کرد.

از آنجا که دایرکتوری ها به صورت خطی جستجو می شوند ، یافتن مدخل در انتهای یک فهرست بزرگ می تواند زمان زیادی طول بکشد. بنابراین ، سیستم ذخیره دایرکتوری هایی را که به تازگی به آنها دسترسی پیدا کرده اید ذخیره می کند. جستجو در حافظه پنهان با نام فایل انجام می شود ، و در صورت یافتن ، دیگر نیازی به جستجوی خطی گران نیست. دندانپزشکی برای هر یک از اجزای مسیر وارد حافظه پنهان دایرکتوری می شود و (از طریق i-node آن) دایرکتوری برای ورودهای بعدی مسیر جستجو می شود (تا زمانی که گره i واقعی فایل پیدا شود).

برای مثال ، برای یافتن یک فایل مشخص شده توسط یک مسیر مطلق (مانند / usr / ast / file) ، این مراحل را دنبال کنید. ابتدا ، سیستم فهرست اصلی را پیدا می کند ، که معمولاً از i-node شماره 2 استفاده می کند (به ویژه هنگامی که i-node شماره 1 برای بلاک های بد ذخیره شده است). این مورد مربوطه را در حافظه پنهان ورودی فهرست (برای جستجوهای بعدی برای فهرست اصلی) ذخیره می کند. سپس دایرکتوری اصلی را برای رشته "usr" جستجو می کند تا شماره i-node برای فهرست / usr (که در حافظه پنهان ورودی فهرست نیز ذخیره شده است) را بدست آورد. سپس این گره i خوانده می شود و بلوک های دیسک از آن استخراج می شوند ، بنابراین می توانید فهرست / usr را بخوانید و رشته "ast" را جستجو کنید. هنگامی که عنصر مربوطه پیدا شد ، می توان از آن برای تعیین شماره i-node برای پوشه / usr / ast استفاده کرد. با توجه به این شماره i-node ، می توان آن را خواند و در بلوک های فهرست پیدا کرد. در نهایت ، ما "file" را جستجو می کنیم و شماره i-node آن را پیدا می کنیم. بنابراین ، استفاده از یک مسیر نسبی نه تنها برای کاربر راحت تر است ، بلکه میزان کار سیستم را نیز کاهش می دهد.

در صورت موجود بودن فایل ، سیستم شماره i-node را بازیابی کرده و از آن به عنوان فهرست جدول i-node (روی دیسک) برای پیدا کردن i-n مربوطه و خواندن آن در حافظه استفاده می کند. این گره i در جدول i-node قرار می گیرد-یک ساختار داده کرنل که شامل تمام i-nodes برای باز شدن در این لحظهفایل ها و دایرکتوری ها قالب عناصر i-node باید (حداقل) شامل تمام فیلدهایی باشد که توسط سیستم stat بازگردانده می شود تا stat کار کند (جدول 10.10 را ببینید). جدول 10.13 برخی از زمینه های ساختار i-node را نشان می دهد که توسط سیستم فایل لینوکس پشتیبانی می شود. ساختار واقعی i-node شامل زمینه های بیشتری است ، زیرا از همین ساختار برای نمایش فهرستها ، دستگاهها و سایر فایلهای خاص استفاده می شود. ساختار i-node همچنین شامل زمینه هایی است که برای استفاده در آینده محفوظ است. تاریخ نشان داده است که بیت های بلا استفاده برای مدت طولانی بیکار نمی مانند.

حال بیایید ببینیم سیستم چگونه فایل را می خواند. به یاد داشته باشید که یک فراخوان معمولی رویه کتابخانه برای شروع فراخوانی سیستم خوانده شده به این شکل است:

n = خواندن (fd ، بافر ، nbytes) ؛


هنگامی که هسته کنترل را به دست آورد ، تنها چیزی که می تواند با آن شروع شود این سه پارامتر و اطلاعات موجود در جداول داخلی آن (مربوط به کاربر) است. یکی از عناصر این جداول داخلی مجموعه ای از توصیف کننده های فایل است. این فهرست توسط توصیف کننده های فایل نمایه می شود و شامل یک عنصر برای هر فایل باز است (حداکثر حداکثر تعداد معینی که معمولاً 32 است).

ایده این است که با این توصیف کننده فایل شروع کنید و با گره مناسب پایان دهید. بیایید یک طرح کاملاً ممکن را در نظر بگیریم: اشاره گر را در یک گره در جدول توصیف فایل قرار دهید. با وجود سادگی ، این روش (متأسفانه) کار نمی کند. مشکل به شرح زیر است. هر توصیف کننده فایل باید با یک اشاره گر فایل همراه باشد که بایت موجود در فایل را مشخص می کند تا عملیات خواندن یا نوشتن بعدی از آن شروع شود. این نشانگر در کجا باید ذخیره شود؟ یک گزینه این است که آن را در یک جدول گره قرار دهید. با این حال ، اگر چندین فرایند غیر مرتبط یک فایل را همزمان باز کنند ، این رویکرد کار نخواهد کرد ، زیرا هر فرایند باید اشاره گر خود را داشته باشد.

راه حل دوم این است که اشاره گر را در جدول توصیف فایل قرار دهید. علاوه بر این ، هر فرآیندی که یک فایل را باز می کند ، موقعیت خاص خود را در پرونده دارد. متأسفانه ، این طرح نیز کار نمی کند ، اما دلیل شکست در این مورد چندان واضح نیست و به ماهیت اشتراک فایل در سیستم لینوکس مربوط می شود. یک اسکریپت پوسته 5 را در نظر بگیرید که شامل دو فرمان (p1 و p2) است که باید به نوبه خود اجرا شوند. اگر اسکریپت در خط فرمان فراخوانی می شود

سپس انتظار می رود p1 خروجی خود را روی فایل x بنویسد ، و سپس p2 خروجی خود را نیز به فایل x می نویسد ، از جایی که p1 متوقف شده است.

هنگامی که پوسته فرآیند p1 را شروع می کند ، فایل x در ابتدا خالی می شود ، بنابراین دستور p1 به سادگی شروع به نوشتن روی فایل در موقعیت 0 می کند. با این حال ، هنگامی که p1 کار خود را به پایان می رساند ، به مکانیزم هایی نیاز است تا اطمینان حاصل شود که فرایند p2 به نظر می رسد موقعیت شروع آن 0 نیست (اما این دقیقاً همان چیزی است که اتفاق می افتد اگر موقعیت در فایل در جدول توصیف فایل ذخیره شود) ، اما مقداری که pi متوقف شده است.

نحوه انجام این کار در شکل نشان داده شده است. 10.19 ترفند معرفی یک جدول جدید است - جدول توضیحات باز کردن فایل ها(باز کردن جدول شرح فایل) - بین جدول توصیف فایل و جدول i -node و نشانگر را در فایل (و همچنین بیت خواندن / نوشتن) در آن ذخیره کنید. در شکل ، فرآیند والد پوسته است و کودک ابتدا فرآیند pi و سپس فرآیند p2 است. وقتی پوسته یک فرایند pi ایجاد می کند ، ساختار کاربر آن (شامل جدول توصیف فایل) است کپی دقیقهمان ساختار پوسته ، بنابراین هر دو حاوی اشاره گرهایی به یک جدول توصیف فایل باز هستند. هنگامی که فرآیند pi خارج می شود ، توصیف کننده پوسته به جدول توصیف کننده فایل باز اشاره می کند ، که شامل موقعیت فرآیند p1 در فایل است. هنگامی که پوسته اکنون فرآیند p2 را ایجاد می کند ، فرآیند فرزند جدید به طور خودکار موقعیت فایل را به ارث می برد ، و نه فرآیند جدید و نه پوسته برای دانستن مقدار فعلی این موقعیت نیازی ندارند.


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

بنابراین (به مشکل انجام خواندن) ، ما نحوه تعیین موقعیت فایل و گره i را نشان دادیم. گره I شامل آدرس های دیسک 12 بلوک اول فایل است. اگر موقعیت فایل در 12 بلوک اول آن قرار گیرد ، بلاک مورد نیاز خوانده شده و داده ها در کاربر کپی می شوند. برای فایلهای بیش از 12 بلوک ، i-node حاوی آدرس دیسک بلوک غیر مستقیم است (شکل 10.19). این بلوک شامل آدرس های دیسک بلوک های دیسک اضافی است. به عنوان مثال ، اگر اندازه بلوک 1 کیلوبایت و آدرس دیسک 4 بایت باشد ، یک بلوک غیرمستقیم می تواند حداکثر 256 آدرس دیسک را ذخیره کند. این طرح به شما امکان می دهد از فایل هایی با حجم حداکثر 268 کیلوبایت پشتیبانی کنید.

ext2(همچنین به عنوان نامیده می شود ext2fs) - دومین سیستم فایل توسعه یافته(Second File Extended System) یک سیستم فایل است که بر روی هسته لینوکس ساخته شده است. Ext2 توسط Remy Card ایجاد و توسعه داده شد. سیستم فایل ext2 توسط او ساخته شد تا جایگزین نسخه قبلی و قبلی شود - ext.

از نظر سرعت و عملکرد ، این سیستم فایل می تواند به عنوان یک معیار عمل کند. نتایج آزمایشات عملکرد سیستم های فایل نشان می دهد. به عنوان مثال ، در آزمونهای خواندن و نوشتن متوالی مرکز فناوری Dell ، ext2 از ext3 بهتر عمل می کند و از نظر سرعت خواندن در رتبه دوم ext4 مدرن است.

مهمترین عیب ext2 این است که سیستم فایل مجله ای نیست. با این حال ، این نقص در سیستم فایل بعدی - ext3 برطرف شد.

ext2 در کارت های فلش و درایوهای حالت جامد (SSD) استفاده می شود ، زیرا عدم وجود روزنامه نویسی در هنگام کار با درایوهای با محدوده چرخه نوشتن یک مزیت است.

سابقه Ext2

در طول توسعه سریع سیستم لینوکس ، از سیستم فایل سیستم عامل Minix استفاده کرد. کاملاً پایدار بود ، اما در عین حال 16 بیت بود. در نتیجه ، محدودیت سختی 64 مگابایت در هر پارتیشن داشت. علاوه بر این ، حداکثر طول نام فایل محدودیتی دارد که 14 نویسه است.

با هم ، این محدودیت ها منجر به توسعه "سیستم فایل توسعه یافته" (از این رو عبارت " سیستم فایل توسعه یافته ") او وظیفه داشت دو مشکل کلیدی Minix را حل کند. فایل سیستم جدید در آوریل 1992 عمومی شد. Ext بود ، محدودیت اندازه فایل را به 2 گیگابایت افزایش داد و محدودیت طول نام فایل را روی 255 کاراکتر تعیین کرد.

با این حال ، با وجود موفقیت سیستم فایل جدید ، هنوز هم چند مشکل حل نشده وجود دارد. به عنوان مثال ، هیچ پشتیبانی از دسترسی تقسیم شده ، هیچ زمان بندی تغییر داده وجود نداشت. نیاز به حل این مشکلات انگیزه ایجاد نسخه بعدی سیستم فایل توسعه یافته ext2 بود (" دومین سیستم فایل توسعه یافته ") ext2 در ژانویه 1993 توسعه یافت و ACL های سازگار با POSIX و ویژگی های فایل توسعه یافته را نیز پیاده سازی کرد.

سازمان منطقی Ext2

نمودار سلسله مراتب فهرست ext2 به صورت یک شبکه نمایش داده می شود. این به این دلیل است که می توان یک فایل را همزمان در چند فهرست راهنما قرار داد.

همه انواع فایلها دارای نامهای نمادین هستند. سیستم های فایل سازمان یافته به صورت سلسله مراتبی معمولاً از سه نوع نام ساده ، مرکب و نسبی استفاده می کنند. بنابراین در ext2 است. در مورد یک نام ساده ، محدودیت این است که طول آن نباید از 255 کاراکتر تجاوز کند ، علاوه بر این ، نام نباید شامل کاراکتر و خط نویسه NULL باشد.

در مورد کاراکتر NULL ، محدودیت ها مربوط به نمایش رشته ها در زبان C است ، در مورد نویسه اسلش ، همه چیز در این واقعیت نهفته است که از آن به عنوان یک کاراکتر جدا کننده بین دایرکتوری ها استفاده می شود.

نام کاملاً واجد شرایط زنجیره ای از نامهای ساده نمادین همه دایرکتوری ها است که از طریق آنها مسیر از ریشه به سمت دیگر می رود از این فایل... در ext2 ، یک فایل می تواند در چندین فهرست باشد ، به این معنی که می تواند چندین نام کامل (یک فایل - چندین نام کامل) داشته باشد. اما به هر حال ، نام کامل فایل را مشخص می کند.

ویژگی های Ext2:

  • نوع فایل و مجوزها ،
  • مالک ، گروه دسترسی ،
  • اطلاعات مربوط به عملیات مجاز ،
  • زمان ایجاد ، تاریخ آخرین دسترسی ، تاریخ آخرین اصلاح و زمان آخرین حذف ،
  • اندازه فایل فعلی ،
  • مشخصات فایل:
    • پرونده معمولی ،
    • فهرست ،
    • فایل دستگاه بایت گرا ،
    • مسدود کردن فایل دستگاه ،
    • لوله نامگذاری شده ،
    • پیوند نمادین ،
  • تعداد بلوک های اشغال شده ،
  • دیگران

ویژگیهای فایل در جداول خاصی موجود است ، نه در فهرستها ، همانطور که معمولاً در سیستم فایلهای ساده اتفاق می افتد. در نتیجه ، فهرست دارای یک ساختار بسیار ساده با دو بخش است: یک شماره inode و یک نام.

سازمان فیزیکی ext2

ساختار پارتیشن دیسک

به عنوان بخشی از ext2 ، موارد زیر را می توان تشخیص داد:

  • بلوک ها و گروه های بلوک ؛
  • inode؛
  • فوق بلوک

کل فضای دیسک به بلوک هایی با اندازه ثابت تقسیم می شود که چند برابر اندازه بخش هستند (1024 ، 2048 ، 4096 یا 8192 بایت). اندازه بلوک هنگام ایجاد یک سیستم فایل بر روی پارتیشن دیسک مشخص می شود. اعداد متوالی به همه بلوک ها اختصاص داده می شود. برای کاهش تکه تکه شدن و تعداد حرکات هارد دیسک هنگام خواندن زیاد آرایه های دادهبلوک ها به صورت گروهی ترکیب می شوند.

مفهوم اساسی یک سیستم فایل inode است (همچنین نامیده می شود inode - گره اطلاعات) این یک ساختار خاص است که حاوی اطلاعاتی در مورد ویژگی ها و موقعیت فیزیکی یک فایل است. رمزگشایان فهرست در ابتدای هر گروه بلوک در یک جدول ترکیب شده اند. superblock عنصر اصلی سیستم فایل ext2 است. این شامل اطلاعات کلی در مورد سیستم فایل است. ابر بلوک از ابتدای بخش 1024 بایت قرار دارد. یکپارچگی superblock سلامت سیستم فایل را تعیین می کند. در صورت خرابی پارتیشن ، سیستم عامل چندین نسخه پشتیبان از superblock ایجاد می کند. در بلوک بعدی پس از ابر بلوک یک جدول توصیف کننده جهانی وجود دارد - شرح گروه های بلوک در قالب یک آرایه با اطلاعات کلیدر مورد همه گروه های بلوک

مسدود کردن گروه

همه بلوک های یک پارتیشن ext2 به گروه ها تقسیم می شوند. برای هر گروه یک ورودی جداگانه در جدول توصیف جهانی ایجاد می شود. این رکورد پارامترهای اساسی مانند: شماره بلوک در نقشه های بیت و جداول ، تعداد بلوک های رایگان در یک گروه ، تعداد اینودهای حاوی دایرکتوری را ذخیره می کند.

مسدود کردن نقشه بیتسیستمی است که در آن هر بیت اطلاع می دهد که آیا بلوک مربوطه به هر پرونده اختصاص داده شده است یا خیر. اگر بیت 1 باشد ، بلاک مشغول است. نقشه بیتی inode عملکرد مشابهی را انجام می دهد: نشان می دهد که کدام اینودها مشغول هستند و کدام نه. هسته لینوکس سعی می کند اینودهای دایرکتوری ها را به طور مساوی در گروه ها توزیع کند و اینودهای فایل ها را به گروهی با فهرست اصلی انتقال دهد. تمام فضای باقی مانده که در جدول به عنوان داده ظاهر می شود برای ذخیره فایل ها محفوظ است.

سیستم آدرس دهی داده ها

سیستم آدرس دهی اطلاعات یکی از جدی ترین و کلیدی ترین اجزای سیستم فایل است. به لطف او ، وجود دارد فایل مورد نظردر میان بسیاری از بلوک های خالی یا اشغال شده روی دیسک.

ext2 از طرح آدرس دهی بلوک فایل زیر استفاده می کند. برای ذخیره آدرس فایل ، 15 فیلد اختصاص داده شده است که هر یک از آنها 4 بایت تشکیل شده است. اگر فایل در 12 بلوک قرار گیرد ، تعداد خوشه های مربوطه در دوازده فیلد اول آدرس ذکر شده است. اگر اندازه فایل از 12 بلوک بیشتر باشد ، فیلد بعدی شامل آدرس خوشه ای است که در آن شماره بلوک های بعدی فایل قرار دارد. بنابراین ، زمینه سیزدهم برای آدرس دهی غیر مستقیم استفاده می شود.

با حداکثر اندازه بلوک 4096 بایت ، خوشه مربوط به فیلد سیزدهم می تواند تا 1024 شماره از بلوک های فایل بعدی را شامل شود. اگر اندازه فایل از 12 + 1024 بلوک بیشتر باشد ، از فیلد 14 استفاده می شود که حاوی آدرس یک خوشه حاوی 1024 عدد خوشه است که هر یک به 1024 بلوک فایل اشاره دارد. در اینجا ، آدرس دهی غیر مستقیم دوگانه قبلاً استفاده شده است. و اگر فایل دارای بیش از 12 بلوک + 1024 + 1048576 بلوک باشد ، آخرین فیلد پانزدهم برای آدرس دهی غیر مستقیم سه گانه اعمال می شود.

این سیستم آدرس دهی اجازه می دهد تا حداکثر حجم بلوک 4096 بایت دارای پرونده های بزرگتر از 2 ترابایت باشد.

اگر دو سیستم عامل نصب کرده اید ، ویندوز و لینوکس ، مطمئناً دوست دارید بدون پارامترهای مجدد کامپیوتر ، مستقیماً از ویندوز در پارتیشن های یک سیستم عامل رایگان قرار بگیرید.

متأسفانه ، از پارتیشن های سیستم عامل لینوکس در ویندوز پشتیبانی نمی شود. اما بیهوده. به نظر من این می تواند یک حرکت خوب از سوی مایکروسافت باشد.

نکته اصلی این است که ویندوز از سیستم فایل NTFS استفاده می کند ، در حالی که لینوکس روش خاصی برای سازماندهی پرونده ها دارد ، سیستم فایل توسعه یافته ، که آخرین نسخه آن دارای شماره سریال 4 است.

لینوکس نسبت به خواهر تجاری خود کاربر پسندتر است: لینوکس به طور پیش فرض از سیستم فایل Windows NTFS پشتیبانی می کند. البته ، شما نمی توانید لینوکس را روی پارتیشن NTFS نصب کنید ، اما می توانید داده ها را از یک قسمت بخوانید و بنویسید.

Ext2 IFS

Ext2 IFS از نسخه های NT4.0 / 2000 / XP / 2003 / Vista / 2008 x86 و x64 پشتیبانی می کند و به شما امکان می دهد محتویات پارتیشن های لینوکس ext2 را مشاهده کرده و همچنین بتوانید برای آنها بنویسید. این برنامه درایور سیستم ext2fs.sys را نصب می کند که گسترش می یابد قابلیت های ویندوزو شامل پشتیبانی کامل از ext2 در آن است: به پارتیشن های ext2 حروف درایو اختصاص داده می شود و فایل ها و پوشه های روی آنها در محاوره های همه برنامه ها ، به عنوان مثال ، در Explorer نمایش داده می شود.

FSD Ext2

Ext2 FSD درایور رایگان برای سیستم های ویندوز(2K / XP / VISTA / 7 نسخه x86 و x64). مانند ابزار قبلی ، که در اصل یک راننده است ، پشتیبانی کامل از سیستم فایل ext2 در ویندوز را شامل می شود.

LTOOLS - مجموعه ای از ابزارهای مفید خط فرمانکه به شما امکان می دهد داده ها را به / از پارتیشن های لینوکس ext2 ، ext3 و ReiserFS (سیستم فایل استاندارد لینوکس) از دستگاه DOS یا Windows بخوانید و بنویسید.

یک نسخه GUI برنامه (به زبان جاوا) وجود دارد - LTOOLSgui ، و همچنین یک نسخه GUI که در آن نوشته شده است.

Ext2Read

برای دسر ، مثل همیشه ، خوشمزه ترین.

Ext2Read یک ابزار مدیریت فایل است که امکان مشاهده و نوشتن در پارتیشن های ext2 / ext3 / ext4 را فراهم می کند. از LVM2 و بر خلاف برنامه های دیگر در این بررسی ، سیستم فایل ext4 پشتیبانی می کند. پشتیبانی داخلی برای کپی دایرکتوری بازگشتی.

و در اینجا دومین دسر است. در ابتدا گفته شد که این یک حرکت خوب از سوی مایکروسافت است که به صورت پیش فرض پشتیبانی از پارتیشن های لینوکس را در ویندوز فعال کند.

این حرکت برای بیستمین سالگرد لینوکس انجام شد. خودت ببین.

فقط همین. تشکر از توجه شما. من قصد دارم با سوسک های ماه مبارزه کنم. در بهار امسال تعداد زیادی از آنها وجود دارد. 🙂

ولادیمیر مشکوف

معماری سیستم فایل Ext2

مقاله به بحث درباره ساختار منطقی ext2 - سیستم فایل سیستم عامل لینوکس می پردازد.

اجزای اصلی سیستم فایل ext2

مانند هر فایل سیستم UNIX ، سیستم فایل ext2 را می توان به اجزای زیر تقسیم کرد:

  • بلوک ها و گروه های بلوک ؛
  • گره اطلاعات ؛
  • فوق بلوک

گروه ها را مسدود و مسدود می کند

کل فضای دیسک به بلوک هایی با اندازه ثابت تقسیم می شود که چند برابر اندازه بخش هستند - 1024 ، 2048 و 4096 بایت. هنگام ایجاد یک سیستم فایل بر روی پارتیشن دیسک سخت ، اندازه بلوک مشخص می شود. اندازه بلوک کوچکتر باعث صرفه جویی در فضای دیسک سخت می شود ، اما حداکثر اندازه فایل سیستم را نیز محدود می کند. همه بلوک ها شماره گذاری شده اند. به منظور کاهش تکه تکه شدن و تعداد حرکات هارد دیسک هنگام خواندن آرایه های داده بزرگ ، بلوک ها به صورت گروهی ترکیب می شوند.

گره اطلاعات

مفهوم اساسی یک سیستم فایل یک گره اطلاعاتی ، یا گره اطلاعاتی ، یا inode است. این یک ساختار ویژه است که حاوی اطلاعاتی در مورد ویژگی ها و موقعیت فیزیکی یک فایل است. ویژگی های فایل نوع آن (فایل معمولی ، فهرست و غیره) ، حقوق دسترسی به آن ، شناسه مالک ، اندازه ، زمان ایجاد است. اطلاعات مکان فیزیکی دنباله ای از شماره های بلوک مطلق است که حاوی داده های فایل است.

فوق بلاک

superblock عنصر اصلی سیستم فایل ext2 است. این شامل اطلاعات زیر در مورد سیستم فایل است (لیست ناقص است):

  • تعداد کل بلوک ها و اینودها در سیستم فایل ؛
  • تعداد بلاک ها و اینودهای رایگان در سیستم فایل ؛
  • اندازه بلوک سیستم فایل ؛
  • تعداد بلوک ها و اینودهای موجود در گروه ؛
  • اندازه inode ؛
  • شناسه سیستم فایل ؛
  • شماره اولین بلوک داده

به عبارت دیگر ، این تعداد بلوک حاوی superblock است. اگر اندازه بلوک سیستم فایل بیشتر از 1024 بایت باشد این عدد همیشه 0 است و اگر اندازه بلوک 1024 بایت باشد 1 است.

عملکرد سیستم فایل مستقیماً به یکپارچگی فوق بلوک بستگی دارد. این سیستم عامل پشتیبان های متعددی از superblock ایجاد می کند تا در صورت خرابی بتوان آن را بازیابی کرد. نسخه اصلی در افست 1024 بایت از ابتدای پارتیشنی که سیستم فایل روی آن ایجاد شده است قرار دارد (اولین 1024 بایت برای لودر سیستم عامل ذخیره می شود).

نسخه های اولیه سیستم فایل ext2 در ابتدای هر گروه از بلوک ها کپی هایی از ابر بلوک ایجاد می کردند. این منجر به از دست دادن زیاد فضای دیسک شد ، بنابراین بعداً تعداد پشتیبان گیری های فوق بلوک کاهش یافت و گروه های بلوک 0 ، 1 ، 3 ، 5 و 7 برای جا دادن آنها اختصاص داده شد.

قالب گروه را مسدود کنید

بلوک دیاگرام کلی سیستم فایل ext2 در شکل نشان داده شده است. 1

تقریباً همه گروه های بلوک دارای فرمت یکسان هستند. در هر گروه ، علاوه بر بلوک های اطلاعات ، اطلاعات مربوط به اشغال بلوک ها و inode گروه در قالب یک نقشه بیت ذخیره می شود. بلوک گروه 0 همچنین شامل یک superblock و یک جدول توصیف گروه است که در زیر به آنها خواهیم پرداخت.

نقشه بیت اشغال بلوک معمولاً در اولین بلوک گروه قرار دارد. اگر پشتیبان گیری فوق العاده ای در گروه وجود دارد ، نقشه بیت در بلوک دوم گروه قرار دارد. اندازه bitmap یک بلوک است. هر بیت از این کارت وضعیت بلوک را نشان می دهد. اگر بیت (1) تنظیم شده باشد ، بلاک مشغول است ؛ اگر پاک شده باشد (0) ، بلاک رایگان است. بلوک اول گروه مربوط به بیت صفر کارت ، بلوک دوم مربوط به بیت اول و غیره است.

اینودها در همان گروه در یک جدول جمع آوری شده اند. در bitmap اشغال گروه inode ، هر بیت نشان دهنده وضعیت یک مورد در جدول inode گروه است.

هر گروه بلوک با استفاده از توصیف کننده گروه بلوک توضیح داده شده است. توصیف گر گروهی ساختاری است که حاوی اطلاعاتی در مورد آدرس های بیت مپ اشغال بلوک ، بیت مپ اشغال inode و جدول اینود گروه مربوطه می باشد. همه توصیف کننده های گروه در جدول توصیف گروه ، که در گروه بلوک 0. ذخیره شده است ، جمع آوری می شود. همانند فوق بلوک ، سیستم عامل از جدول توصیف گروه پشتیبانی می کند.

الگوریتم خواندن فایل

هر inode ، مانند یک بلوک ، دارای یک شماره دنباله است که در درون سیستم فایل منحصر به فرد است و فقط در مورد یک فایل اطلاعات دارد. بنابراین ، برای دسترسی به محتویات یک فایل ، لازم است شماره دنباله اینود مربوطه را بدانید.

همانطور که در بالا ذکر شد ، اطلاعات مربوط به مکان فیزیکی فایل در inode موجود است. این اطلاعات دنباله ای از شماره های بلوک 32 بیتی است که حاوی داده های فایل است (شکل 1). 12 عدد اول بلوک های مستقیم اطلاعات هستند. عدد سیزدهم یک شماره بلوک غیر مستقیم است. این شامل آدرس بلوکی است که آدرس بلوک های اطلاعات در آن ذخیره شده است. شماره 14 یک عدد دو بلوک ، شماره 15 یک عدد سه بلوک است.

نام فایل در inode گنجانده نشده است ؛ نگاشت بین نام فایل و شماره دنباله inode از طریق فهرست ها انجام می شود.

کاتالوگ ها

فایلهای سیستمهای UNIX و POSIX در یک سیستم فایل سلسله مراتبی با ساختار درختی ذخیره می شوند. ریشه سیستم فایل ، پوشه اصلی است که با نماد "/" مشخص شده است. هر گره میانی در درخت سیستم فایل یک دایرکتوری است. گره های پایانی درخت سیستم فایل یا دایرکتوری خالی هستند یا فایل. نام مسیر مطلق فایل شامل نام تمام دایرکتوری های منتهی به آن است فایل مشخص شدهشروع از فهرست اصلی به عنوان مثال ، نام مسیر /home/test.file به این معنی است که فایل test.file در فهرست اصلی قرار دارد ، که به نوبه خود در فهرست اصلی "/" قرار دارد.

یک دایرکتوری ، مانند یک فایل ، با استفاده از inode توصیف می شود. محتویات یک دایرکتوری آرایه ای از مدخل ها است که هر یک حاوی اطلاعاتی در مورد فایلی است که در داخل فهرست فعلی قرار دارد.

ورودی فهرست دارای فرمت زیر است:

  • شماره سریال inode فایل ؛
  • ضبط طول در بایت ؛
  • نام فایل؛
  • طول نام فایل

یافتن شماره inode یک فایل همیشه از فهرست اصلی شروع می شود. به عنوان مثال ، برای دریافت شماره inode یک فایل واقع در فهرست اصلی ، سیستم عامل باید محتویات فهرست اصلی را دریافت کند ، یک ورودی با نام این فایل در آن پیدا کند و شماره inode فایل را از این ورودی استخراج کند. به

چند شماره اولیه inode توسط سیستم فایل رزرو شده و در فایل هدر فهرست شده است:

* شماره های inode ویژه

#تعریف EXT2_BAD_INO 1 / * بلوک های نامناسب inode * /

#تعریف EXT2_ROOT_IN 2 / * ریشه inode * /

#تعریف EXT2_ACL_IDX_IN 3 / * ACL inode * /

#تعریف EXT2_ACL_DATA_INO 4 / * ACL inode * /

#تعریف EXT2_BOOT_LOADER_INO 5 / * بوت لودر inode * /

#تعریف EXT2_UNDEL_DIR_INO 6 / * حذف فهرست inode * /

Inode شماره 2 (root inode) برای نوشتن فهرست اصلی ذخیره شده است. این اینود در گروه بلوک 0 قرار دارد و موقعیت دوم جدول inode گروه را اشغال می کند. اولین شماره inode بدون رزرو در superblock ذخیره می شود.

پس از تعیین شماره توالی اینود فایل ، کرنل شماره گروهی را که این اینود در آن قرار دارد و موقعیت آن را در جدول اینود گروه محاسبه می کند. با خواندن این موقعیت inode ، سیستم عامل اطلاعات کاملی در مورد فایل ، از جمله آدرس بلوک هایی که محتویات فایل در آنها ذخیره شده است ، به دست می آورد.

شماره گروه بلوک که inode در آن قرار دارد با فرمول محاسبه می شود:

group = (inode_num - 1) / inodes_per_group

جایی که:

  • گروه- تعداد مورد نیاز گروه بلوک ؛
  • inode_num- شماره ترتیبی اینود که فایل را تعریف می کند.
  • inodes_per_group- تعداد inodes در گروه (این اطلاعات در superblock است).

موقعیت inode در جدول inode گروه با فرمول تعیین می شود:

index = (inode_num - 1)٪ inodes_per_groupe

جایی که index موقعیت inode در جدول است.

بیایید به نمونه ای از بدست آوردن محتویات فایل test.file در فهرست اصلی مراجعه کنیم. برای خواندن فایل /test.file به موارد زیر نیاز دارید:

  • یک ورودی درباره این فایل در آرایه ورودی های فهرست اصلی پیدا کنید.
  • شماره دنباله inode فایل را استخراج کنید ، تعداد گروهی را که این inode در آن قرار دارد محاسبه کنید.
  • آدرس جدول inode گروه را از توصیف کننده این گروه بازیابی کنید ؛
  • محاسبه موقعیت inode در این جدول ؛
  • inode فایل را بخوانید ؛
  • آدرس بلوک های اطلاعات را از inode استخراج کرده و اطلاعات موجود در این بلوک ها را بخوانید.

در شکل 2 مراحل خواندن فایل /test.fil را با جزئیات نشان می دهد.

    مراحل 1-6 - خواندن دایرکتوری ریشه:

  1. جدول توصیف گروه از گروه بلوک 0 خوانده می شود.
  2. توصیف کننده گروه 0 از جدول توصیف گروه بازیابی شده و آدرس جدول اینود گروه 0 از آن خوانده می شود.
  3. یک جدول inode از گروه بلوک 0 خوانده می شود.
  4. شماره inode فهرست اصلی در 2 ثابت است ، بنابراین عنصر دوم از جدول inode گروه 0 ، که حاوی آدرس بلوک حاوی محتویات فهرست اصلی است ، خوانده می شود. فرض کنید این بلوک در گروه بلوک A قرار دارد.
  5. یک بلوک حاوی ورودی های فهرست اصلی از گروه بلوک A خوانده می شود.
  6. جستجو برای مدخلی به نام "test.file" انجام می شود. در صورت یافتن چنین مدخلی ، شماره inode فایل "test.file" از آن بازیابی می شود.
  7. پس از تعیین شماره inode ، می توانید به بلوک های اطلاعات فایل دسترسی پیدا کنید (مراحل 7-11):

  8. تعداد گروهی که inode داده شده در آن قرار دارد و موقعیت آن در جدول inode گروه محاسبه می شود (فرض کنید شماره گروه B و موقعیت جدول در X باشد).
  9. از جدول توصیف گروه ، توصیف کننده گروه بلوک B را استخراج می کنیم و از آن آدرس جدول inode این گروه بلوک را می خوانیم.
  10. یک جدول inode از گروه بلوک B خوانده می شود.
  11. اینود در موقعیت X از جدول اینود گروه بلوک B خوانده می شود.
  12. آدرس های بلوک با محتویات فایل /test.file از اینود خوانده شده استخراج می شود و اطلاعات از بلوک با آدرس مشخص خوانده می شود.

پیاده سازی نرم افزاری الگوریتم خواندن فایل

داده های اولیه: یک پارتیشن هارد دیسک وجود دارد که سیستم فایل ext2 روی آن ایجاد شده است. این بخش مربوط به فایل دستگاه / dev / hda3 است. یک زیرشاخه خانگی در فهرست اصلی پارتیشن ایجاد می شود و شامل فایل test.file با محتوای زیر است:

آیا مرکبات در انبوه جنوب زندگی می کنند؟

بله ، اما یک نسخه جعلی!

1234567890-=

بد فکر نکنید ، این مزخرف نیست ، بلکه یک تمرین آزمایشی از دوره آموزشی اپراتورهای تلگراف در نیروهای سیگنال اتحاد جماهیر شوروی سابق است!

توجه! یکی را باید در نظر گرفت نکته مهم... فایل ایجاد شده بلافاصله روی دیسک نوشته نمی شود ، بلکه ابتدا به بافر دیسک می رود. تلاش برای دریافت فوری محتویات پرونده با استفاده از الگوریتم فوق منجر به هیچ چیزی نمی شود ، زیرا اطلاعات مربوط به این پرونده به طور فیزیکی در دیسک وجود ندارد. شما باید سیستم را "مجبور" کنید تا بافر دیسک را روی دیسک بنویسد. ساده ترین راه برای انجام این کار انجام عملیات راه اندازی مجدد است. بنابراین ، پس از ایجاد فایل ، سیستم را راه اندازی مجدد کنید.

وظیفه ما استفاده از فایل دستگاه / dev / hda3 برای خواندن فایل /home/test.file با دسترسی مستقیم به بلوک های اطلاعاتی آن است.

بیایید پیاده سازی نرم افزاری یک ماژول را که این عملیات را انجام می دهد در نظر بگیریم.

فایل های سرصفحه:

#عبارتند از

#عبارتند از

#عبارتند از

#عبارتند از

#عبارتند از

#عبارتند از

فایل سرصفحه انواع ساختاری را توصیف می کند که اجزای اصلی سیستم فایل ext2 را توصیف می کند - فوق بلوک ، توصیف کننده گروه بلوک ، گره اطلاعات ، ورود دایرکتوری.

بیایید به طور خلاصه زمینه هایی را که در هر یک از این ساختارها گنجانده شده است در نظر بگیریم:

  1. ساختار فوق العاده ساختار ext2_super_block:
    • __u32 s_inodes_count- تعداد کل اینودها در سیستم فایل ؛
    • __u32 s_blocks_count- تعداد کل بلوک ها در سیستم فایل ؛
    • __u32 s_free_blocks_count- تعداد بلوک های رایگان ؛
    • __u32 s_free_inodes_count- تعداد inodes رایگان ؛
    • __u32 s_first_data_block- شماره اولین بلوک داده (تعداد بلوکی که ابر بلوک در آن قرار دارد) ؛
    • __u32 s_log_block_size- از این مقدار برای محاسبه اندازه بلوک استفاده می شود. اندازه بلوک با فرمول تعیین می شود: اندازه بلوک = 1024<< s_log_block_size;
    • __u32 s_blocks_per_group- تعداد بلوک های گروه ؛
    • __u32 s_inodes_per_group- تعداد inodes در گروه ؛
    • __u16 s_magic- شناسه سیستم فایل ext2 (امضا 0xEF53) ؛
    • __u16 s_inode_size- اندازه گره اطلاعات (inode) ؛
    • __u32 s_first_inoآیا تعداد اولین inode بدون رزرو است.
  2. ساختار یک توصیفگر برای گروهی از بلوکهای ساختار ext2_group_desc:
    • __u32 bg_block_bitmap- bitmap از اشغال بلوک های گروه ؛
    • __u32 bg_inode_bitmap- bitmap از اشغال گروه inode ؛
    • __u32 bg_inode_table- آدرس جدول inode گروه.
  3. ساختار گره اطلاعاتی ساختار ext2_inode:
    • __u16 i_mode - نوع فایل و حقوق دسترسی به آن. نوع فایل توسط بیت های 12-15 این قسمت تعیین می شود:
      • 0xA000- پیوند نمادین ؛
      • 0x8000- پرونده معمولی ؛
      • 0x6000- مسدود کردن فایل دستگاه ؛
      • 0x4000- فهرست راهنما؛
      • 0x2000- فایل دستگاه کاراکتر ؛
      • 0x1000- کانال FIFO
    • __u32 i_size- اندازه در بایت ؛
    • __u32 i_atime- زمان آخرین دسترسی به فایل ؛
    • __u32 i_ctime- زمان ایجاد فایل ؛
    • __u32 i_mtime- زمان آخرین اصلاح ؛
    • __u32 i_blocks- تعداد بلوک های اشغال شده توسط فایل ؛
    • __u32 i_block- آدرس بلوک های اطلاعات (شامل همه مراجع غیر مستقیم).
  4. مقدار EXT2_N_BLOCKS در فایل تعریف شده است:

    * ثابت نسبت به بلوک داده

    #تعریف EXT2_NDIR_BLOCKS 12

    #تعریف EXT2_IND_BLOCK EXT2_NDIR_BLOCKS

    #تعریف EXT2_DIND_BLOCK (EXT2_IND_BLOCK + 1)

    #تعریف EXT2_TIND_BLOCK (EXT2_DIND_BLOCK + 1)

    #تعریف EXT2_N_BLOCKS (EXT2_TIND_BLOCK + 1)

  5. ساختار ساختار فهرست ext2_dir_entry_2:
  6. #تعریف EXT2_NAME_LEN 255

  • __u32 inode- شماره inode فایل ؛
  • __u16 rec_len- طول ورودی فهرست
  • __u8 name_len- طول نام فایل ؛
  • نام شخصیتنام فایل.

بیایید نام قسمتی را که سیستم فایل روی آن ایجاد شده است ، ساختارها و متغیرهای جهانی تعریف کنیم.

#تعریف PART_NAME " / dev / hda3"

struct ext2_super_block sb؛

/ * بافر برای ذخیره جدول توصیف گروه * /

بدون امضا char buff_grp؛

دوست دار بدون علامت؛ / * بافر اطلاعات * /

int indev؛ / * توصیف کننده فایل دستگاه * /

int BLKSIZE؛ / * اندازه بلوک سیستم فایل * /

بیایید چندین توابع را که برای کار نیاز داریم تعریف کنیم:

عملکرد خواندن فوق بلوک:

void read_sb ()

ممست (& sb ، 0.1024) ؛

ما 1024 بایت را از ابتدای پارتیشن حرکت می دهیم و superblock را در ساختار struct ext2_super_block sb می خوانیم:

If (lseek (indev، 1024،0)< 0) {

Perror ("lseek") ؛

خروج (-1) ؛

اگر (خواندن (indev ، (char *) & sb ، sizeof (sb))< 0) {

Perror ("خواندن") ؛

خروج (-1) ؛

بررسی شناسه سیستم فایل:

اگر (sb.s_magic! = EXT2_SUPER_MAGIC) (

Printf ("نوع سیستم فایل ناشناخته!") ؛

خروج (-1) ؛

مقدار EXT2_SUPER_MAGIC در فایل هدر تعریف شده است.

ما اطلاعات مربوط به سیستم فایل را که در superblock قرار دارد نمایش می دهیم:

printf ("اطلاعات فوق بلاک -----------") ؛

Printf ("تعداد اینودها -٪ u" ، sb.s_inodes_count) ؛

Printf ("تعداد بلوک ها -٪ u" ، sb.s_blocks_count) ؛

Printf ("اندازه بلوک -٪ u" ، 1024<< sb.s_log_block_size);

Printf ("اولین اینود -٪ d" ، sb.s_first_ino) ؛

Printf ("سحر و جادو - 0x٪ X" ، sb.s_magic) ؛

Printf ("اندازه اینود -٪ d" ، sb.s_inode_size) ؛

Printf ("اینودها در هر گروه -٪ u" ، sb.s_inodes_per_group) ؛

Printf ("بسته های هر گروه -٪ u" ، sb.s_blocks_per_group) ؛

Printf ("اولین بلوک داده -٪ u" ، sb.s_first_data_block) ؛

برگشت؛

تابع خواندن جدول توصیف کننده گروه:

void read_gdt ()

ما اندازه بلوک سیستم فایل را محاسبه می کنیم:

BLKSIZE = 1024<< sb.s_log_block_size

جدول توصیف گروه در بلاک بلافاصله پس از اولین بلوک داده (پس از بلوک فوق العاده) قرار دارد.

جدول را می خوانیم:

اگر (lseek (indev، (sb.s_first_data_block + 1) * BLKSIZE ، 0)< 0) {

Perror ("lseek") ؛

خروج (-1) ؛

اگر (بخوانید (indev، buff_grp ، BLKSIZE)< 0) {

Perror ("خواندن") ؛

خروج (-1) ؛

برگشت؛

عملکرد برای بدست آوردن محتوای یک inode بر اساس تعداد آن:

void get_inode (int inode_num ، struct ext2_inode * in)

پارامترهای ورودی تابع عبارتند از: شماره inode و ساختار struct ext2_inode.

ساختار ext2_group_desc gd؛

گروه U64 ، index ، pos؛

ما تعداد گروه بلوک را محاسبه می کنیم ، که شامل inode با شماره ترتیبی inode_num است:

گروه = (inode_num - 1) / sb.s_inodes_per_group؛

از جدول توصیف گروه ، گروه توصیف گروه را استخراج کرده و آن را در ساختار gd ساختار ext2_group_desc کپی کنید:

Memset ((void *) & gd، 0، sizeof (gd))؛

Memcpy ((void *) & gd ، buff_grp + (group * (sizeof (gd))) ، sizeof (gd)) ؛

ما موقعیت inode را با inode_num معمولی در جدول inode گروه گروه محاسبه می کنیم و این inode را در ساختار ext2_inode می خوانیم:

index = (inode_num - 1)٪ sb.s_inodes_per_group؛

Pos = ((__u64) gd.bg_inode_table) * BLKSIZE + (index * sb.s_inode_size) ؛

Pread64 (indev، in، sb.s_inode_size، pos)؛

برگشت؛

عملکرد خواندن بلوک داده:

void read_iblock (struct ext2_inode * in، int blk_num)

U64 pos؛

پارامترهای ورودی تابع عبارتند از ساختار inode و شماره بلوک (به معنی عدد از توالی بلوک های آدرس واقع در اینود).

ما مقدار offset را برای بلوک اطلاعات روی پارتیشن محاسبه می کنیم و این بلوک را در buff global می خوانیم:

Pos = ((__u64) in-> i_block) * BLKSIZE؛

Pread64 (indev، buff، BLKSIZE، pos)؛

برگشت؛

عملکرد برای دریافت محتویات فهرست اصلی:

void get_root_dentry ()

ساختار ext2_inode در؛

شماره inode فهرست اصلی مشخص است ، بنابراین محتویات inode فهرست اصلی را دریافت می کنیم و محتویات آن را در buffer buff می خوانیم:

get_inode (EXT2_ROOT_INO ، & در) ؛

Read_iblock (& ​​در ، 0) ؛

buffer buffer شامل محتویات فهرست اصلی است.

برگشت؛

عملکرد برای دریافت شماره inode با نام فایل:

int get_i_num (char * name)

پارامترهای ورودی تابع نام فایل است. مقدار بازگشتی ، دستور inode فایل است.

Int i = 0 ، rec_len = 0 ؛

ساختار ext2_dir_entry_2 dent؛

buffer buffer شامل مجموعه ای از ورودی های فهرست می باشد. برای تعیین شماره سریال inode یک فایل ، باید یک ورودی در این آرایه با نام این فایل پیدا کنید:

برای (؛ من< 700; i++) {

Memcpy ((void *) & dent ، (buff + rec_len) ، sizeof (dent)) ؛

اگر (! Memcmp (dent.name، name، dent.name_len)) خراب شود ؛

Rec_len + = dent.rec_len؛

بازگشت dent.inode؛

حال بیایید عملکرد اصلی را شرح دهیم:

int main ()

متغیرها و ساختارها:

struct ext2_inode در؛

// نام مسیر مطلق فایل

char بدون امضا * full_path = "/home/test.file"؛

امضا نشده char buff1؛

استاتیک int i = 1 ؛

Int n، i_num، outf، type؛

اولین کاراکتر در نام مسیر مطلق باید یک اسلش رو به جلو (/) باشد. ما این را بررسی می کنیم:

If (full_path! = "/") (

Perror ("بریده بریده") ؛

خروج (-1) ؛

فایل دستگاه را باز کنید ، superblock و جدول توصیف گروه را بخوانید:

Indev = باز (PART_NAME ، O_RDONLY) ؛

اگر (غیر مستقل< 0) {

Perror ("باز") ؛

خروج (-1) ؛

Read_sb ()؛

Read_gdt ()؛

محتویات فهرست اصلی را دریافت می کنیم:

get_root_dentry ()؛

buffer buffer اکنون شامل تمام ورودی های فهرست اصلی است (در صورت تمایل می توانید آنها را در یک فایل جداگانه ذخیره کنید). اکنون که ورودی های فهرست اصلی را داریم ، می توانیم با استفاده از الگوریتم خواندن فایل بالا به محتویات test.file برسیم. برای این منظور ، ما یک چرخه را سازماندهی می کنیم. در بدنه حلقه ، نام مسیر مطلق فایل را تجزیه کرده و عناصر آن را برجسته می کنیم - زیرشاخه ها (ما فقط یک خانه داریم) و نام فایل مورد نظر (test.file). برای هر عنصر ، شماره inode معمولی را تعیین کنید ، این inode را بخوانید و سپس محتویات بلوک صفر (از دنباله بلوک های آدرس واقع در inode) را بدست آورید:

در حالی که (1) (

ممست (buff1،0، sizeof (buff1))؛

برای (n = 0 ؛ n< EXT2_NAME_LEN; n++, i++) {

Buff1 [n] = مسیر کامل [i] ؛

اگر ((buff1 [n] == "/") || (buff1 [n] == "؟")) (

من ++ ؛

زنگ تفريح؛

buff1 [n] = "؟"؛

برای هر عنصر از نام مسیر مطلق فایل ، شماره دنباله اینود را تعیین می کنیم ، این اینود را در حافظه می خوانیم و سپس محتویات بلوک صفر را دریافت می کنیم:

I_num = get_i_num (buff1)؛

Get_inode (i_num ، & in) ؛

Read_iblock (& ​​در ، 0) ؛

اجازه دهید اطلاعات مربوط به فایل (نام ، شماره inode ، اندازه فایل و نوع آن) را نمایش دهیم:

Printf ("شماره اینود -٪ u" ، i_num) ؛

Printf ("نام فایل -٪ s" ، buff1) ؛

Printf ("اندازه فایل -٪ u" ، in.i_size) ؛

نوع فایل توسط چهار بیت مهمترین قسمت i_mode در ساختار ext2_inode تعیین می شود:

type = ((in.i_mode & 0xF000) >> 12)؛

Printf ("نوع -٪ d" ، نوع) ؛

سوئیچ (نوع) (

مورد (0x04):

Printf ("(فهرست)") ؛

زنگ تفريح؛

مورد (0x08):

Printf ("(فایل معمولی)") ؛

زنگ تفريح؛

مورد (0x06):

Printf ("(مسدود کردن فایل دستگاه)") ؛

زنگ تفريح؛

مورد (0x02):

Printf ("(فایل دستگاه کاراکتر)") ؛

زنگ تفريح؛

پیش فرض:

Printf ("(نوع ناشناخته)") ؛

زنگ تفريح؛

بررسی نوع فایل. اگر این یک فایل معمولی است ، حلقه را می شکنیم:

اگر (نوع & 0x08) (

بافر حاوی اطلاعاتی است که از بلوک های اطلاعات فایل /home/test.file خوانده می شود. اجازه دهید این اطلاعات را در یک فایل بنویسیم:

Outf = باز ("خارج" ، O_CREAT | O_RDWR ، 0600) ؛

بنویسید (outf، buff، sizeof (buff)) ؛

بستن (outf) ؛

زنگ تفريح؛

ما میریم:

بستن (بدون نیاز) ؛

بازگشت 0 ؛

در این ملاحظه ساختار منطقیفایل سیستم ext2 به پایان رسیده است.

(سیستم فایل دوم توسعه یافته).

تاریخچه توسعه سیستم فایل های لینوکس

ساختار پارتیشن دیسک Ext2fs

·

· کاتالوگ ها

· فایل های دستگاه

·

·

کتابخانه EXT2fs

· امکانات سیستم EXT2fs

· محاسبه عملکرد

متفاک

پیشرفت

سال دوم 5 گرم

چیچیروف آندری

سیستم سر EXT2fs (دومین سیستم فایل توسعه یافته).

تاریخچه توسعه سیستم فایل های لینوکس

اولین نسخه های لینوکس بر اساس سیستم عامل Minix توسعه یافت. تقسیم دیسک ها بین دو سیستم آسان تر از طراحی یک سیستم فایل جدید بود ، بنابراین لینوس توروالدز تصمیم گرفت پشتیبانی لینوکس را از سیستم فایل Minix معرفی کند. در آن زمان ، این سیستم فایل یک محصول نرم افزاری نسبتاً کارآمد با نسبتاً مناسب بود مقدار کمیاشتباهات.

با این حال ، محدودیت های مربوط به ساختار سیستم فایل Minix بسیار زیاد بود ، بنابراین آنها شروع به فکر ایجاد سیستم فایل جدید برای لینوکس کردند.

برای ساده سازی پیاده سازی سیستم فایل جدید در هسته لینوکس ، یک سیستم فایل مجازی (VFS) ایجاد شده است. VFS در ابتدا توسط کریس پرووانزانو نوشته شد و سپس توسط لینوس توروالدز قبل از ادغام آن در هسته بازنویسی شد.

پس از نصب در هسته VFS ، در آوریل 1992 یک سیستم فایل جدید EXTfs (سیستم فایل توسعه یافته) توسعه داده شد و به لینوکس 0.96c اضافه شد. در سیستم فایل جدید ، دو محدودیت قابل توجه در سیستم Minix برداشته شد: حداکثر اندازه آن می تواند به 2 گیگابایت برسد و حداکثر طول نام فایل 255 نویسه بود. این یک موفقیت در سیستم فایل Minix بود ، اگرچه برخی مشکلات هنوز وجود داشت. از دسترسی تقسیم شده ، اصلاح inode و اصلاح سلولهای زمان اصلاح فایل پشتیبانی نمی شود. این سیستم فایل از لیست های پیوندی برای کار بر روی بلوک ها و اینودهای رایگان استفاده می کرد که تأثیر زیادی بر عملکرد سیستم داشت: با گذشت زمان ، لیست ها بی نظم و بی نظم شدند ، که منجر به تکه تکه شدن سیستم فایل شد.

راه حل این مشکلات انتشار نسخه آلفا دو فایل سیستم جدید در ژانویه 1993 بود: Xia و EXT2fs (سیستم فایل دوم توسعه یافته). در بیشتر موارد ، سیستم فایل Xia بر اساس Minix و چندین ویژگی جدید اضافه شده بود. اساساً این قابلیت کار با نام فایل های طولانی ، پشتیبانی از پارتیشن های دیسک بزرگتر و پشتیبانی از سه سلول زمان اصلاح فایل بود. از سوی دیگر ، EXT2fs بر اساس EXTfs با پیشرفت ها و افزودنی های بسیار بود. او همچنین فرصت هایی برای توسعه آینده داشت.

وقتی این دو سیستم فایل منتشر شدند ، عملکرد آنها تقریباً یکسان بود. سیستم Xia نسبت به EXT2fs با هزینه به حداقل رساندن آن قابل اطمینان تر بود. همراه با کاربرد وسیع تر آنها ، اشکالاتی در سیستم EXT2fs یافت شد و تعداد زیادی از ویژگی ها و پیشرفت های جدید اضافه شد. سیستم فایل EXT2fs در حال حاضر بسیار قابل اعتماد است و به صورت استاندارد برای سیستم فایل لینوکس تبدیل شده است.

جدول زیر حاوی اطلاعات کلی در مورد عملکرد ارائه شده توسط سیستم فایل های مختلف است.

Minix FS

Ext FS

Ext2 FS

شیا FS

حداکثر اندازه فایل سیستم

حداکثر طولفایل

حداکثر طول نام فایل

پشتیبانی از سه سلول زمان اصلاح فایل

قابلیت توسعه

بلوک قابل تغییر

حفاظت از اطلاعات

در صورت لزوم ، طول نام فایل در اضافی 2می تواند به 1012 افزایش یابد.

EXT2fs تعدادی بلوک را برای کاربر اصلی ذخیره می کند. به طور معمول ، این 5 of از کل است ، که به مدیر سیستم اجازه می دهد تا از پر شدن فضای هارد دیسک در حین پر کردن آن با کار فرآیندهای دیگر کاربران جلوگیری کند.

ساختار پارتیشن دیسک Ext2fs

تولیدکنندگان دیسکهای سختمعمولاً محصولات خود را با فرمت پایین ارسال می کنند. تا آنجا که من می دانم ، این بدان معناست که کل فضای دیسک با کمک برچسب های ویژه ، با حجم 512 بایت به "بخش" تقسیم می شود. چنین دیسک (یا پارتیشن دیسک) باید برای استفاده در یک سیستم عامل خاص آماده شود. در MS-DOS یا Windows ، روش آماده سازی قالب بندی و در لینوکس ایجاد سیستم فایل نامیده می شود. ایجاد سیستم فایل ext2fsایجاد یک ساختار منطقی خاص در پارتیشن دیسک است. این ساختار به شرح زیر ساخته شده است. ابتدا یک ناحیه بوت روی دیسک اختصاص داده می شود. ناحیه بوت در هر فایل سیستم ایجاد می شود. در پارتیشن اصلی ، شامل یک بوت رکورد است ، یک قطعه کد که فرآیند بوت سیستم عامل را هنگام راه اندازی آغاز می کند. این قسمت در بخشهای دیگر استفاده نمی شود. تمام فضای دیسک دیگر به بلوک تقسیم می شود. اندازه یک بلوک می تواند 1 ، 2 یا 4 کیلوبایت باشد. بلوک واحد آدرس دهی فضای دیسک است. فضای فایل در کل بلوک ها اختصاص داده می شود ، بنابراین هنگام انتخاب اندازه بلوک ، یک مبادله وجود دارد. اندازه بلوک بزرگ معمولاً تعداد دسترسی به دیسک را هنگام خواندن یا نوشتن یک فایل کاهش می دهد ، اما نسبت هدر رفته فضا را افزایش می دهد ، به ویژه هنگامی که تعداد زیادی فایل کوچک وجود دارد.

بلوک ها در منطقه خود به گروه بلوک ها ترکیب می شوند. گروه های بلوک در سیستم فایل و بلوک های درون یک گروه به صورت متوالی شماره گذاری می شوند و از 1 شروع می شوند. اولین بلوک روی دیسک شماره 1 است و متعلق به گروه شماره 1 است. تعداد کل بلوک های دیسک (در پارتیشن دیسک) تقسیم کننده اندازه دیسک است که در بخش ها بیان می شود. و تعدادی گروه بلوک برای تقسیم تعداد بلوک ها لازم نیست ، زیرا آخرین گروه بلوک ها ممکن است کامل نباشند. شروع هر گروه بلوک دارای یک آدرس است که می توان آن را به صورت ((شماره گروه - 1) * (تعداد بلوک های گروه)) دریافت کرد.

هر گروه از بلوک ها ساختار یکسانی دارند. ساختار آن در جدول زیر نشان داده شده است.

ساختار گروهی از بلوک های پارتیشن دیسک در ext2fs

اولین عنصر این ساختار (فوق بلوک) برای همه گروه ها یکسان است و بقیه برای هر گروه فردی است. superblock در اولین بلوک هر گروه بلوک ذخیره می شود (به جز گروه 1 ، که شامل رکورد بوت در اولین بلاک است). فوق بلاکنقطه شروع سیستم فایل است. حجم آن 1024 بایت است و همیشه در فاصله 1024 بایت از شروع سیستم فایل قرار دارد... وجود چندین نسخه از فوق بلوک به دلیل اهمیت فوق العاده این عنصر سیستم فایل است. از فوق بلوک های تکراری برای بازیابی خرابی سیستم فایل استفاده می شود.

اطلاعات ذخیره شده در ابر بلوک برای سازماندهی دسترسی به بقیه داده های دیسک استفاده می شود. فوق بلوک اندازه سیستم فایل ، حداکثر تعداد پرونده های موجود در پارتیشن ، میزان فضای آزاد را تعیین می کند و حاوی اطلاعاتی است که در آن باید به دنبال مناطق تخصیص نیافته باشیم. هنگامی که سیستم عامل راه اندازی می شود ، superblock در حافظه خوانده می شود و همه تغییرات سیستم فایل ابتدا در کپی superblock در سیستم عامل منعکس می شود و فقط به صورت دوره ای روی دیسک نوشته می شود. این باعث بهبود عملکرد سیستم می شود زیرا بسیاری از کاربران و فرآیندها دائماً فایل ها را به روز می کنند. از طرف دیگر ، هنگام خاموش کردن سیستم ، superblock باید روی دیسک نوشته شود ، که به شما اجازه نمی دهد با خاموش کردن کامپیوتر ، کامپیوتر را خاموش کنید. در غیر این صورت ، در بوت بعدی ، اطلاعات نوشته شده در superblock با وضعیت واقعی سیستم فایل مطابقت ندارد.

ابر بلوک دارای ساختار زیر است

نام زمینه

نوعی از

یک نظر

s_inodes_count

ULONG

تعداد اینودها در سیستم فایل

s_blocks_count

ULONG

تعداد بلوک ها در سیستم فایل

s_r_blocks_count

ULONG

تعداد بلوک هایی که برای کاربر فوق العاده ذخیره شده است

s_free_blocks_count

ULONG

شمارنده بلاک رایگان

s_free_inodes_count

ULONG

شمارنده inode رایگان

s_first_data_block

ULONG

اولین بلوک که حاوی داده است. بسته به اندازه بلوک ، این فیلد می تواند 0 یا 1 باشد.

s_log_block_size

ULONG

نشانگر اندازه بلوک منطقی: 0 = 1 کیلوبایت؛ 1 = 2 کیلوبایت ؛ 2 = 4 کیلوبایت

s_log_frag_size

طولانی

نشانگر اندازه قطعه (به نظر می رسد تصور قطعه در حال حاضر استفاده نمی شود)

s_blocks_per_group

ULONG

تعداد بلوک در هر گروه بلوک

s_frags_per_group

ULONG

تعداد قطعات در هر گروه بلوک

s_inodes_per_group

ULONG

تعداد inodes در هر گروه بلوک

s_mtime

ULONG

زمان آخرین نصب سیستم فایل.

s_wtime

ULONG

زمانی که آخرین بار سیستم فایل نوشته شده است

s_mnt_count

USHORT

شمارش تعداد سوار بر روی سیستم فایل. اگر این شمارنده به مقدار مشخص شده در فیلد بعدی (s_max_mnt_count) برسد ، سیستم فایل باید بررسی شود (این کار هنگام راه اندازی مجدد انجام می شود) و شمارنده به صفر بازنشانی می شود.

s_max_mnt_count

کوتاه

عددی که نشان می دهد چند بار می توان سیستم فایل را نصب کرد

s_magic

USHORT

شماره جادویی (0xEF53) که نشان می دهد سیستم فایل از نوع ex2fs است

s_state

USHORT

پرچم هایی که وضعیت فعلی سیستم فایل را نشان می دهند (آیا تمیز است و غیره)

s_errors

USHORT

پرچم هایی که روش های رسیدگی به پیام های خطا را مشخص می کند (در صورت یافتن خطاها چه باید کرد).

s_pad

USHORT

پر كردن

s_lastcheck

ULONG

زمان آخرین بررسی سیستم فایل

s_checkinterval

ULONG

حداکثر فاصله زمانی بین بررسی سیستم فایل

s_creator_os

ULONG

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

s_rev_level

ULONG

سطح تجدید نظر سیستم فایل.

s_ رزرو شده

ULONG

افزایش 1024 بایت

پس از فوق بلوک ، توصیف کننده های گروه است. این توضیحات یک آرایه با ساختار زیر است.

نام زمینه

نوعی از

وقت ملاقات

bg_block_bitmap

ULONG

آدرس بلوک حاوی نقشه بیت بلاک گروه داده شده

bg_inode_bitmap

ULONG

آدرس بلوک حاوی نقشه inode برای این گروه

bg_inode_table

ULONG

آدرس بلوک حاوی جدول inode این گروه

bg_free_blocks_count

USHORT

شمارنده تعداد بلوک های رایگان در این گروه

bg_free_inodes_count

USHORT

تعداد اینودهای رایگان در این گروه

bg_used_dirs_count

USHORT

تعداد inodes در این گروه که دایرکتوری هستند

bg_pad

USHORT

پر كردن

bg_ رزرو شده

ULONG

پر كردن

اندازه توصیف گروه بلوک ها را می توان به صورت زیر محاسبه کرد (block_group_size_in_ext2 * group_groups) / block_size(در صورت لزوم جمع کنید).

اطلاعات ذخیره شده در توضیحات گروه برای مکان یابی بلوک و inode و نقشه inode استفاده می شود. به یاد داشته باشید که بلوک ها و گروه های بلوک از 1 شروع می شوند.

نقشه بیت بلوک ساختاری است که هر بیت آن نشان می دهد که آیا بلوک مربوطه به یک فایل اختصاص داده شده است یا خیر. اگر بیت 1 باشد ، بلاک مشغول است. این نقشه برای جستجوی بلاک های رایگان در مواردی استفاده می شود که لازم است فضایی را برای یک فایل اختصاص دهیم. نقشه بیت بلوک ها تعدادی بلوک مساوی با (number_blocks_in_group / 8) / block_size(در صورت لزوم جمع کنید).

نقشه بیتی inode عملکرد مشابه جدول inode را انجام می دهد: نشان می دهد که کدام توصیف کننده ها مورد استفاده قرار می گیرند.

ناحیه بعدی در ساختار گروه گروه برای ذخیره جدول inode فایل استفاده می شود. ساختار خود اینود در بخش فرعی بعدی با جزئیات بیشتری مورد بحث قرار می گیرد.

در نهایت ، تمام فضای باقی مانده در گروه بلوک برای ذخیره فایلهای واقعی اختصاص داده شده است.

سیستم فایلاضافی 2 با موارد زیر مشخص می شود:

  • ساختار سلسله مراتبی،
  • پردازش مداوم آرایه های داده ،
  • پسوند فایل پویا ،
  • حفاظت از اطلاعات موجود در پرونده ها ،
  • برخورد با دستگاه های جانبی (مانند پایانه ها و دستگاه های نوار) ​​به عنوان فایل.

نمایش داخلی پرونده ها

هر فایل در سیستم Ext 2 دارای یک فهرست منحصر به فرد است. فهرست شامل اطلاعاتی است که هر فرایند برای دسترسی به فایل به آن نیاز دارد. با استفاده از مجموعه کاملی از فراخوانی های سیستم و شناسایی پرونده با رشته ای از کاراکترهایی که به عنوان نام فایل عمل می کنند ، به پرونده ها دسترسی پیدا می کند. هر نام متمایز به طور منحصر به فرد یک فایل را مشخص می کند ، بنابراین هسته آن نام را به یک فهرست برای فایل ترجمه می کند.این فهرست شامل یک جدول آدرس ها برای محل اطلاعات فایل روی دیسک است. از آنجا که هر بلوک روی دیسک با شماره مخصوص خود آدرس داده می شود ، این جدول مجموعه ای از شماره های بلوک دیسک را ذخیره می کند. برای انعطاف پذیری ، هسته تکه هایی را به یک فایل اضافه می کند و اجازه می دهد اطلاعات فایل در سراسر سیستم فایل پراکنده شود. اما این طرح کار پیدا کردن داده ها را پیچیده می کند. جدول آدرس شامل لیستی از شماره های بلوک است که حاوی اطلاعات مربوط به فایل است ، اما محاسبات ساده نشان می دهد که مدیریت خطی بلوک های پرونده در فهرست ، دشوار است. برای اینکه ساختار نمای کوچک اجازه کار با فایل های بزرگ را بدهد ، جدول آدرس بلوک دیسک با ساختار نشان داده شده در شکل 1 تراز می شود.

بیشتر فایلهای Ext 2 از 10 کیلوبایت یا حتی 1 کیلوبایت بزرگتر نیستند! از آنجا که 10 کیلوبایت فایل در بلوکهای آدرس مستقیم قرار دارد ، اکثر داده های ذخیره شده در فایلها را می توان با یک دسترسی دیسک واحد قابل دسترسی بود. بنابراین ، برخلاف دسترسی به فایل های بزرگ ، کار با فایل های با اندازه استاندارد سریع است.

اینودهای فایل

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

اینود فایل دارای ساختار زیر است:

نام زمینه

نوعی از

شرح

I_mode

USHORT

نوع و حقوق دسترسی به این فایل.

I_uid

USHORT

مالک Uid.

اندازه_من

ULONG

حجم فایل بر حسب بایت

من_به وقت

ULONG

زمان آخرین دسترسی به فایل (زمان دسترسی).

I_ctime

ULONG

زمان ایجاد فایل

من_زمان

ULONG

زمان آخرین تغییر فایل

من_زمان

ULONG

زمان حذف فایل

I_gid

USHORT

شناسه گروه (GID).

پیوندهای_شماره

USHORT

پیوندها شمارش می شود.

من_بلوک می کنم

ULONG

تعداد بلوک های اشغال شده توسط فایل.

I_flags

ULONG

پرچم های پرونده (پرچم فایل)

من رزرو کردم 1

ULONG

مختص سیستم عامل

I_block

ULONG

اشاره گرهایی به بلوک هایی که داده های فایل در آنها نوشته شده است (مثال آدرس مستقیم و غیر مستقیم در شکل 1)

I_version

ULONG

نسخه فایل (برای NFS)

I_file_acl

ULONG

فایل ACL

I_dir_acl

ULONG

راهنمای ACL

I_faddr

ULONG

آدرس قطعه

I_frag

UCHAR

شماره قطعه

I_fsize

UCHAR

اندازه قطعه

I_pad1

USHORT

پر كردن

من رزرو کردم 2

ULONG

محفوظ است

فیلد نوع فایل و مجوزها یک کلمه دو بایتی است که هر بیت از آن به عنوان یک پرچم نشان دهنده ارتباط فایل با یک نوع خاص یا تنظیم یک مجوز فایل خاص است.

مشخص کننده

معنی

هدف پرچم (میدان)

S_IFMT

F000

ماسک نوع فایل

S_IFSOCK

A000

سوکت دامنه

S_IFLNK

C000

S_IFREG

8000

فایل معمولی

S_IFBLK

6000

دستگاه بلوک گرا

S_IFDIR

4000

کاتالوگ

S_IFCHR

2000

دستگاه بایت گرا (کاراکتر)

S_IFIFO

1000

لوله نامگذاری شده (fifo)

S_ISUID

0800

SUID - تغییر بیت مالک

S_ISGID

0400

SGID - بیت تغییر گروه

S_ISVTX

0200

کمی چسبنده

S_IRWXU

01C0

ماسک حقوق مالک فایل

S_IRUSR

0100

حق خواندن

S_IWUSR

0080

حق نوشتن

S_IXUSR

0040

حق اعدام

S_IRWXG

0038

ماسک حقوق گروه

S_IRGRP

0020

حق خواندن

S_IWGRP

0010

حق نوشتن

S_IXGRP

0008

حق اعدام

S_IRWXO

0007

نقاب حقوق سایر کاربران

S_IROTH

0004

حق خواندن

S_IWOTH

0002

حق نوشتن

S_IXOTH

0001

حق اعدام

چندین توصیف inode وجود دارد که برای مقاصد خاص ذخیره می شوند و نقش خاصی در سیستم فایل ایفا می کنند. اینها توصیف کنندگان زیر هستند

مشخص کننده

معنی

شرح

EXT2_BAD_INO

یک inode که فهرست inode بلوک های بد را لیست می کند

EXT2_ROOT_INO

ریشه inode

EXT2_ACL_IDX_INO

inode ACL

EXT2_ACL_DATA_INO

inode ACL

EXT2_BOOT_LOADER_INO

inode لودر بوت

EXT2_UNDEL_DIR_INO

لغو حذف inode دایرکتوری

EXT2_FIRST_INO

اولین اینود بدون رزرو

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

نام زمینه

نوعی از

شرح

اینود

ULONG

شماره inode (فهرست) فایل

rec_len

USHORT

طول این مدخل

name_len

USHORT

طول نام فایل

نام

CHAR

نام فایل

یک ورودی واحد در فهرست نمی تواند از مرز بلوک عبور کند (یعنی باید کاملاً در یک بلوک قرار گیرد). بنابراین ، اگر رکورد بعدی به طور کامل در این بلوک قرار نگیرد ، به بلوک بعدی منتقل می شود و رکورد قبلی به گونه ای ادامه می یابد که بلوک را تا انتها پر می کند.

شکل 1 بلوک های آدرس مستقیم و غیر مستقیم در فهرست

شکل 2 حجم فایل در بایت با حجم بلوک 1 کیلوبایت

شکل 3. نمایه نمونه دیسک

شکل 3 نمایه دیسک یک فایل را نشان می دهد. این فهرست متعلق به یک فایل معمولی است که متعلق به "mjb" است و اندازه آن 6030 بایت است. این سیستم به کاربر "mjb" اجازه می دهد تا فایل را بخواند ، بنویسد و اجرا کند. اعضای گروه "os" و همه کاربران دیگر فقط مجاز به خواندن یا اجرای فایل هستند ، اما داده ها را برای آن نمی نویسند. آخرین بار این پرونده در 23 اکتبر 1984 در ساعت 13:45 خوانده شد و آخرین بار در 22 اکتبر 1984 در ساعت 10:30 ضبط شد. این شاخص آخرین بار در 23 اکتبر 1984 در ساعت 1:30 بعد از ظهر اصلاح شد ، اگرچه در آن زمان هیچ اطلاعاتی در پرونده نوشته نشده بود. کرنل تمام داده های فوق را در فهرست کدگذاری می کند. به تفاوت نوشتن روی دیسک محتویات فهرست و محتویات فایل توجه کنید. محتوای فایل تنها زمانی تغییر می کند که فایل در آن نوشته شده است. محتویات فهرست هم در هنگام تغییر محتویات فایل ، و هم در هنگام تغییر مالک فایل ، حقوق دسترسی و مجموعه اشاره گر تغییر می کند. تغییر محتویات فایل به صورت خودکار باعث اصلاح فهرست می شود ، اما به روز رسانی فهرست به این معنی نیست که محتوای فایل تغییر کرده است.

کاتالوگ ها

فهرستها فایلهایی هستند که ساختار سلسله مراتبی سیستم فایل از آنها ساخته شده است. آنها نقش مهمی در تبدیل نام فایل به شماره فهرست ایفا می کنند. دایرکتوری فایلی است که محتوای آن مجموعه ای از ورودی ها است که شامل یک شماره فهرست و نام پرونده موجود در فهرست می باشد. یک نام مرکب یک رشته نویسه خاتمه یافته خالی است که توسط یک اسلش جلو ("/") به چند جزء جدا می شود. هر جزء به جز آخرین باید یک نام فهرست باشد ، اما آخرین جزء می تواند یک نام فایل غیر دایرکتوری باشد. در نسخه V UNIX ، هر جزء به 14 کاراکتر محدود می شود. بنابراین ، همراه با 2 بایت اختصاص داده شده به شماره فهرست ، اندازه ورودی فهرست 16 بایت است.

در بایت افست می شود
داخل دایرکتوری

عدد شاخص
(2 بایت)

نامفایل

1798

init

1276

fsck

clri

1268

motd

1799

کوه

mknod

2114

passwd

1717

مقدار

1851

چک لیست

fsdbld

پیکربندی کنید

1432

گتی

تصادف در

mkfs

شکل 4 قالب پوشه / etc

شکل 4 قالب پوشه "etc" را نشان می دهد. هر فهرست شامل فایلهایی است که نام آنها با یک نقطه و دو نقطه ("." و "..") نشان داده می شود و شماره فهرست آنها به ترتیب با شماره فهرست این فهرست و فهرست اصلی مطابقت دارد. شماره فهرست فایل "." در فهرست "/ etc" دارای آدرس در افست 0 و مقدار 83 است. شماره فهرست فایل ".." دارای آدرس در افست 16 از ابتدای فهرست و مقدار 2 است. خالی باشد ، با شماره نمایه 0. به عنوان مثال ، ورودی 224 در فهرست "/ etc" خالی است ، حتی اگر یکبار نقطه ورود یک پرونده به نام "خرابی" را داشت. برنامه mkfs سیستم فایل را به گونه ای اولیه می کند که اعداد فهرست فایل ها "" باشد. و ".." در فهرست اصلی همان شماره فهرست ریشه سیستم فایل هستند.

کرنل داده ها را در یک دایرکتوری ذخیره می کند ، همانطور که در یک فایل معمولی ، با استفاده از ساختار فهرست و بلوک هایی با سطوح آدرس دهی مستقیم و غیر مستقیم. فرآیندها می توانند داده های دایرکتوری ها را به همان شیوه ای که فایل های معمولی را می خوانند بخوانند ، اما هسته دسترسی نوشتاری اختصاصی به فهرست را برای اطمینان از صحیح بودن ساختار دایرکتوری محفوظ می دارد. حقوق دسترسی به دایرکتوری به این معنی است: راست خواندن به فرایندها امکان خواندن داده ها از فهرست را می دهد. اجازه نوشتن به فرایندی اجازه می دهد تا ورودی های جدیدی را در یک دایرکتوری ایجاد کند یا موارد قدیمی را حذف کند (با استفاده از عملیات سیستم creat ، mknod ، link و unlink) ، در نتیجه محتویات فهرست تغییر می کند. مجوز اجرا به یک فرایند اجازه می دهد تا یک فهرست را با نام فایل جستجو کند (زیرا در "اجرای" یک دایرکتوری فایده ای ندارد).

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

مفهوم سیستم فایل های یونیکس شامل مفهوم پیوند است. یک inode می تواند با چندین نام فایل مرتبط باشد. توصیف کننده شامل فیلدی است که شامل شماره ای است که فایل با آن ارتباط دارد. افزودن پیوند شامل ایجاد یک فهرست راهنما است که در آن شماره inode به توصیف کننده دیگری اشاره می کند و تعداد پیوندها را در توصیف کننده افزایش می دهد. هنگام حذف پیوند ، هسته تعداد مرجع را کاهش می دهد و اگر این شمارنده صفر شود توصیف کننده را حذف می کند.

چنین پیوندهایی را پیوندهای سخت می نامند و فقط می توانند در یک سیستم فایل مورد استفاده قرار گیرند (شما نمی توانید پیوندی برای یک فایل از سیستم فایل دیگر ایجاد کنید). علاوه بر این ، یک پیوند سخت فقط می تواند به یک فایل اشاره کند (یک پیوند سخت به یک دایرکتوری می تواند منجر به یک حلقه در سیستم فایل شود).

در اکثر سیستم های یونیکس ، نوع دیگری از پیوندها وجود دارد. به این پیوندها که فقط شامل نام فایل است ، پیوندهای نمادین گفته می شود. هنگام پردازش چنین پیوندهایی توسط هسته ، در حالی که مسیر را به یک فایل به اینود تبدیل می کنید ، هسته نام پیوند را با محتویات توصیف کننده (یعنی نام فایل مقصد) جایگزین می کند و مسیر فایل را دوباره تفسیر می کند. به از آنجا که یک پیوند نمادین به یک inode اشاره نمی کند ، می توان پیوندهایی را به پرونده های واقع در یک سیستم فایل متفاوت ایجاد کرد. این پیوندها می توانند به هر نوع فایلی ، حتی پرونده ای که وجود ندارد ، اشاره کنند. پیوندهای نمادین به طور گسترده ای مورد استفاده قرار می گیرند زیرا محدودیت های مشابه پیوندهای سخت را ندارند. با این حال ، آنها کمی از دیسک را اشغال می کنند ، جایی که بلوک های inode و داده ها در آن قرار دارند. استفاده از آنها می تواند منجر به تاخیرهای خاصی در تبدیل مسیر فایل به اینود شود ، که به این دلیل است که هنگام پردازش یک پیوند نمادین ، ​​هسته باید دوباره مسیر فایل را تفسیر کند.

فایل های دستگاه

در یونیکس مانند سیستم های عاملدسترسی به دستگاه ها از طریق فایل های خاص انجام می شود. چنین فایلی در سیستم فایل اشغال نمی کند. این فقط نقطه دسترسی راننده دستگاه است.

دو نوع فایل دستگاه وجود دارد: کاراکتر و بلوک. هنگام استفاده از نوع کاراکتر ، امکان تبادل داده ها با دستگاه فقط در حالت کاراکتر وجود دارد ، در حالی که فایلهای دستگاه نوع بلوک اجازه می دهند فقط بلوک ها با استفاده از بافر رد و بدل شوند. هنگامی که یک درخواست ورودی / خروجی برای فایل دستگاه ارسال می شود ، آن درخواست به درایور دستگاه مربوطه هدایت می شود. هر یک از این پرونده ها مربوط به یک عدد اصلی است که نوع دستگاه را مشخص می کند و یک عدد جزئی که خود دستگاه را مشخص می کند.

ویژگی های اضافی EXT2fs

علاوه بر ویژگی های استاندارد یونیکس ، EXT2fs برخی از ویژگی های اضافی را نیز ارائه می دهد که معمولاً توسط سیستم فایل های یونیکس پشتیبانی نمی شوند.

ویژگی های فایل به شما امکان می دهد هنگام کار با مجموعه های فایل ، پاسخ هسته را تغییر دهید. شما می توانید ویژگی ها را برای یک فایل یا دایرکتوری تنظیم کنید. در حالت دوم ، فایلهای ایجاد شده در این فهرست این ویژگیها را به ارث می برند.

در زمان نصب سیستم ، برخی از ویژگی های مربوط به ویژگی های فایل ممکن است نصب شود. گزینه mount به مدیر اجازه می دهد تا نحوه ایجاد فایل ها را انتخاب کند. در یک سیستم فایل مخصوص BSD ، فایلها با همان شناسه گروه با فهرست اصلی ایجاد می شوند. ویژگی های سیستم V تا حدودی پیچیده تر است. اگر یک دایرکتوری مجموعه بیت setgid داشته باشد ، فایل های ایجاد شده شناسه گروه آن فهرست را استنباط می کنند و زیرشاخه ها شناسه گروه و بیت setgid را به ارث می برند. در غیر این صورت ، پرونده ها و فهرستها با شناسه گروه اصلی فرآیند تماس ایجاد می شوند.

سیستم EXT2fs می تواند از تغییرات همزمان داده مشابه سیستم BSD استفاده کند. گزینه mount به سرپرست اجازه می دهد تا مشخص کند که همه داده ها (اینودها ، بلاک های بیتی ، بلاک های غیرمستقیم و دایرکتوری) هنگام تغییر در دیسک به طور همزمان نوشته می شوند. این می تواند برای دستیابی به توان بالای ضبط داده استفاده شود ، اما عملکرد را نیز کاهش می دهد. در واقع ، این عملکرد معمولاً استفاده نمی شود زیرا علاوه بر افت عملکرد ، می تواند منجر به از دست رفتن داده های کاربر شود که هنگام بررسی سیستم فایل علامت گذاری نشده است.

EXT2fs به شما امکان می دهد هنگام ایجاد یک سیستم فایل ، اندازه بلوک منطقی را انتخاب کنید. اندازه آن می تواند 1024 ، 2048 یا 4096 بایت باشد. استفاده از بلوک های بزرگ منجر به عملکرد سریعتر I / O (از آنجا که تعداد درخواست ها به دیسک کاهش می یابد) و در نتیجه ، حرکت سر کمتر می شود. از طرف دیگر ، استفاده از بلوک های بزرگ منجر به از دست دادن فضای دیسک می شود. معمولاً آخرین بلوک فایل برای ذخیره اطلاعات به طور کامل استفاده نمی شود ، بنابراین ، با افزایش اندازه بلوک ، میزان هدر رفته فضای دیسک افزایش می یابد.

EXT2fs به شما امکان می دهد از پیوندهای نمادین شتابدهنده استفاده کنید. هنگام استفاده از چنین پیوندهایی ، از بلوک های داده سیستم فایل استفاده نمی شود. نام فایل مقصد در بلوک داده ذخیره نمی شود ، بلکه در خود inode ذخیره می شود. این ساختار به شما امکان می دهد فضای دیسک را ذخیره کرده و پردازش پیوندهای نمادین را سرعت بخشید. البته ، فضای اختصاص داده شده برای توصیف محدود است ، بنابراین نمی توان هر پیوندی را به صورت شتابده ارائه کرد. حداکثر طول نام فایل در پیوند شتابدهنده 60 نویسه است. در آینده نزدیک ، برنامه ریزی شده است که این طرح برای پرونده های کوچک گسترش یابد.

EXT2fs وضعیت سیستم فایل را کنترل می کند. هسته از یک فیلد جداگانه در superblock برای نشان دادن وضعیت سیستم فایل استفاده می کند. اگر سیستم فایل در حالت خواندن / نوشتن نصب شده باشد ، وضعیت آن روی "پاک نمی شود" تنظیم شده است. در صورت برچیده شدن یا نصب مجدد در حالت فقط خواندنی ، وضعیت آن روی "Clean" تنظیم شده است. در هنگام راه اندازی سیستم و بررسی وضعیت سیستم فایل ، از این اطلاعات برای تعیین نیاز به بررسی سیستم فایل استفاده می شود. کرنل همچنین برخی از خطاها را در این زمینه قرار می دهد. هنگامی که کرنل ناسازگاری را تشخیص می دهد ، سیستم فایل با عنوان "Erroneous" مشخص می شود. بررسی کننده سیستم فایل این اطلاعات را برای بررسی سیستم آزمایش می کند ، حتی اگر وضعیت آن در واقع "تمیز" باشد.

نادیده گرفتن طولانی مدت آزمایش سیستم فایل گاهی اوقات می تواند منجر به برخی مشکلات شود ، بنابراین EXT2fs شامل دو روش برای بررسی منظم سیستم است. superblock شامل شمارنده نصب سیستم است. هر زمان که سیستم در حالت خواندن / نوشتن نصب شود ، این شمارنده افزایش می یابد. اگر مقدار آن به حداکثر مقدار خود برسد (همچنین در superblock ذخیره می شود) ، برنامه تست سیستم فایل شروع به بررسی آن می کند ، حتی اگر وضعیت آن "Clean" باشد. آخرین زمان بررسی و حداکثر فاصله بین چک ها نیز در superblock ذخیره می شود. هنگامی که حداکثر فاصله بین بررسی ها به دست می آید ، وضعیت سیستم فایل نادیده گرفته می شود و بررسی آن شروع می شود.

سیستم EXT2fs شامل ابزارهایی برای پیکربندی آن است. برنامه tune2fs می تواند برای تغییر موارد زیر استفاده شود:

  • اقدامات هنگام تشخیص خطا هنگامی که کرنل ناسازگاری را تشخیص می دهد ، سیستم فایل به عنوان "اشتباه" علامت گذاری می شود و یکی از سه اقدام زیر را می توان انجام داد: ادامه اجرا ، نصب مجدد سیستم فایل در حالت فقط خواندنی برای جلوگیری از آسیب به آن ، راه اندازی مجدد سیستم برای بررسی سیستم فایل
  • حداکثر مقدار نصب
  • حداکثر فاصله بین چک ها
  • تعداد بلوک های منطقی که برای کاربر اصلی ذخیره شده است.

از گزینه های مشخص شده در mount نیز می توان برای تغییر رفتار هسته در هنگام تشخیص خطا استفاده کرد.

استفاده از ویژگی ها به کاربران اجازه می دهد فایل های مخفی را حذف کنند. هنگام حذف چنین فایلی ، اطلاعات تصادفی در بلوک هایی که قبلاً برای قرار دادن این فایل استفاده می شد ، نوشته می شود. این مانع از دسترسی افراد خارجی به محتویات قبلی این فایل با استفاده از ویرایشگر دیسک می شود.

اخیراً انواع فایل جدیدی به سیستم EXT2fs اضافه شده است که از سیستم فایل 4.4 BSD گرفته شده است. فایلهای نوع اول فقط برای خواندن قابل استفاده هستند: هیچ کس حق تغییر یا حذف آنها را ندارد. این می تواند برای محافظت از فایل های پیکربندی مهم استفاده شود. نوع دیگری از پرونده ها فایل هایی هستند که می توانند در حالت نوشتن باز شوند و داده ها فقط می توانند به انتهای آن فایل اضافه شوند. فایل های این نوع نیز قابل حذف یا تغییر نام نیستند. آنها می توانند به عنوان فایل های log استفاده شوند ، که فقط می توانند در اندازه بزرگ شوند.

بهینه سازی عملکرد

سیستم EXT2fs دارای عملکردهای زیادی است که عملکرد آن را بهینه می کند ، که منجر به افزایش سرعت تبادل اطلاعات هنگام خواندن و نوشتن فایل ها می شود.

EXT2fs به طور فعال از بافر دیسک استفاده می کند. هنگامی که یک بلوک باید خوانده شود ، هسته یک درخواست I / O برای چندین بلوک نزدیک صادر می کند. بنابراین ، کرنل سعی می کند مطمئن شود که بلوک بعدی که باید خوانده شود از قبل در بافر دیسک بارگذاری شده است. چنین عملیات معمولاً با خواندن متوالی پرونده ها انجام می شود.

سیستم EXT2fs همچنین شامل تعداد زیادی بهینه سازی مکان اطلاعات است. گروه های بلوک برای ترکیب اینودها و بلوک های داده استفاده می شود. کرنل همیشه سعی می کند بلوک های داده یک فایل را در یک گروه و همچنین توصیف کننده آن قرار دهد. این به منظور کاهش حرکت سر درایوها هنگام خواندن توصیف کننده و بلوک های داده مربوطه است.

هنگام نوشتن داده ها بر روی یک فایل ، EXT2fs هنگام اختصاص یک بلوک جدید حداکثر 8 بلوک مجاور را از قبل اختصاص می دهد. این روش به شما این امکان را می دهد که هنگام بارگیری زیاد سیستم به عملکرد بالایی دست پیدا کنید. همچنین اجازه می دهد تا بلوک های مجاور فایل ها را اختصاص دهید ، که باعث می شود آنها سریع خوانده شوند.

کتابخانه EXT2fs

کتابخانه libext2fs برای ساده سازی استفاده از منابع EXT2fs و کار بر روی ساختارهای کنترلی این سیستم فایل توسعه یافته است. این کتابخانه شامل توابعی است که می تواند برای تعریف و تغییر داده ها در سیستم فایل EXT2 با دسترسی مستقیم به یک دستگاه فیزیکی مورد استفاده قرار گیرد.

اکثر ابزارهای EXT2fs (mke2fs ، e2fsck ، tune2fs ، dumpe2fs ، debugfs و غیره) از این کتابخانه استفاده می کنند. این امر بسیار ساده تر می کند تا بتوانید این ابزارها را تغییر دهید ، زیرا هر گونه تغییری در آن ایجاد می شود فرصت های اضافیسیستم فایل EXT2fs باید فقط در کتابخانه EXT2fs ساخته شود.

از آنجا که رابط کتابخانه EXT2fs بسیار گسترده و انتزاعی است ، می توان از آن برای نوشتن برنامه هایی که نیاز به دسترسی مستقیم به سیستم فایل دارند ، استفاده کرد. به عنوان مثال ، از کتابخانه EXT2fs هنگام انتقال یک 4.4 BSD Dump و بازیابی برخی از ابزارها استفاده شد. تغییرات بسیار کمی برای انطباق این ابزارها با لینوکس مورد نیاز بود (لازم بود چندین تابع تعامل با سیستم فایل را با تماس با کتابخانه EXT2fs جایگزین کرد).

کتابخانه EXT2fs دسترسی به عملیات چندین کلاس را فراهم می کند. کلاس اول عملیات مربوط به سیستم فایل است. هر برنامه ای می تواند یک سیستم فایل را باز یا بسته کند ، یک بلوک از بیت ها را بخواند یا بنویسد ، یک سیستم فایل جدید روی دیسک ایجاد کند. همچنین عملکردهایی در لیست بلاک های بد در سیستم فایل وجود دارد.

دسته دوم عملیات با دایرکتوری ها کار می کند. برنامه ای که از کتابخانه EXT2fs استفاده می کند می تواند یک دایرکتوری ایجاد یا گسترش دهد ، و همچنین ورودی های یک فهرست را اضافه یا حذف کند. توابعی برای تعیین مسیر فایل توسط توصیف کننده inode و برای تعیین مسیر فایل توسط توصیف کننده مشخص وجود دارد.

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

امکانات سیستم EXT2fs

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

برنامه tun2fs می تواند برای تنظیم پارامترهای سیستم فایل مورد استفاده قرار گیرد.برای تغییر پاسخ به خطاها ، حداکثر تعداد نصب سیستم ، حداکثر فاصله بین بررسی سیستم و تعداد بلوک های منطقی که برای کاربر اصلی ذخیره شده است ، استفاده می شود.

شاید جالب ترین ابزار بررسی سیستم فایل باشد. E2fsck برای رفع ناهماهنگی در سیستم فایل پس از خاموش شدن نادرست کل سیستم طراحی شده است. نسخه اولیه برنامه e2fsck بر اساس برنامه Linus Torvald fsck برای سیستم فایل Minix است. با این حال ، نسخه فعلی برنامه با استفاده از کتابخانه EXT2fs بازنویسی می شود و سریعتر است و می تواند هنگام بررسی آن ، در مقایسه با نسخه اصلی ، خطاهای بیشتری را در سیستم برطرف کند.

برنامه e2fsck طوری طراحی شده بود که با حداکثر سرعت اجرا شود. از آنجا که برنامه های بررسی سیستم فایل منجر به بوت شدن دیسک می شود ، باید الگوریتم های e2fsck را به گونه ای بهینه کنید که دسترسی به ساختارهای سیستم فایل بسیار کمتر باشد. و علاوه بر این ، ترتیب بررسی اینودها و دایرکتوری ها با توجه به شماره بلوک انجام می شود تا زمان حرکت سر درایوهای دیسک کاهش یابد.

در اولین گذر ، e2fsck تمام اینودهای سیستم فایل را اجرا می کند و هر توصیف کننده را به عنوان یک عنصر جداگانه از سیستم بررسی می کند. بنابراین ، این آزمایش دیگر اشیاء سیستم فایل را بررسی نمی کند. یکی از اهداف چنین چک هایی بررسی وجود نوع فایل در حال بررسی ، و همچنین مطابقت همه بلوک های توصیف کننده با بلوک ها با اعداد موجود است. اولین پاس ، نقشه های بیت را بررسی می کند که نشان دهنده استفاده از بلوک ها و توصیف کننده ها است.

اگر e2fsck بلوک های داده ای را که در بیش از یک توصیف کننده شماره گذاری شده اند پیدا کند ، 1B تا 1D را برای تعیین ناسازگاری اجرا می کند ، چه با افزایش بلوک های مشترک و چه با حذف یک یا چند توصیف کننده.

اولین پاس بیشترین زمان را می گیرد ، زیرا همه اینودها باید در حافظه خوانده و بررسی شوند. برای کاهش زمان عملیات ورودی / خروجی در گذرهای بعدی ، تمام اطلاعات لازم در بافر باقی می ماند. ویژگی بارز این طرح جستجو برای همه بلوک های فهرست در سیستم فایل است. برای به دست آوردن این اطلاعات ، در گذر دوم ، ساختارهای توصیف کننده همه فهرستهای سیستم فایل دوباره خوانده می شود.

در پاس دوم ، دایرکتوری ها به عنوان بررسی می شوند عناصر فردیسیستم فایل هر بلوک دایرکتوری به صورت جداگانه ، بدون اشاره به سایر بلوک های فهرست ، بررسی می شود. این به e2fsck اجازه می دهد تا همه بلوک های فهرست را بر اساس شماره بلوک مرتب کرده و آنها را به ترتیب صعودی بررسی کند ، بنابراین زمان دسترسی به دیسک را کاهش می دهد. بلوک های دایرکتوری مورد آزمایش قرار می گیرند تا اطمینان حاصل شود که مدخل آنها معتبر است و حاوی ارجاعاتی به توصیف کننده ها با اعداد موجود است (همانطور که در مرحله اول تعریف شده است).

برای اولین بلوک فهرست در هر توصیف کننده فهرست ، وجود "." و ".." ، و شماره توصیف کننده برای نوشتن "" چقدر است. " با فهرست فعلی مطابقت دارد (شماره توصیف کننده برای نوشتن ".." تا پاس سوم آزمایش نمی شود.)

در گذر دوم ، اطلاعات مربوط به فهرست اصلی در یک بافر ذخیره می شود.

لازم به ذکر است که در پایان پاس دوم ، تقریباً تمام عملیات ورودی / خروجی دیسک به پایان می رسد. تمام اطلاعات مورد نیاز برای پاس سوم ، چهارم و پنجم در حافظه است ، با این حال ، بقیه گذرها پردازنده را بارگیری می کنند و کمتر از 5 تا 10 درصد از کل اجرای e2fsck را می گیرند.

در پاس سوم ، پیوندهای دایرکتوری بررسی می شوند. E2fsck با استفاده از اطلاعات به دست آمده در گذر دوم ، مسیرهای هر دایرکتوری را در جهت ریشه بررسی می کند. ورودی ".." برای هر فهرست نیز در اینجا علامت گذاری شده است. همه دایرکتوری هایی که بعد از اسکن یافت می شوند و هیچ ارتباطی با فهرست اصلی ندارند در فهرست / lost + found قرار می گیرند.

در گذر چهارم ، e2fsck با مشاهده همه توصیف کننده ها و مقایسه تعداد پیوندها (این اطلاعات از گذر اول ذخیره می شود) با شمارنده های داخلی که در پاس دوم محاسبه شده بود ، تعداد پیوندها را برای هر اینود بررسی می کند. همه فایلهای حذف نشده با تعداد مرجع صفر نیز در فهرست / lost + found قرار می گیرند.

سرانجام ، در پاس پنجم ، e2fsck بررسی می کند که همه اطلاعات مربوط به سیستم فایل مطابقت دارد. در اینجا نقشه های بیت بلوک ها و توصیف کننده ها ، که در گذرهای قبلی به دست آمده اند ، با مقادیر واقعی مقایسه می شوند و در صورت لزوم ، اطلاعات روی دیسک بر این اساس تصحیح می شود.

ابزار مفید دیگر اشکال زدایی سیستم فایل است. Debugfs یک برنامه قدرتمند است که به شما امکان می دهد وضعیت سیستم سیستم را تعیین و تنظیم کنید. در اصل ، این یک رابط تعاملی برای کتابخانه EXT2fs است ، یعنی دستورات تایپ شده را به فراخوانی توابع کتابخانه تبدیل می کند.

از اشکال زدایی می توان برای تعریف ساختار سیستم فایل داخلی ، تعمیر دستی سیستم آسیب دیده یا ایجاد آزمایشات مشروط برای e2fsck استفاده کرد. متأسفانه ، اگر نمی دانید چگونه از آن استفاده کنید ، این برنامه می تواند به سیستم فایل آسیب برساند. با استفاده از این ابزار ، کافی است سیستم فایل را به سادگی از بین ببرید. بنابراین debugfs به طور پیش فرض سیستم فایل را در حالت فقط خواندنی باز می کند. برای دسترسی به خواندن / نوشتن ، از گزینه -w استفاده کنید.

محاسبه عملکرد

نتایج آزمایش Bonnie را می توانید از جدول زیر مشاهده کنید:

بر اساس ضبط کاراکتر (کیلوبایت بر ثانیه)

مسدود کردن ضبط (کیلوبایت بر ثانیه)

ضبط (کیلوبایت بر ثانیه)

خواندن بر اساس شخصیت (کیلوبایت / ثانیه)

مسدود کردن خواندن (کیلوبایت بر ثانیه)

BSD Async

BSD همگام سازی

Ext2 fs

1237

1033

شیا fs

نتایج برای بلوک ورودی / خروجی بسیار خوب است: EXT2fs از نظر عملکرد بهتر از سایر سیستم ها است. این به دلیل بهینه سازی هایی است که در روال های قرارگیری گنجانده شده است. سرعت ضبط نیز به اندازه کافی سریع است ، زیرا در حالت gupp انجام می شود. سرعت بالای خواندن به این دلیل است که بلوک ها در یک فایل توزیع شده اند ، بنابراین هد های درایو بین دو خواندن حرکت نمی کنند و بهینه سازی پیش خوانی به طور کامل کار می کند.

از طرف دیگر ، سیستم FreeBSD عملکرد بهتری برای شخصیت ورودی / خروجی دارد. این ممکن است به این دلیل باشد که FreeBSD و Linux از رویه های متفاوتی برای کتابخانه های C مربوطه استفاده می کنند. علاوه بر این ، FreeBSD به احتمال زیاد دارای بهینه ترین کتابخانه خواندن نمادین است و بنابراین در اینجا تا حدودی بهتر عمل می کند.

نتایج آزمایش اندرو

نتایج آزمایش اندرو را می توانید از جدول زیر مشاهده کنید:

گذر 1 ایجاد

گذر 2 کپی

گذراندن 3 بررسی وضعیت

چک تراورس 4 بایت

مرحله 5 گردآوری

2203

7391

6319

17466

75314

BSD همگام سازی

2330

7732

6317

17499

75681

Ext2 fs

نتایج دو پاس اول نشان می دهد که لینوکس با ارتباطات ناهمزمان برنده می شود. با ایجاد دایرکتوری ها و فایل ها ، سیستم BSD همزمان توصیف کننده ها و ورودی های فهرست را می نویسد. تصور می شود که پشتیبانی ناهمزمان از FreeBSD هنوز به طور کامل اجرا نشده است.

در پاس سوم ، مقادیر لینوکس و BSD بسیار مشابه هستند. در حالی که BSD عملکرد بهتری دارد ، افزودن بافر نام فایل به VFS لینوکس این مشکل را برطرف می کند.

لینوکس در چهارم و پنجم سریعتر از FreeBSD است ، عمدتا به دلیل استفاده از مدیریت بافر یکپارچه. اندازه بافر می تواند در صورت نیاز رشد کرده و حافظه بیشتری را نسبت به FreeBSD که از اندازه ثابت استفاده می کند ، اشغال کند. مقایسه نتایج سیستم های EXT2fs و Xia fs نشان می دهد که بهینه سازی موجود در EXT2fs در واقع مورد استفاده قرار می گیرد: تفاوت عملکرد بین این سیستم ها حدود 5-10 درصد است.

نتیجه

فایل سیستم EXT2 بیشترین استفاده را از کاربران لینوکس دارد. این ویژگی های استاندارد یونیکس و عملکردهای اضافی را ارائه می دهد. علاوه بر این ، به لطف بهینه سازی های موجود در هسته ، از نظر عملکرد نتایج عالی را نشان می دهد.

سیستم EXT2fs شامل توابع برای افزودن قابلیت های جدید است. برخی از افراد در حال توسعه برنامه های افزودنی برای سیستم فایل واقعی هستند: Posix ACL ، بازیابی فایل های حذف شدهو فشرده سازی فایل در زمان واقعی

سیستم EXT2fs ابتدا در هسته لینوکس ادغام شد و اکنون به طور فعال به سایر سیستم عامل ها منتقل می شود. EXT2fs همچنین بخش مهمی از سیستم عامل Masix است که در حال حاضر توسط یکی از نویسندگان در حال توسعه است.