تک دیک

واژه نامه و مجله آموزشی کامپیوتر و فناوری

خط فرمان لینوکس – دایرکتوری های لینوکس، پیوندهای نمادین و سخت

تور راهنما

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

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

  1. به یک دایرکتوری مشخص، cd کنید.
  2. محتویات دایرکتوری را با ls -l فهرست کنید.
  3. اگر یک فایل جالب دیدید، محتویات آن را با file شناسایی کنید.
  4. اگر به نظر می‌رسد ممکن است (محتویات فایل) متن باشد، سعی کنید آن را با less نمایش دهید.
  5. اگر به طور تصادفی تلاش کنیم یک فایل غیر متنی را نمایش دهیم و این کار باعث درهم ریختن پنجره ترمینال شود، می‌توانیم با وارد کردن دستور reset (آن را) بازیابی کنیم.

ترفند کپی و پیست را به خاطر بسپار! اگر از ماوس استفاده می‌کنید، می‌توانید روی نام فایل دابل کلیک کنید تا آن را کپی کنید و برای الصاق (یا پیست کردن) آن داخل دستورات، وسط کلیک کنید.

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

جدول 3-4 تنها تعدادی از دایرکتوری هایی را که می‌توانیم کاوش کنیم فهرست می‌کند. بسته به توزیع لینوکس ما ممکن است تفاوت های اندکی وجود داشته باشد. از نگاه به اطراف و تلاش بیشتر نترسید!

جدول 3-4: دایرکتوری های یافت شده در سیستم های لینوکس

دایرکتوری تذکرات
/ دایرکتوری ریشه. جایی که همه چیز شروع می‌شود.
/bin شامل باینری ها (برنامه هایی) است که برای بوت شدن و اجرای سیستم باید وجود داشته باشند.
/boot شامل هسته (یا کرنل Kernel) لینوکس، ایمیج دیسک RAM اولیه (برای درایورهای مورد نیاز در زمان بوت) و بوت لودر است.

فایل های جالب:

  • /boot/grub/grub.conf یا menu.lst که برای پیکربندی بوت لودر استفاده می‌شوند.
  • /boot/vmlinuz (یا چیزی مشابه)، هسته لینوکس
/dev این یک دایرکتوری ویژه است که حاوی گره های دستگاه است.”همه چیز یک فایل است” برای دستگاه‌ها نیز صدق می‌کند. اینجا مکانی است که هسته لیستی از تمام دستگاه هایی که درک می‌کند را نگهداری می‌کند.
/etc دایرکتوری /etc حاوی تمام فایل های پیکربندی سراسری سیستم است. همچنین شامل مجموعه‌ای از اسکریپت های شل است که هر یک از سرویس های سیستم را در زمان بوت آغاز می‌کند. همه چیز در این دایرکتوری باید متن قابل خواندن باشد.

فایل های جالب: در حالی که همه چیز در /etc جالب است، در اینجا برخی از موارد محبوب همیشگی وجود دارد:

  • /etc/crontab، فایلی که تعیین می‌کند کارهای خودکار چه زمانی اجرا شوند.
  • /etc/fstab، جدولی از دستگاه های ذخیره سازی و نقاط اتصال منتسب به آن‌ها.
  • /etc/passwd، فهرستی از حساب های کاربری.
