کامپیوتر و اُپن سورس(Computer & Open Source)

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

کامپیوتر و اُپن سورس(Computer & Open Source)

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

Mono چیست؟

به طور خلا‌صه در مورد عملکرد و کاربرد مونو می‌توان گفت که: مونو ابزاری برای کامپایل و ایجاد اسمبلی‌ها و برنامه‌های کاربردی نوشته شده با قابلیت‌های دات‌نت است و این امکان را می‌دهد تا یک کد یکتا بدون نیاز به بازنویسی یا کامپایل مجدد روی پلتفرم‌های مورد پشتیبانی (که در بالا‌ آمد) به راحتی و آسانی قابل اجرا باشد. می‌توان گفت که مونو عملکردی مشابه چهارچوب Common Language Infrastructure) CLI) دات‌نت مایکروسافت دارد؛ با این تفاوت که مونو چهارچوبی کلی‌تر و مجانی برای پلتفرم‌های گسترده‌تر فراهم می‌کند.

با این‌که تعداد زیادی از برنامه‌نویسان و توسعه‌دهندگان نرم‌افزار در سطح جهان به ابزارهای مبتنی بر ویندوز و دات‌نت عادت کرده‌اند،‌ زمان آن رسیده است بدانید که می‌توانید اسمبلی‌های دات‌نت را روی سکوهای Mac OSX ،Solaris ،AIX و تعداد زیادی از لینوکس‌ها کامپایل و اجرا کنید. در حالی که Cross-Platform (یا استقلا‌ل نسبت به سکوی کاری) بودن این چارچوب کاری (یعنی مونو) به برنامه‌هایی از قبیل Hello World محدود نشده است و می‌توانید به آسانی با مونو، اسمبلی‌های آماده تولید مبتنی بر ADO.NET،‌ فرم‌های ویندوز، ASP.NET و ... را ایجاد و اجرا کنید.

نصب Mono 
برای شروع کار در ویندوز، باید نسخه مخصوص ویندوز MONO را دانلود و نصب نمایید. پس از دریافت فایل Mono Installer for Windows آن را اجرا کنید و پروسه نصب را پی بگیرید. توجه داشته باشید که Mono هیچ تداخلی با Microsoft.NET یا MS Visual Studio از قبل نصب شده نخواهد داشت.

در زمان تهیه این مقاله، بهترین و آخرین نسخه عرضه شده مونو، 1.15 است. اگر بعد از نصب به دایرکتوری این نسخه از مونو مراجعه کنید، با تعداد زیادی از زیر پوشه‌ها از جمله etc ،contrib ،man ،share و ... مواجه خواهید شد. (که برای کاربران لینوکس آشناست) (شکل 1). شکل 1 ساختار پوشه مونو را نشان می‌دهد.

در این مقاله فقط با فولدرهای ‌bin/ (که حاوی بسیاری از ابزارهای مونو از جمله کامپایلر #C)، 
Global Asscmbly Cache: GAC lib\mono\gac چارچوب کاری مونو) سروکار خواهیم داشت.

چون اکثر ابزارهای مونو را از دایرکتوری ‌bin\ و از طریق خط فرمان اجرا خواهید کرد، لذا بهتر است آدرس آن را به متغیر محیطی Path سیستم‌عامل خود اضافه کنید. برای سهولت در کار، می‌توانید از خط فرمان MONO استفاده کنید. این ابزار می‌تواند به طور خودکار ابزارهای خط فرمانی را شناسایی کند وآن‌ها را به کار گیرد. آدرس این کنسول: Start>All Program >Mono For Windows> Applications حال برای اطمینان از صحت نصب، فرمان زیر را وارد کنید:

mono-- version

اگر همه کارها به درستی انجام شده باشد، جزئیات بسیاری مطابق آنچه در تصویر شماره 2 نشان داده شده است، نمایش داده خواهد شد. 

شکل 2

فهرست 1

کامپایلرهای Mono

مونو، همانند توزیع CLI مایکروسافت، حاوی تعدادی کامپایلر مدیریت شده است. این کامپایلر عبارتند از:
 
●‌‌ کامپایلرهای #mcs.exe : C و gmcs  
●‌‌‌کامپایلر BASIC مونو: mbas.exe
●‌‌‌کامپایلر زبان booc.exe :Boo 
●‌‌‌کامپایلرهای CIL مونو: IIasm.exe, ilasm.exe 

در این مقاله فقط از کامپایلرهای #C استفاده خواهیم کرد، اما در مورد کامپایلر بیسیک مونو باید گفت که یک مجموعه کامل و غنی از Visual Basic.NET است که با هدف ایجاد و توسعه یک زبان برنامه‌نویسیِ به آسانی قابل فهم برای آنان در دنیای لینوکس / یونیکس و Mas OSX عرضه شده است و همچنان در حال توسعه و بازبینی قرار دارد. Boo نیز یک زبان شی‌ء‌گرا از نوع ایستا است که بر مبنای Python نوشته شده است. برای آشنایی بیشتر با این کامپایلر به این سایت مراجعه کنید. llasm.exe و ilasm.exe نیز کامپایلرهای CIL مونو هستند که دومی از ساختارهای زبانی NET 2.0 پشتیبانی می‌نماید.
 

کار با کامپایلرهای #C
mcs.exe اولین #C بود که برای پروژه مونو در نظر گرفته شد. این کامپایلر با 1.1#C مطابقت کامل دارد (در حقیقتmcs.exe با #C نوشته شده است) و همانند کامپایلر خط فرمان مایکروسافت یعنی (csc.exe) از response fileها پشتیبانی می‌کند. یعنی که می‌توانید با اضافه کردن فلگ‌های /target ،/out ،/reference و ... به ترتیب نوع اسمبلی، نام اسمبلی کامپایل شده و وابستگی‌های خارجی فهرست اسمبلی را برای کامپایلر تعیین کنید. می‌توانید تمام آپشن‌های قابل استفاده در mcs.exe را با دستور زیر مرور کنید:

 ؟- mcs.exe  

 gmcs.exe یا(genericmcs.exe) نسخه‌ای از mcs.exe است که از #C مخصوص NET 2.0 و ارجاع‌های کتابخانه‌های پایه‌ای کلا‌س مبتنی بر NET 2.0 پشتیبانی می‌کند. در حقیقت تفاوت این دو کامپایلر در اینجاست که mcs.exe به طور خودکار به Base Class Libraryهای مبتنی بر NET 1.1 مراجعه می‌کند، در صورتی که gmcs.exe به طور پیش‌فرض از Base Class Libraryهای مبتنی بر NET 2.0 به عنوان مرجع استفاده می‌نماید. با این حساب،gmcs.exe در آینده کامپایلر پیش‌فرض مونو خواهد شد و mcs.exe از دور خارج خواهد گردید.

ایجاد یک Code Library دات‌نت با Mono
برای آشنایی با مونو در عمل، از ایجاد یک کتابخانه که با نام Core LibDump.dll شروع می‌کنیم. این اسمبلی حاوی یک نوعِ تک کلا‌سه با نام CoreLib Dumper و دارای یک متد استاتیک با نام DumpTypeTo File است. این متد یک رشته که معرف یک نام معتبر از یک Type موجود درون mscorlib.dll را می‌گیرد و اطلا‌عات مرتبط با آن Type را به یک فایل محلی در هارددیسک منتقل می‌کند که کامل این برنامه در فهرست 1 آمده است. برای مثال، اگر پارامتر رشته‌ای ورودی به این متد System.Threading.Thread باشد، فایل خروجی System.Threading.Thread.txt نام خواهد داشت. با این‌که می‌توانید این برنامه را با واردکردن آرگومان‌های تعریفی به صورت مجزا کامپایل کنید،  این‌کار با استفاده از فایل‌های response ساده‌تر و راحت‌تر انجام می‌پذیرد. برای این کار، فایلی را با نامCorelibDumper.rsp در کنار فایل CoreLibDumper.cs ایجاد نمایید و مجموعه فرامین زیر را در آن وارد کنید:

target: library/
out: CorelibDumper.dll/
CoreLibDumper.cs

حال می‌توانید کتابخانه مذکور را با دستور زیر کامپایل کنید:
gmcs @corelibDumper.rsp‌

البته بدون فایل‌های rsp.* باید کامپایل را این‌گونه انجام می‌دادید:

gmcs/target: library out:Corelib/.Dumper.dll
Corelib Dumper.cs

تخصیص یک نام قوی به CoreLib Dumper.dll 
مونو از ایجاد اسمبلی‌های نام قوی و به اشتراک‌گذاری شده در Global Assembly Cache) GAC) نیز پشتیبانی می‌کند. یعنی می‌توان کتابخانه‌ای را که ایجاد کرده‌اید، در GAC به صورت فراگیر به اشتراک بگذارید. برای ایجاد داده‌های کلیدی public/private، مونو از sn.exe (که کم و بیش مثل محصول مایکروسافتی هم نام خود عمل می‌کند) استفاده می‌نماید. برای مثال، دستور زیر یک فایل snk.* ایجاد می‌کند: (برای کسب اطلا‌عات بیشتر از فلگ ؟ - در پایان فرمان استفاده کنید).

sn/ k   myTest KeyPair.snk

حال برای این‌که به #C بگوییم از این کلید ایجاد‌شده برای تخصیص یک نام قوی به کتابخانه CoreLibDumper.dll  استفاده کند، باید فایل CoreLibDumper.rsp را به صورت زیر درآورید:

target: library/
out: CoreLibDumper.dll/
Keyfile: myTest KeyPair.snk/
CoreLibDumper.cs
حال با فرمان زیر، کتابخانه خود را دوباره کامپایل می‌کنیم:

gmcs @corelibDumper.rsp‌

مشاهده فهرست بروزرسانی‌شده با monodis.exe 
قبل از قرار دادن اسمبلی در GAC، در مورد monodis.exe (که عملکردی مشابه ildasm.exe مایکروسافت دارد) بدانید که می‌توانید با استفاده از آن، کُد CIL، فهرست کلی و انواع metadata برای یک اسمبلی مشخص را مشاهده کنید.

مثلا‌ً می‌خواهیم اطلا‌عات مربوط به اسمبلی نام قویِ جدیدی که ایجاد کرده‌ایم را با سوییچ assembly مشاهده کنیم. شکل 3 پاسخ به دستور زیر را نشان می‌دهد:

monodis-- assembly   CoreLibDumper.dll
همان‌طور که می‌بینید، فهرست کلی اسمبلی، حاوی کلیدی که در myTest keypair.snk ایجاد کردیم نیز می‌باشد.

شکل 3

شکل 4

نصب اسمبلی‌ها در GAC
 
حال که یک کتابخانه strong-name ایجاد کرده‌ایم، باید آن را توسط ابزار gacutil.exe در GAC نصب کنیم. همانند ابزار مشابه مایکروسافتی که به همین نام عرضه شده است، gacutil.exe برای نصب، uninstall و مرور اسمبلی‌های ساخته شده کاربر در GAC مورد استفاده قرار می‌گیرد. (توجه کنید که GAC در دایرکتوری
ProgramFiles\Mono\lib\mono\gac\... قرار دارد).

دستور زیر CoreLib Dumper.dll را به صورت یک اسمبلی به اشتراک‌گذاری شده در ماشین محلی در Global Assembly Cache نصب می‌کند. (از خط فرمان مونو برای این‌کار استفاده کنید):

gacutil- i   CoreLibDumper.dll

حال باید بتوانید یک پوشه جدید با نام CoreLibDumper در پوشه gac \...(مسیر اصلی این پوشه در بالا‌ ذکر شد) ببینید. شکل 4  این پوشه را در فولدر GAC نمایش می‌دهد.

ایجاد یک Console Application با مونو
بیایید یک کلا‌ینت ساده که آن را ConsoleClientApp.exe خواهیم نامید ایجاد کنیم. یک فایل جدید با نامConsoleClientApp.cs بسازید و کد آورده شده در فهرست 2 را در آن وارد کنید. 

 

فهرست 2


دقت کنید که متد () main از کاربر نام یک نوعِ کاملا‌ً تعریف شده را درخواست خواهد کرد. متد ()TypeDumper.DumpTypetofile نیز از نام وارد شده توسط کاربر برای بازیابی Type و ارسال اطلا‌عات آن به یک فایل متنی استفاده می‌کند. حال یک فایل ConsoleClient App.rsp ایجاد نمایید و کد زیر را در آن وارد کنید: (این فایل به Corelib Dumper.dll رجوع خواهد کرد.)

target: exe/
out: Console ClientApp.exe/
reference: CoreLibDumper.dll/
ConsoleClientApp.cs

حال برای ایجاد فایل اجرایی، کد بالا‌ را با دستور ذیل کامپایل می‌کنیم:

gmcs @consoleClinetApp.rsp‌
قبل از اجرای این برنامه، فایل CoreLibDumper.dll را که در دایرکتوری جاری فایل اجرایی کامپایل شده قرار دارد، به DontuseCoreLibDumper.dll تغییرنام دهید. دلیل این کار این است که شما اسمبلی خود را در GAC نصب کرده‌اید و در صورت رجوع به آن در طی اجرای برنامه‌، از کپی نصب شده در GAC استفاده خواهید کرد، نه نسخه محلی کتابخانه CoreLibDumper.dll.

پس از انجام مراحل بالا‌، حالا‌ می‌توانیم ConsoleClientApp.exe را در موتور زمان اجرای Mono با دستور زیر اجرا کنیم:

Mono  ConsoleClientApp.exe

اکنون، برای مثال System.Threading.Thread را وارد کنید. برنامه، Type مورد نظر را جست‌وجو می‌نماید و در نهایت یک فایل با نام System.Threading.Thread.tex ایجاد خواهد کرد که حاوی تعریف‌های metadata این نوع خواهد بود. شکل 5 محتویات فایل مذکور را نشان می‌دهد.
 
 

شکل 5


قبل از آن‌که به ایجاد برنامه‌های کاربردی مبتنی بر فرم‌های ویندوز بپردازیم، این آزمایش را انجام دهید: با استفاده ازWindows  Explorer، پوشه کاری خود را باز نمایید و سعی کنید با دوبار کلیک روی فایل ConsoleClientApp.exe، آن را اجرا کنید. همان طور که می‌بینید، این کار باعث رخ دادن FileNotFoundExeption خواهد شد. ممکن است تصور کنید این اتفاق به دلیل تغییر نام CoreLibDumper.dll افتاده است. اما باید بدانید که دلیل اصلی آن است که با دوبار کلیک روی این فایل، آن را از طریق Microsoft CLR اجرا خواهید کرد.

به یاد داشته باشید که برای اجرای برنامه‌ها تحت مونو، باید آن‌‌ها را توسط Mono.exe اجرا نمایید. در غیر این‌صورت، برنامه کاربردی از طریق Microsoft CLR (که از اسمبلی‌های اشتراکی نصب‌شده در Microsoft GAC و واقع در دایرکتوری Assembly\ استفاده می‌کند) اجرا خواهد گردید. در مواردی خاص ممکن است برنامه بدون مشکل اجرا گردد. در این حالت فقط می‌توانید از اسمبلی‌های NET. استفاده نمایید و در صورت رجوع به کتابخانه‌های ایجاد شده توسط خودتان، با FileNotFoundExeption مواجه خواهید شد.
 

ایجاد یک برنامه کاربردی بر مبنای فرم‌های ویندوز
قبل از ادامه کار، DontuseCoteLibDumper.dll را به همان نام قبلی یا CoreLibDumper.dll تغییر نام دهید. سپس یک فایل جدید #C ایجاد نمایید و آن را WinFormsClientApp.cs بنامید.

در این فایل دو type با استفاده از قابلیت‌های 2.0 #C تعریف شده و چند کلا‌س ایستا به همراه متدهای ناشناس به کار رفته‌اند که در فهرست 3 موجود است.
 

فهرست 3


باز هم مثل قبل، پیش از کامپایل یک فایل rsp.* با نام WinFormsClientApp.rsp ایجاد نمایید و فرامین زیر را در آن وارد کنید:

target: winexe/
out: WinFormsClientApp.exe/
reference: CoreLibDumper.dll/
reference: System.Windiws.Forms.dll/
reference: System.Drawing.dll/
WinFormsClientApp.cs

حال با فرمان زیر، پروژه را کامپایل کنید:
 
gmcs @winformsClientApp.rsp

در صورتی که برنامه کامپایل شده را با mono.exe اجرا کنید، چیزی مشابه شکل 6 مشاهده خواهید کرد.

 
 

 

شکل 6

 

جمع‌بندی
تا اینجا چیز جدیدی در مورد NET. یا #C مطرح نشد و تأکید ما در این مقاله طرز شروع کار با مونو بود. با این‌که در طی این مقاله چند برنامه کاربردی ساده با مونو ایجاد کردیم، اما اهمیت مونو در جایی واضح‌تر می‌شود که به شکل 7 دقت کنید. این تصویر همان برنامه مبتنی بر Windows Forms را در حال اجرا در لینوکس Suse نمایش می‌دهد.

شکل 7


نتیجه این‌که می‌توانید دقیقاً همان  کد ‌#C که در این مقاله با آن آشنا شدید را در لینوکس (یا هر سیستم‌عاملی که توسط مونو پشتیبانی می‌شود) به راحتی کامپایل یا اجرا کنید. در حقیقت، می‌توانید اسمبلی‌هایتان (که فرضاً در Win 32  ایجاد شده‌اند) را به یک سیستم‌عامل جدید کپی نمایید و آن‌ها را مستقیماً و بدون نیاز به کامپایل مجدد یا ایجاد تغییرات در کد، اجرا کنید. تنها کار لا‌زم، استفاده از mono.exe است.

برای آشنایی بیشتر با مونو و افزیش توانایی‌های خود در این زمینه، می‌توانید به راهنمایِ همراه مونو که Mono Doc خوانده می‌شود، مراجعه کنید. این راهنما، حاوی اطلا‌عات مفیدی در مورد کتابخانه‌های پایه‌ای کلا‌س مونو و زبان برنامه‌‌نویسی #C است. این ابزار از طریق Start < All Programs < Mono for Windows< Applications  قابل دسترسی است.

شکل 8 نمایی از Mono Doc را نمایش می‌دهد. البته در طی گشت‌وگذار در طی Mono Doc با مدخل‌های ناکامل زیادی روبه‌رو خواهید شد؛ چراکه راهنماهای کلا‌س‌های پایه‌ای مونو توسط Community مونو تهیه شده و در حقیقت شما نیز می‌توانید در تهیه و توسعه این راهنما سهیم باشید.

 

شکل 8

آنچه برای کندوکاو بیشتر و پیشرفت در مونو نیاز داشتید را به دست آورید. دیگر لا‌زم نیست از ایجاد و توسعه ایده‌های ناب خود در دنیای مرموز و جذاب یونیکس/ لینوکس نگران باشید. شاید این قدمی کوچک، اما مؤثر در توسعه ابزارهای قوی و قابل اعتمادی چون لینوکس/ یونیکس باشد. امید آن‌که در آینده مقالا‌ت عمیق‌تر و فنی‌تری در این زمینه فراهم نماییم و در اختیار شما قرار خواهیم د
 

دلیل ترک لینوکس چیست؟

اشخاص زیادی را دیدم که گنو/لینوکس را ترک کردند و از آن متنفر شدند و دیگر به سمتش بازنگشتند، اما دلیل این کار چیست ؟ چرا این طور می‌شود ؟ پس چرا من از لینوکس زده نمی‌شوم ؟ چرا کسان دیگر این گونه نیستند ؟ چرا ما لینوکس را دوست داریم ؟ چرا از آن طرفداری می‌کنیم ؟ و چرا های دیگر ….

به نظر من، این که خیلی‌ها از لینوکس فراری شدند این است که هدف مشخصی ندارند فقط به خاطر سرگرمی با آن کار کردندوبس و نخواستند به آن به عنوان یک سیستم عامل واقعی نگاه کنند. بعضی‌ها هم دلایلی مختلفی برای این کارشان دارند مثلا مشکل شناسایی کارت صدا یا گرافیک و یا مودم، چیز هایی که به سادگی قابل نصب و راه اندازی هستند-البته با کمی صبر و حوصله- و یا انتخاب نکردن توزیعی مناسب. تا با مشکلی در فلان توزیع بر می‌خورند می‌گویند لینوکس بَده و به گونه‌ای این سیستم عامل را برای خود و اطرافیان تبدیل به یک هیولا می‌کنند طوری که اگر کسه دیگری قصد مهاجرت به لینوکس را داشته باشد نیز منصرف خواهد شد!!!

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

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

گروهی دیگر می‌گویند که نرم‌افزارهای تحت این سیستم عامل بسیار اندک‌اند و به ویندوز نمی‌رسند، این درست! ولی تا ۹۰٪ معادل برای نرم‌افزار های ویندوزی در لینوکس و نرم‌افزار های آزاد یافت می‌شود که به اندازه و یا حتی بیشتر از معادل غیر آزاد خود (ویندوزی) کارایی دارند و اکثرا رایگان هستند و بدون پرداخت هزینه‌ای قابل استفاده‌اند،‌ این نیز بهانه است چون فکر می‌کنند یافتن برنامه‌ها کار مشکلی است یا اگر باشند کارایی ندارند ولی من به عنوان یک گنو/لینوکسی می‌گم نرم‌افزارهای ویندوز کم و دستیابی با آن‌ها مشکله (این را وقتی وارد گنو/لینوکس شدید متوجه خواهید شد).

وقتی به عده‌ای می‌گویی که لینوکس از نظر امنیت از ویندوز جلو تره و ویروسی به آن صورت برایش نوشته نشده می‌گویند: نه‌خیر این دلیلش نیست که لینوکس از نظر امنیت قوی‌تره بلکه کاربران کمی دارد به همین دلیل ویروس یا بدافزاری برای آن وجود نداره. این افراد چون نمی‌دانند که هسته (Kernel) لینوکس طوری نوشته و پایه ریزی شده که هر بدافزار و ویروسی نتواند به سادگی وارد process های سیستم شود و یا به فایل‌های سیستمی و غیره آسیب برسانند و System را از کار بیندازند این دید را دارند.

بخشی دیگر از کاربران این ذهنیت را از نرم‌افزارهای اپن‌سورس (Open Source) دارند که از امنیت و کیفیت پایینی برخوردارند. این طرز فکر بسیار بسیار غلط هست، شما خودتان قضاوت کنید ویندوز که کاملا حفاظت شده، کدبسته (Closed-Source) و غیر رایگان می‌باشد امنیت بسیار بالایی داره ؟ البته با کمی جستجو می‌شود به این نکته پی‌برد که بالاترین ضریب امنیتی را نرم‌افزارهای کد باز دارا می‌باشند آن هم دلیلش این هست که کد منبع آن در اختیار همگان است این همه آدم (هکر، دکتر، مهندس، نخبه و ….) در سراسر جهان به آن دسترسی دارند که در پیشرفت و توسعه‌ی آن دارای نقش موثری هستند و این باعث شده به محض این که حفره یا باگی (BUG) در نرم‌افزار دیده شد این مشکل در بازه‌ی زمانی بسیار کوتاه Patch شود چیزی که در نرم‌افزارهای کد بسته باگ‌های موجود ممکنه تا چند ماه هم وصله نشوند، نمونش اینترنت اکسپلورر هرچند پیشرفت‌های خوبی داشته ولی خیلی دیر به دیر به روز و Patch می‌شود. حالا تعداد میلیونی Developer های گنو/لینوکس را با برنامه نویسان Microsoft مقایسه کنید.

هدف از نوشتن این مطلب این بود که بگم اگر شما از لینوکس متنفری و نتوانستی ازش خوب استفاده کنی لطفا دیگران را از استفاده‌ی از آن نترسان و به عبارتی برایش اسم نگذار، تاکید من به تحقیق و جستجو در بالا به خاطر این است که نباید هیچ کاری را بدون تحقیق انجام داد برای هر کاری، نه فقط برای مهاجرت به لینوکس، ممکنه کسی بخواهد از از مکینتاش بره به ویندوز (البته تقریبا غیر ممکنه) باید تحقیق کنه یک سری مسائلی رو مد نظر داشته باشه که مثلا اگه رفتم ویندوز فلان محدودیت را دارم و فلان امکانات را هم دارم… اینه که تحقیق و جستجو فراموش نشود!

  • اگر قصد مهاجرت به لینوکس را داری به نکات زیر توجه داشته باش:

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

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

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

″ آزادی را دوست دارم برای این لینوکس را انتخاب کردم

love_tux.jpg

سیستم فایل یونیکس و لینوکس

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

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

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

سیستم فایل
«سیستم فایل» یا «سیستم مدیریت فایل» در حقیقت مجموعه‌ای از نرم‌افزارهای سیستم است که اطلاعات مربوط به استفاده از پرونده‌ها را به کاربران و سیستم ارائه می‌کند. در حقیقت سیستم فایل رابطی است میان «سیستم عامل» و «سخت افزار» و وظیفه‌ی مشخص کردن مکان هر فایل و سازماندهی فایل‌ها را برروی سخت ‌افزار (یا همان حافظه ثانویه مانند دیسک سخت یا CD) را دارد. وجود یک سیستم فایل کاربر یا برنامه نویس را از ایجاد یک نرم‌افزار خاص برای هر کاری آسوده می‌کند. در حقیقت سیستم فایل با ایجاد یک ساختار منطقی مانند راهنمایی برای کاربران و سیستم عامل است که به آن‌ها محل قرار گیری فایل‌ها را نمایش می‌دهد و در زمان لازم فایل‌ها را یافته و باز می‌کند، می‌خواند و اگر لازم باشد در آن‌ها می‌نویسد و یا پاک می‌کند و با فایل‌های جدید جایگزین می‌کند.
در لینوکس مفاهیم خاصی برای کار با سیستم فایل وجود دارد. دید لینوکس به ساختار پرونده‌ها و دایرکتوری‌ها مانند یونیکس است. در ساختار یونیکسی هر فایل دارای یک inod یا Index node است.(ترجمه‌ی فارسی index node شاخص گره است.) هر دایرکتوری نیز یک فایل ساده است که شامل لیستی از فایل‌هاست که هنگام مراجعه به دایرکتوری از آن لیست برای دسترسی به فایل‌ها استفاده می‌کند.

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

اطلاعات ذخیره شده در یک i-node
حالت پرونده
• یک پرچم ۱۶ بیتی که مجوزهای فایل را ذخیره می‌کند.
• نوع پرونده برای نمونه عادی، دایرکتوری، بلاک
• پرچم‌های اجرا
• مجوز خواندن مالک
• مجوز نوشتن مالک
• مجوز اجرای مالک
• مجوز خواندن گروه
• مجوز نوشتن گروه
• مجوز اجرای گروه
• مجوز خواندن دیگران
• مجوز نوشتن دیگران
• مجوز اجرای دیگران
شمارش پرنده
• تعداد مراجعات فهرست راهنما به این گره شاخص (تعداد لینک‌های سخت)
شناسه مالک یا UserID
• مالک خاص پرنده
شناسه گروه یا GroupID
• گروهی که مالک این پروندهاست
اندازه پرونده
• تعداد بایت های این پرنده
آدرس‌های پرونده
• ۳۹ بایت اطلاعت مربوط به آدرس محل قرار گیری فایل
آخرین دستیابی
• زمان آخرین دستیابی به پرونده
آخرین تغییر
• زمان آخرین تغییر در پرونده
تغییر گره شاخص
• زمان آخرین تغییر گره شاخه یا i-nod

1.2 Directoryها
دایرکتوری‌ها نیز به صورت ساختاری درختی سازماندهی شده‌اند و هر دایرکتوری می‌تواند محتوی تعدادی فایل یا زیردایرکتوری (sub directory) باشد. دایرکتوری‌ها نوع خاصی از فایل‌ها هستند که در حقیقت شامل لیستی از ورودی‌ها هستند. شاید اگر بدانید که ترجمه‌ی درست فارسی دایرکتوری «فهرست راهنما» است مطلب برایتان واضح‌تر شود. هر ورودی شامل شماره inode و نام یک فایل است. زمانی که یک کاربر مسیری را وارد می‌کند، کرنل میان لیست موجود در دایرکتوری به دنبال شماره inode مناسب می‌گردد و وقتی اسم به صورت صحیح به شماره inode تبدیل شد این شماره به حافظه منتقل می‌گردد تا برای استفاده در دسترس باشد.

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

1.4 فایل‌های Device Special
در سیستم‌های شبه یونیکسی هر ابزاری (a device) از طریق یک فایل قابل دسترسی است، نوع خاصی از فایل‌ها که برروی سیستم فایل حجمی را اشغال نمی‌کند و تنها یک نقطه‌ی دسترسی به یک ابزار است. (مانند dev/cdrom/) دو نوع از این فایل‌ها موجود است یک نوع character نوع دیگر block نام دارند.
بسیار خوب تابه اینجا با مفاهیم اولیه‌ی سیستم فایل‌ها در لینوکس آشنا شدید، در قسمت بعد به بررسی VFS در لینوکس خواهیم پرداخت که وظیفه‌ی کنترل اوضاع در کرنل را بر عهده دارد.

نکته
در خط فرمان دستور ls -l را وارد کنید. آیا نتیجه‌ی نمایش داده شده شما را به یاد جدول «شماره ۱» می‌اندازد؟!! حالا دستور ls را با گزینه‌های"i" استفاده کنید یعنی : « ls -i» عددی که در ابتدای خط نمایش داده می‌شود شماره‌ی i-node است. اگر دیدن مشخصات کامل فقط یک فایل یا دایرکتوری را می‌خواهید از دستور "stat" به همراه نام فایل یا دایرکتوری استفاده کنید. برای نمونه اگر بخواهیم اطلاعاتی از فایل article.txt بدست آوریم کافیست در خط فرمان تایپ کنید : stat article.txt و سپس اینتر

2.سیستم فایل مجازی یا VFS
هسته‌ی لینوکس از یک لایه به نام «سیستم فایل مجازی» یا "Virtual File System" برای انجام عملیات برروی فایل‌ها استفاده می‌کند. این لایه در کرنل (هسته) درخواست‌های کاربر و برنامه‌ها را دریافت و دستورات لازم برای اعمال در لایه‌ی سخت افزار را صادر می‌کند. در یونیکس ازاین روش برای استفاده از سیستم فایل‌های مختلف در یک سیستم استفاده می‌شود.

2.1 ساختار VFS
سیستم فایل مجازی یا VFS یک تعداد توابع مورد نیاز برای اعمال در فایل سیستم را فراهم می‌کند، این واسط سه شیء بسیار ضروری برای عملیات را فراهم می‌کند که شامل inodeها، بازکردن فایل‌ها و فایل سیستم است. VFS درباره‌ی انواع فایل سیستم‌هایی که در هسته موردپشتیبانی هستند اطلاعات کافی دارد و دارای جدولی شامل توابع و اشاره‌گرهای مربوط به فایل سیستم موجود هستند و هنگامی که کاربر درخواست انجام کاری برروی فایلی را نمود VFS از جدول فوق توابع مربوط به سیستم فایل را جستجو و پس از یافتن تابع مورد نظر تابع را اعمال می‌کند. با ساختار و روش کلی کار فایل‌ سیستم‌ها در لینوکس آشنا شدید،‌ در ادامه به بررسی انواع فایل سیستم‌ها و مختصر تاریخی از فایل سیستم‌های لینوکس خواهیم پرداخت.
تاریخچه‌ی فایل سیستم در لینوکس

در ابتدا لینوکس از فایل سیستم Minix برای کارهای خود استفاده می‌کرده، درحقیقت لینوس تروالدز با توجه به محبوبیت Minix در آن زمان ترجیح داده بجای نوشتن یک فایل سیستم جدید از همان فایل سیستم موجود در سیستم‌های آن زمان یعنی Minix استفاده کند. نسخه‌های اولیه‌ی Linux نیز همراه با فایل سیستم Minix عرضه شد. اما سیستم فایل Minix بسیار محدود بود، محدویت در ایجاد فایل‌ها حداکثر تا ۶۴ مگا بایت یا محدودیت درایجاد پارتیشن‌ها حداکثر تا ۶۴ مگابایت (بله ۶۴ مگابایت در سال ۱۹۹۰ ) و حداکثر طول نام‌های ۱۶ کاراکتری توسعه دهندگان لینوکس را واداشت تا به فکر نوشتن یک سیستم فایل جدید باشند. نهایتا برای هسته‌ی لینوکس VFS نوشته شد. در ابتدا VFS توسط "Chris Provenzano" نوشته شدو سپس توسط لینوس تروالدز بهینه سازی شد و در هسته‌ی لینوکس قرار گرفت.

بعداز افزوردن VFS به هسته یک فایل سیستم جدید به نام "Extended File System'' در آپریل ۱۹۹۲ به لینوکس نسخه‌ی 0.96c افزوده شد. این فایل سیستم جدید دو محدودیت ذکر شده‌ی فایل سیستم Minix را نداشت و برای فایل‌ها از حداکثر سایز ۲ گیگابایت (2GB) و اسامی بلند با طول ۲۵۶ کاراکتر پشتیبانی می‌کرد. این سیستم فایل بسیار بهتر از Minix بود اما هنوز تمام خواسته‌ها را پاسخ نمی‌داد برای نمونه امکان تغییر مقدار inodها یا تغییر مهر زمان (timestamp) وجود نداشت و فایل سیستم از لینک‌ها برای نگهداری لیستی از بلاک‌های آزاد استفاده می‌کرد که بازدهی پایین آن باعث ضعف سیستم و نیز نیاز به Defragment را موجب می‌شد.

برای مقابله بااین مشکلات دو سیستم فایل جدید به میان آمدند یکی "Xia File System" ودیگری "Second Extended File System'' که هر دو در ژانویه‌ی ۱۹۹۳ منتشر شدند. xiafs به شدت براساس Minixfs بود و تعداد کمی قابلیت به این سیستم فایل افزوده بود. به طور واضح تر این سیستم فایل اسامی طولانی و پارتیشن‌های حجیم‌تر را به Minix افزوده بود. از طرفی Ext2fs بر اساس کدهای Extfs بود و تعداد زیادی به روز رسانی و بهبود در آن دیده می‌شد، در نسخه‌های ابتدایی Xiafs بسیار پایدارتر از EXt2fs بود اما Ex2fs بیشتر استفاده می‌شد و Bugهای آن سریع‌تر رفع می‌شدند و بهتر پیشرفت می‌کرد به خصوص در استفاده‌ی از CPU و سرعت پاسخ‌دهی بسیار کاراتر بود.

در حال حاضر Ext2 یکی از سیستم فایل‌های بسیار پایدار و پیش تنظیم شده در هسته‌ی لینوکس است. فایل سیستم Xia از نسخه‌ی2.1.21 از کرنل لینوکس حذف شد. در جدول زیر می‌توانید مقایسه‌ای میان فایل سیستم‌های اولیه‌ی لینوکس را ببینید:

Xia FS Ext2 FS Ext FS Minix FS
64MB 4TB 2GB 64MB حداکثر سایز پارتیشن
64MB 2GB 2GB 64MB حداکثر سایز فایل
248 255 255 16/3 حداکثر طول نام فایل‌ها
خیر بله خیر خیر سایز بلاک‌های متغیر
؟ بله خیر بله ادامه‌ی توسعه
خیر بله خیر خیر قابلیت توسعه

قابلیت‌های Ext2
یک فایل سیستم ext2fs از استانداردهای معمول یونیکس مانند فایل‌ها و دایرکتوری‌ها و ابزارها و لینک‌ها پشتیبانی می‌کند. می‌توانید توسط این فایل سیستم پارتیشن‌های حقیقتا بزرگی ایجاد نمایید که با تلاش‌های اخیر مقدار این پارتیشن می‌توند تا ۴ ترابایت (4TB) باشد. بنابراین می‌توانید از دیسک‌های حجیم با پارتیشن بندی دلخواهتان استفاده کنید. پشتیبانی از اسامی طولانی تا ۲۵۵ کاراکتر که در صورت نیاز قابل افزایش تا ۱۰۲۴ کاراکتر است. نیز قابلیت‌های دیگری در Ext2fs موجود است که در فایل سیستم‌های معمولی یونیکس وجود ندارند. علاوه بر این‌ها می‌توانید از به هنگام سازی‌های شبیه BSD یا "BSD-like synchronous update"ها نیز استفاده کنید.

‏ Ext2fs این امکان را به شما می‌دهد تا سایز بلاک‌های منطقی را انتخاب کنید، این مقدار معمولا برابر ۱۰۲۴ یا ۲۰۴۸ و ۴۰۹۶ بایت است. استفاده از بلاک‌های منطقی بزرگتر می‌تواند سرعت ورودی یا خروجی را افزایش دهد و نیاز کمتری به کار هدهای دیسک سخت را به ارمغان می‌آورد.علاوه بر این Ext2fs از "fast symbolic links" یا «لینک‌های نرم سریع» پشتیبانی می‌کند، در این روش لینک‌ها از بلاک‌های فایل سیستم استفاده نمی‌کنند و مقصد لینک در خود inod ذخیره می‌شود. این امر علاوه بر افزایش سرعت کار فضای کمتری را در دیسک سخت استفاده می‌کند. البته این‌ها تمام مزایای این فایل سیستم نیستند و تنها نمونه‌هایی از مزایای این فایل سیستم هستند.

نحوه کار EXT2
نحوه‌ی کار Ext2fs در ساختار سخت‌ افزاری تاثیر فراوانی از ساختار فایل سیستم BSD گرفته است. یک فایل سیستم شامل گروهی از بلاک‌هاست. (مقایسه کنید با سیستم خوشه‌ای یا "cluster" در VFAT مایکروسافت) ساختار فیزیکی یک فایل سیستم رامی‌توانید در جدول زیر مشاهده کنید:

Block
Group N ...
... Block
Group 2 Block
Group 1 Boot
Sector

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

Data
Blocks Inode
Table Inode
Bitmap Block
Bitmap FS
descriptors Super
Block

filename name length entry length inode number
در Ext2fs دایرکتوری‌ها به عنوان یک لیست از ورودی‌های با طول متغیر مدیریت می شود. هر ورودی شامل شماره inode و نیز طول ورودی نیز نام فایل و طول آن است. با استفاده از ورودی‌های با طول متغیر امکان به کار گیری فایل‌هایی با نام‌های طولانی بدون از دست دادن فضای دیسک سخت ممکن است. این ساختار را در جدول زیر مشاهده می‌کنید:

برای نمونه برای فایل‌های file1, long_file_name, و f2 داریم :
file1 05 16 i1

long_file_name 14 40 i2
f2 02 12 i3
در فایل سیستم جدید Ext3fs نیز از همین ساختار برای ذخیره و بازخوانی فایل‌ها و دایرکتوری‌ها استفاده می‌شود. برای استفاده‌ی برنامه‌ها از این فایل سیستم و کنترل و تغییر در آن از کتابخانه‌ای به نام libext2fs استفاده شده است. این کتابخانه دارای روتین‌های لازم برای آزمایش و تغییر اطلاعات برروی فایل سیستم Ext2 می‌باشد. ابزارهای مختلفی مانند mke2fs, e2fsck, tune2fs, dumpe2fs و debugfs از همین کتابخانه برای انجام کارهایشان استفاده می‌کنند. با توجه به ساختار بسیار مناسب و عمومی این کتابخانه نرم‌افزارهای جدید مورد نیاز برای تغییر در فایل سیستم به راحتی نوشته می شوند.

5. فایل سیستم Swap
پارتیشن Swap در لینوکس پارتیشنی است که شما یکبار آن را ایجاد می‌کنید و سپس آن را فراموش می‌کنید!! این پارتیشن به عنوان بخشی از حافظه‌ی سیستم یا RAM استفاده می‌شود و اطلاعات پس از خاموش شدن سیستم از روی آن پاک می‌شوند. نحوه‌ی کار و نیز روش تخصیص داده‌ها و مکان یابی داده‌ها برروی swap کمی پیچیده است و خود نیاز به یک مقاله‌ی کامل دارد.

6. سیستم proc
‏proc نیز یک سیستم فایل مجازی با ویژگی‌های منحصر به فرد خود است که به عنوان یک رابط برای کرنل فعالیت می‌کند. این سیستم فایل اغلب در proc/ سوار می‌شود. (Mount on /proc) و اغلب قسمت‌های آن فقط خواندنی هستند. دستورات بسیاری از این رابط برای کار با کرنل و یا دریافت اطلاعات از سیستم استفاده می‌کنند، ماننند دستورات:
cat, find, free, mount, ps, tr, uptime, times, chroot, mmap, readlink, syslog, slabinf, hier, arp, dmesg, hdparm, ifconfig, init, lsmod, lspci, netstat, procinfo, route

7. ژورنالینگ یا Journaling

زمانی که یک کامپیوتر به طور ناقص خاموش می‌شود، برای نمونه وقتی در اثر قطع برق، کامپیوتر خاموش می‌شود و یا به صورت دستی خاموش شود ممکن است اطلاعات دیسک سخت دچار اشکال شوند و صدمه ببینند. در این موقعیت مقداری از اطلاعات برروی دیسک نوشته می‌شوند و باقی اطلاعات نوشته نمی‌شوند و سیستم فایل به حالت half-finished یا نیمه تمام وارد می‌شود. در این زمان سیستم پس از روشن شدن یک روتین را برای چک کردن اشکالات دیسک سخت دنبال می‌کند.(fsck در لینوکس و scandisk در ویندوز) این امر ممکن است در دیسک‌های سخت امروزی زمان زیادی به طول بیانجامد و برای اطمینان از صحت کارکرد فایل سیستم باید در هر بار شروع سیستم این روتین اجرا شود.
فایل سیستم‌های ژورنالینگ یا "Journaling File Systems" این مشکلات را حل کرده‌اند، علاوه بر مدیریت فایل‌ها و نحوه‌ی قرار گیری فایل‌ها در سیستم فایل در این گونه سیستم‌ فایل‌ها قسمتی به نام ژورنال نیز وجود دارد که تمام تغییراتی را که باید در دیسک ثبت شوند را ذخیره می‌کند.(یک سیستم log گیری) سپس یک پروسه‌ در پشت زمینه و به طور نامحسوس تغییرات را دنبال کرده و اطلاعات مورد نیاز را در ژورنال می‌نویسد. این موضوع باعث می شود تا در صورت بروز مشکل امکان رفع نقص سریع‌تر شده و نیز از طرفی نیاز به چک کردن فایل سیستم در هر بار شروع نباشد.
در حال حاضر چهار سیستم فایل بسیار مشهور که به صورت ژورنالینگ فعال هستند شامل Ext3fs که پیش فرض هسته‌ی لینوکس است و با هسته توسعه پیدا می‌کند، JFS که متعلق به IBM است ، XFS که متعلق به SGI است و ابتدا برای یونکس IRIX طراحی شده بود و نیز ReiserFS است.

7.1 فایل سیستم ReiserFS
این سیستم فایل توسط "Hans Reiser" نوشته شد و در برخی توزیع‌های لینوکس مانند SuSE 7.0 به بعد و یا RedHat 7.1 مورد پشتیبانی قرار گرفت. در ReiserFS از مدل" Balanced Tree" استفاده می‌شود که فایل‌ها و نام فایل‌ها در یک Balanced Tree نگهداری می‌شود. ReiserFS یک سیستم فایل حقیقتا ژورنالینگ نبود اما از نسخه‌ی ۴ که به ReiserFS4 مشهور است این قابلیت بهبود بسیاری یافت و اکنون در وضعیت مناسبی است. البته شهرت این فایل سیستم در سرعت آن است که در هسته‌ی سری 2.6 لینوکس اوضاع کمی تغییر کرده و ReiserFS در برخی زمینه‌ها سرعتی کمتر از سایرین دارد.

7.2 فایل سیستم XFS
زمانی که SGI در سال‌های ۱۹۹۰ نیاز به یک فایل سیستم قدرتمند با بازدهی بالا داشت شروع به توسعه‌ی سیستم فایلی به نام XFS کرد. این سیستم فایل با هدف بالا بردن حجم دیسک سخت و نیز پهنای باند داده‌ها و تبادل موازی برای استفاده در نرم‌افزارهای فیلم و صدا و پایگاه داده‌های بزرگ توسعه یافت. از مزایای این فایل سیستم بازیابی سریع اطلاعات در صورت صدمه دیدن دیسک سخت و پشتیبانی از فایل‌های حجیم و نیز دایرکتوری‌های حاوی فایل‌های بسیار و بازدهی بسیار خوبش در چنین محیط‌هایی است. در حال حاضر XFS با تغییراتی در اختیار جامعه‌ی اوپن سورس قرار گرفته و برای لینوکس نیز بازنویسی شده و برای نسخه‌ی 2.4 و 2.6 هسته‌ی لینوکس موجود است. البته نسخه‌ی لینوکسی هنوز تماما کامل نیست و برخی قابلیت‌هامانند loop-mounting هنوز با مشکلاتی همراه است.
از مشکلاتی که در حال حاضر XFS با آن‌ها مواجه است ممکن نبودن resize یا تغییر سایز به صورت on-line است و برای تغییر سایز باید از اطلاعات پشتیبان بگیریدو پس از تغییر سایز اطلاعات را بازیابی کنید و یا برای استفاده از Qouata باید هسته‌ی لینوکس را مجددا کامپایل کنید. اگر از بوت لودر LILO با گزینه‌ی بوت از بوت سکتور استفاده می‌کنید XFS همراه LILO کار نخواهد کرد. البته با GRUB نسخه‌های بالاتر از 0.99 می‌تونید از XFS استفاده کنید اما مشکلات و رفتار غیر معمول نیز در این حالت گزارش شده است.

اما قابلیت‌های جدید نیز در این فایل سیستم وجود دارد برای نمونه این فایل سیستم یک فایل سیستم ۶۴ بیتی است، بنابراین می‌توانید فایل‌هایی با حجم میلیون‌ها ترابایت داشته باشید که این مقدار بسیار بزگتر از فایل سیستم‌هایی است که امروزه استفاده می شوند. از طرفی این فایل سیستم سرعت بسیار مطلوبی دارد. چیزی حدود هفت گیگابایت در ثانه(7GB/sec) که این سرعت را مدیون مدل B+Tree است که مدل لیست کردن و دسترسی به فایل‌هاست. در سیستم فایل‌های FFS مانند BSD یا Ext2fs از مدل لیست کردن برای دسترسی به فایل‌ها استفده می‌شود اما در این فایل سیستم از مدل بسیار پیچیده‌ی B+Tree استفاده می‌شود.اما چطور میلیون‌ها ترابایت؟! از دید ریاضی بسیار ساده است :
2^63 = 9 x 10^18 = 9 exabytes

7.3 فایل سیستم JFS
این فایل سیستم که نامش "Journaling File System" است توسط IBM و برای استفاده در سرورهای Enterprise توسعه یافته است. این فایل سیستم برای سرورهایی که ترافیک بالایی دارند و نیاز به فایل سیستم برای مدیریت چنین ترافیکی دارند ساخته شده است. در حال حاظر از این سیستم فایل در لینوکس (هسته‌ی ۲.۶) پشتیبانی می‌شود اما نسخه‌ی لینوکسی آن هنوز کاملا برای لینوکس بهینه سازی نشده است.(هنوز کاملا port نشده)

فایل سیستم JFS از تکنیک "database journaling " برای کارهای خوداستفاده می‌کند که باعث افزایش سرعت و پاسخ‌گویی می‌شود. JFS نیز یک فایل سیستم ۶۴ بیتی است و پارتیشن‌هایی با حداقل سایز ۱۶ مگابایت (16MB) استفاده می‌کند. حداکثر سایز کاملا به سایز بلاک‌های سیستم بستگی دارد که در حالتی که بلاک‌ها ۵۱۲ بیتی باشند مقدار بزرگترین فایل برابر ۵۱۲ ترابایت (512TB) و در حالتی که سایز بلاک‌ها ۴ کیلوبایت باشد حداکثر سایز فایل سیستم ۴ پتابایت (4Peta bytes) خواهد بود.

فایل سیستم EXT3
فایل سیستم EXT3 برای کسانی که نمی‌خواهند فایل سیستم لینوکس خود را تغییر بدهند یک راهکار مناسب است. ext3fs در حقیقت همان ext2fs با همان ساخت و کار است با این تفاوت که قابلیت ژورنالینگ به آن افزوده شده است. این فایل سیستم همراه کرنل لینوکس ارائه می‌شود و در لینوکس پشتیبانی کاملی از این فایل سیستم می‌شود چرا که فایل سیستم محلی و مختص لینوکس است. یکی از قابلیت‌های این فایل سیستم پشتیبانی شدن در تقریبا تمام نسخه‌های کرنل است، حتی نسخه‌های قدیمی نیز این فایل سیستم را به عنوان ext2fs شناخته و از آن استفاده می‌کنند.(در واقع با افزودن امکان ژورنالینگ به ext2fs شما به ext3fs دست یافته‌اید!)

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

8. فایل سیستم‌های شبکه
فایل سیستم‌هایی نیز برای استفاده در شبکه‌ها وجود دارند که مشهور ترین و محبوب‌ترین آن‌ها NFS است، البته فایل سیستم‌هایی مانند AFS یا CODA و NCP و SMB نیز وجود دارند.

‏ NFS حدود سال‌ ۱۹۸۹ توسط Sun Microsystem ایجاد شد و در نسخه‌های مختلفی منتشر شد که ابتدا 2 و سپس نسخه‌ی 3 توسعه پیدا کردند و در حال حاضر نسخه‌ی 4 این سیستم فایل در حال استفاده است. البته روش‌های بهتری برای اشتراک فایل در شبکه وجود دارد که AFS یا "Andrew File System" یکی از آن‌هست اما استفاده و پیاده سازی این فایل سیستم‌ها به مراتب دشوار تر از NFS می‌باشد.

فایل سیستم SMB یا "Session Message Block" از طریق پروتوکل SMB و برنامه‌ی Samba در لینوکس قابل دسترسی است. SMB در حقیقت بری ویندوزهای 3xو 9x و NT منتشر شد و برای شبکه‌هایی که شامل ویندوز و لینوکس در کنار هم می شوند مناسب است. فایل سیستم "ncpfs" نیز برای پشتیبانی از پروتوکل "NCP" که در "NovellNetware" استفاده می‌شود قابل دسترسی است.
فایل سیستم دیگر Code نام دارد که یک فایل سیستم توزیع شده بر اساس AFS2 است که قابلیت‌های جدیدی مانند امکان disconnect" را برای کامپیوترهای سیار فراهم کرده و از نظر امنیتی و بازدهی نیز بسیار توسعه یافته است.

9. فایل سیستم‌های رمز نگاری شده
فایل سیستم‌های رمزنگاری شده‌ یا "Encrypted Fileystems" کاربران را برای قرار دادن اطلاعات در محیطی امن کمک می‌کنند. اگر یک مهاجم (Attacker) به سیستم شما دسترسی پیدا کند اطلاعات موجود در فایل سیستم رمزنگاری شده برای او نامفهوم خواهد بود و نمی‌تواند اطلاعات موجود برروی آن را استفاده کند. در بسیاری موارد سیستم فایل‌های رمزنگاری شده نیاز به mount و unmount کردن دستی دارند در صورتی که پس از اتمام کار فایل سیستم را unmount یا پیادهنکنید، مهاجم از طریق شبکه می‌تواند به آن دسترسی پیدا کند! در این مقاله تنها به نام بردن چند سیستم فایل رمز‌نگاری شده بسنده می‌کنم:

CFS:
این فایل سیستم از سرور NFS برای رمزنگاری تمام ساختار درختی فایل‌ها استفاده می‌کند. (http://cache.qualcomm.com/)
TCFS :
این سیستم فایل نیز بر اساس CFS است و بهبودهایی را فراهم نموده و از طریق patch شدن در کرنل قابل استفاده است. (http://www.tcfs.it/)
BestCrypt:
این فایل سیستم به کاربران اجازه‌ی ایجاد یک ساختار درختی کامل در فایل سیستمی مجازی را می‌دهد که در یک فایل ذخیره شده است و ابزار مخصوصی برای ایجاد، فرمت کردن و ماونت کردن دارد. (http://www.jetico.com/)
PPDD:
یک درایور برای لینوکس است که به کاربران اجازه‌ی ایجاد فایل‌هایی مشابه ابزارها رامی‌دهد. فایل‌ها پسپ قابل فرمت و استفاده مانند یک دیسک سخت هستند. ( http://linux01.gwdg.de/~alatham/)

StegFS:
این سیستم اطلاعات را رمزنگاری و سپس در مخفی می‌کند، بدین ترتیب مهاجم ابتدا نیاز به حدس زدن مکان فایل‌هاست و سپس نیاز به بازکردن رمز دارد.( http://www.mcdonald.org.uk/StegFS/)
البته فایل سیستم‌های دیگری نیز با هدف رمزنگاری اطلاعات وجود دارند که از حوصله ی مقاله ی حاظر خارج‌اند.


10. سایر فایل سیستم‌ها

10.1 vfat
در لینوکس از فایل سیستم‌های دیگری نیز پشتیبانی می‌شود برای نمونه از vfat که سیستم فایل ویندوز و داس و os/2 است به خوبی پشتیبانی می‌گردد. هر دو نوع FAT16 وFAT32 در لینوکس نیز پشتیبانی می‌شود اما این سیستم فایل‌ها هیچ کدام از قابلیت‌های فایل سیتسم‌های لینوکس را ندارند. حتی FAT32 قابل مقایسه با ext2fs که درسال ۱۹۹۳ منتشر شد نیست. پارتیشن‌های FAT16 محدود به دو گیگابایت (2GB) است، به صورت تئوری FAT32 پارتیشن‌هایی با سایز تا 8ترابایت (۱ ترابایت 1024 گیگابایت است) را پشتیبانی می‌کنند. اما در عمل Scan Disk ویندوز ۹۸ تنها یا 128GB از هارددیسک را پشتیبانی می‌کند و ویندوز ۲۰۰۰ اجازه‌ی ایجاد پارتیشن‌های FAT32 با حجم بیش‌از 32GB را نمی‌دهد.

10.2 فایل سیستم NTFS
فایل سیستم NTFS یا New Technology File System که از طرف مایکروسافت همراه با ویندوز NT نسخه‌ی 4.0 با هدف از میان بردن محدودیت‌های FAT16 منتشر شد ، در این سیستم فایل حداکثر پارتیشن‌ها دو ترابایت (2 TB) است. سیستم فایل NTFS در هسته‌ی لینوکس به صورت فقط خواندنی مورد پشتیبانی قرار دارد و برای نوشتن برروی آن بایداین قابلیت رادر هسته‌ی لینوکستان فعال کنید، اما امکان وارد شدن صدمه به فایل سیستمتان وجود دارد.

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

فایل سیستم‌های ژورنالینگ:
a. BeFS
b. HTFS
c. NSS
d. VxFS

سایر فایل سیستم‌ها (که ممکن است رابطه‌ای با لینوکس نداشته باشند و فقط جهت اطلاعات بیشتر نامبرده می‌شوند) :
DTFS
EFS (Enhanced filesystem)
ffS (BSD filesystem)
GPFS (generall Parallel Filesystem)
HFS (HP-UX Hi performance filesystem)
LFS (linux log structured file system)
QNX filesystem
ODS (Open VMS file system)
NSS ( Novell storage services)
NWFS ( NetWare filesystem / 286 و NetWare filesystem / 386)
MFS ( Last Macintosh Fie System)
RomFS
و بسیاری فایل سیستم‌های دیگر .

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

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

البته گاهی نیز اجبارهایی در کار است، برای نمونه پارتیشن اصلی یا root را نمی‌توانید vfat انتخاب کنید! یا اگر از LILO به عنوان بوت لودرتان استفاده می‌کنید ممکن ایت نتوانید از XFS برای پارتیشن بوت استفاده کنید و یا ممکن است لازم باشد از ترکیب این فایل سیستم‌ها در کارتان استفاده کنید. برای نمونه از etx2 برای پارتیشن بوت، از دیگری برای / از فایل سیستمی سریع برای /tmp از فایل سیستمی ایمین و قابل بازیابی برای دایرکتوری home/ و ... که کاملا به سیاست‌های شما و نوع کار شما وابسته است.

منابع :

1. http://oss.sgi.com/projects/xfs/faq.html
02.
http://e2fsprogs.sourceforge.net/
03.
http://www-128.ibm.com/developerworks/l ... l-jfs.html
04.
http://www.coda.cs.cmu.edu/about.html
05.
http://linux.org.mt/article/filesystems
06.
http://freshmeat.net/articles/view/212/
07.
http://freshmeat.net/projects/reiserfs/
08.
http://freshmeat.net/projects/xfs/
09.
http://www.ibiblio.org/filesystems/howt ... HOWTO.html
10.
http://www.honeycomb.net/os/holistic/co ... ilesys.htm
11.
http://tcfs.dia.unisa.it/
12.
http://www.atnf.csiro.au/~rgooch/linux/ ... tches.html
13.
ftp://tsx-11.mit.edu/pub/linux/ALPHA/userfs/
14.
http://www.suse.com/en/support/oracle/d ... epaper.pdf
15.
http://linux.msede.com/ext2/ext2end.html