/home در پیکربندی های معمولی، به هر کاربر یک دایرکتوری در /home داده می‌شود. کاربران معمولی فقط می‌توانند فایل ها را در دایرکتوری های خانه خود بنویسند. این محدودیت، سیستم را از فعالیت خطاکارانه کاربر محافظت می‌کند.
/lib حاوی فایل های کتابخانه به اشتراک گذاشته شده است که توسط برنامه های اصلی سیستم استفاده می‌شود. این‌ها مشابه کتابخانه های پیوند پویا (Dynamic Link Library – DLL) در ویندوز هستند.
/lost+found هر پارتیشن فرمت شده یا دستگاهی که از یک سیستم فایل لینوکس استفاده می‌کند، مانند ext4، این دایرکتوری را دارد. از این (دایرکتوری) برای بازیابی جزئی از یک رویداد خرابی سیستم فایل استفاده می‌شود. (در شرایطی به) جز اینکه اتفاق واقعا بدی برای سیستم ما افتاده باشد، این دایرکتوری خالی باقی می‌ماند.
/media در سیستم‌های لینوکس مدرن، دایرکتوری /media حاوی نقاط اتصال برای رسانه‌های قابل جداسازی مانند درایوهای یواس‌بی (USB)، سی‌دی-رام (CD-ROM) ها و غیره است که به‌طور خودکار در هنگام قرارگیری متصل می‌شوند.
/mnt در سیستم های قدیمی‌تر لینوکس، دایرکتوری /mnt حاوی نقاط اتصال برای دستگاه های قابل جداسازی است که به صورت دستی متصل شده‌اند.
/opt دایرکتوری /opt برای نصب نرم افزار “اختیاری” استفاده می‌شود. این (دایرکتوری) اساسا برای نگهداری محصولات نرم افزاری تجاری که ممکن است روی سیستم نصب شده باشند استفاده می‌شود.
/proc دایرکتوری /proc ویژه است. این یک سیستم فایل واقعی به معنی فایل های ذخیره شده روی درایو هارد نیست. بلکه یک سیستم فایل مجازی است که توسط هسته لینوکس نگهداری می‌شود. «فایل‌های» موجود در آن، روزنه های چشمی به خودِ هسته هستند. این فایل ها قابل خواندن هستند و تصویری به ما ارائه می‌دهند از اینکه هسته چگونه کامپیوتر را می‌بیند.
/root این (دایرکتوری)، دایرکتوری خانه برای حساب کاربری root است.
/sbin این دایرکتوری حاوی باینری های “سیستم” است. این‌ها برنامه هایی هستند که وظایف حیاتی سیستم را انجام می‌دهند که عموماً برای ابرکاربر رزرو شده‌اند.
/tmp دایرکتوری /tmp برای ذخیره سازی فایل های موقت و گذرایی در نظر گرفته شده که توسط برنامه های مختلف ایجاد شده است. برخی از پیکربندی ها باعث می‌شوند هر بار که سیستم راه اندازی مجدد (یا ریبوت) می‌شود، این دایرکتوری خالی شود.
/usr درخت دایرکتوری /usr احتمالاً بزرگترین (درخت دایرکتوری) در یک سیستم لینوکس است. این شامل تمام برنامه ها و فایل های پشتیبانی مورد استفاده توسط کاربران عادی است.
/usr/bin /usr/bin حاوی برنامه های اجرایی نصب شده توسط توزیع لینوکس است. غیر معمول نیست که این دایرکتوری هزاران برنامه را در خود نگهداری کند.
/usr/lib کتابخانه های به اشتراک گذاشته شده برای برنامه های موجود در /usr/bin.
/usr/local درخت /usr/local محلی است که برنامه‌هایی که در توزیع گنجانده نشده‌اند اما برای استفاده در کل سیستم در نظر گرفته شده‌اند نصب می‌شوند. برنامه های کامپایل شده از سورس کد معمولاً در /usr/local/bin نصب می‌شوند. در یک سیستم لینوکس تازه نصب شده این درخت وجود دارد، اما تا زمانی که مدیر سیستم چیزی داخل آن قرار دهد، خالی خواهد بود.
/usr/sbin حاوی برنامه های مدیریت سیستم بیشتری است.
/usr/share /usr/share حاوی تمام داده های به اشتراک گذاشته شده‌ای است که توسط برنامه های موجود در /usr/bin استفاده می‌شود. این شامل مواردی مانند فایل‌های پیکربندی پیشفرض، آیکن ها، پس‌زمینه‌های صفحه، فایل‌های صوتی و غیره می‌شود.
/usr/share/doc اکثر بسته های نصب شده روی سیستم شامل نوعی مستندات هستند. در /usr/share/doc، فایل‌های مستنداتی را پیدا می‌کنیم که بر اساس بسته سازماندهی شده‌اند.
/var به استثنای /tmp و /home، دایرکتوری هایی که تا به حال به آن‌ها نگاه کرده‌ایم نسبتا ثابت می‌مانند، یعنی محتوای آن‌ها تغییر نمی‌کند. درخت دایرکتوری /var مکانی است که داده هایی در آن ذخیره می‌شود که احتمالاً تغییر می‌کنند. پایگاه داده های مختلف، فایل های قرقره (spool files)، ایمیل کاربر و غیره در اینجا قرار دارند.
/var/log /var/log حاوی فایل‌های گزارش، (یعنی) سوابق فعالیت‌های مختلف سیستم است. این (فایل) ها مهم هستند و باید گاهی اوقات تحت نظر قرار بگیرند. کاربردی‌ترین آن‌ها /var/log/messages و /var/log/syslog هستند. توجه داشته باشید که به دلایل امنیتی در برخی سیستم‌ها، فقط ابرکاربر می‌تواند فایل‌های گزارش را مشاهده کند.

پیوندهای نمادین

همانطور که به اطراف نگاه می‌کنیم، احتمالاً یک فهرست دایرکتوری (به عنوان مثال، /lib) با آیتمی مثل مورد زیر را مشاهده می‌کنیم:

lrwxrwxrwx 1 root root 11 2007-08-11 07:34 libc.so.6 -> libc-2.6.so

توجه کنید که چگونه حرف اول فهرست “l” است و به نظر می‌رسد این آیتم دارای دو نام فایل است؟ این نوع خاصی از فایل است که پیوند یا لینک نمادین (Symbolic link) نامیده می‌شود (با عنوان پیوند نرم یا سیم‌لینک Symlink نیز شناخته می‌شود). در اکثر سیستم‌های شبه یونیکس، این امکان وجود دارد که به یک فایل با چندین نام ارجاع داده شود. اگرچه ارزش این موضوع ممکن است واضح نباشد، اما واقعاً یک ویژگی مفید است.

این سناریو را تصور کنید: یک برنامه نیاز به استفاده از یک منبع مشترک از یک نوع دارد که در فایلی به نام “foo” قرار دارد، اما “foo” دارای تغییرات مکرر نسخه است. خوب است که شماره نسخه را در نام فایل درج کنید تا مدیر یا سایر افراد مرتبط و علاقمند بتوانند ببینند چه نسخه ای از “foo” نصب شده است. این یک مشکل ایجاد می‌کند. اگر نام منبع اشتراک‌گذاری شده را تغییر دهیم، باید هر برنامه‌ای که ممکن است از آن استفاده کند را ردیابی کنیم و هر بار که نسخه جدیدی از منبع نصب می‌شود، آن (برنامه) را برای جستجوی یک نام منبع جدید تغییر دهیم. این موضوع اصلا سرگرم‌کننده به نظر نمی‌رسد.

اینجاست که پیوندهای نمادین باعث صرفه‌جویی در زمان می‌شوند. فرض کنید نسخه 2.6 از “foo” که دارای نام فایل “foo-2.6” است را نصب کرده‌ایم و سپس یک پیوند نمادین با نام ساده “foo” ایجاد می‌کنیم که به “foo-2.6” اشاره می‌کند. این بدان معنی است که وقتی یک برنامه فایل “foo” را باز می‌کند، در واقع فایل “foo-2.6” را باز می‌کند. حالا همه خوشحال هستند. برنامه هایی که به “foo” متکی هستند می‌توانند آن را پیدا کنند و ما همچنان می‌توانیم ببینیم نسخه فعلی نصب شده چه نسخه‌ای است. هنگامی که زمان ارتقاء به “foo 2.7” فرارسید، ما فقط فایل را به سیستم خود اضافه می‌کنیم، پیوند نمادین “foo” را حذف می‌کنیم و یک (پیوند) جدید ایجاد می‌کنیم که به نسخه جدید اشاره می‌کند. این (ویژگی) نه تنها مشکل ارتقاء نسخه را حل می‌کند، بلکه به ما اجازه می‌دهد هر دو نسخه را روی دستگاه خود نگه داریم. تصور کنید که “foo 2.7” یک باگ دارد (لعنت به اون توسعه دهندگان!) و ما باید به نسخه قبلی برگردیم. مجدداً فقط پیوند نمادینی که به نسخه جدید اشاره می‌کند را حذف می‌کنیم و یک پیوند نمادین جدید ایجاد می‌کنیم که به نسخه قدیمی اشاره می‌کند.

فهرست دایرکتوری در ابتدای این بخش (از دایرکتوری /lib یک سیستم فدورا) یک پیوند نمادین به نام libc.so.6 را نشان می‌دهد که به یک فایل کتابخانه به اشتراک گذاشته به نام libc-2.6.so اشاره می‌کند. این بدان معنی است که برنامه‌هایی که به دنبال libc.so.6 هستند در واقع فایل libc-2.6.so را دریافت می‌کنند. ما در فصل بعدی، نحوه ایجاد پیوندهای نمادین را خواهیم آموخت.

پیوندهای سخت

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

جمع بندی

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

مطالعه بیشتر

  • نسخه کامل استاندارد سلسله مراتبی سیستم فایل لینوکس را می‌توانید اینجا پیدا کنید: http://www.pathname.com/fhs/
  • مقاله‌ای در مورد ساختار دایرکتوری سیستم‌های یونیکس و شبه یونیکس: http://en.wikipedia.org/wiki/Unix_directory_structure
  • توصیفی با جزئیات از فرمت متن اسکی (یا ASCII): http://en.wikipedia.org/wiki/ASCII

متن بالا بخشی از ترجمه کتاب The Linux Command Line (به فارسی: خط فرمان لینوکس) نوشته William Shotts است که نسخه اصلی آن از طریق وبسایت رسمی کتاب (https://linuxcommand.org) قابل دسترسی است. (فهرست مطالب کتاب خط فرمان لینوکس).

امیرحسین شهسواری

عاشق دنیای رایانه و فناوری به خصوص برنامه نویسی هستم؛ یادگرفتن و البته یاد دادن چیزای جالبی که یاد گرفتم باعث خوشحالیم میشه و از اولویت‌های اصلی زندگیم به حساب میاد. از مدیریت و نوشتن در تک دیک هم واقعا لذت می‌برم :)

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *