مقدمه

حالا که با نحوه‌ی جابجایی در درخت Filesystem آشنا شدیم، قصد داریم نگاهی داشته باشیم به بخش‌های مختلف سیستم لینوکسی خودمان. منتها لازمه‌ی این سفر هیجان‌انگیز این است که اولاً کمی بیشتر با کامند ls آشنا شویم و ثانیاً دو کامند دیگر با نام‌های file و less را هم دریابیم که اولی نوع فایل‌ها را مشخص می‌کند و دومی محتوای فایل‌ها را نمایش می‌دهد. پس از معرفی و بررسی این دو کامند، نگاهی خواهیم داشت به مهمترین دایرکتوری‌های filesystem لینوکس و با نقش هر یک آشنا می‌شویم.

بررسی دقیق‌تر کامند ls

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

اجرای کامند ls به صورت خشک و خالی (یعنی بدون هیچ آرگومان و آپشن) باعث می‌شود که محتوای دایرکتوری جاری نمایش داده شود.

$ ls
Desktop Documents Music Pictures Public Templates Videos

در مثال بالا، کامند ls را در حالی اجرا کرده‌ایم که در دایرکتوری home خود قرار داشتیم و در نتیجه، نام فایل‌ها و دایرکتوری‌های موجود در این دایرکتوری (که البته همگی از نوع دایرکتوری هستند) نمایش داده شده است. اما اگر بخواهیم محتوای یک دایرکتوری دیگر غیر از دایرکتوری جاری را ببینیم، کافیست مانند مثال زیر آدرس دایرکتوری مورد نظر را به عنوان آرگومان کامند ls وارد کنیم:

$ ls /usr
bin games include lib local sbin share src

به علاوه، می‌توانیم با استفاده از یک آپشن -l کاری کنیم که فرمت خروجی تغییر کند و اطلاعات بیشتری در مورد محتوای دایرکتوری نمایش داده شود:

$ ls -l 
total 56
drwxrwxr-x 2 me me 4096 2024-07-26 17:20 Desktop
drwxrwxr-x 2 me me 4096 2024-07-26 17:20 Documents
drwxrwxr-x 2 me me 4096 2024-07-26 17:20 Music
drwxrwxr-x 2 me me 4096 2024-07-26 17:20 Pictures
drwxrwxr-x 2 me me 4096 2024-07-26 17:20 Public
drwxrwxr-x 2 me me 4096 2024-10-26 17:20 Templates
drwxrwxr-x 2 me me 4096 2024-10-26 17:20 Videos

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

در لینوکس هر چیزی فایل است

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

آرگومان‌ها و آپشن‌ها

اکثر کامندها دارای یک یا جند آرگومان و چند سوئیچ یا آپشن (option) هستند که حالت‌های مختلفی را برای یک کامند ایجاد می‌کنند. مثلاً دیدیم که کامند ls وقتی به همراه آپشن -l به کار گرفته شود، خروجی را در فرمت Long نمایش می‌دهد یا کامند cd وقتی یک مسیر را به عنوان آرگومان دریافت کند، از دایرکتوری جاری به آن مسیر منتقل می‌شود. در واقع، فرم کلی یک کامند لینوکسی به این صورت است:

$ command -options arguments

یک آپشن می‌تواند دارای یکی از فرم‌های زیر باشد:

  • فرمت کوتاه یا short format که در آن آپشن به صورت یک حرف بعد از کاراکتر خط تیره (dash) می‌آید. مثل ls -l
  • فرمت طولانی یا long format که در آن آپشن به صورت یک کلمه بعد از دو کاراکتر خط تیره می‌آید. مثل ls --reverse

فرمت long ریشه در پروژه‌ی GNU دارد و اکثر کامندهایی که از این فرمت پشتیبانی می‌کنند، متعلق به پروژه‌ی GNU هستند. در این فرمت، اگر نام یک آپشن بیش از یک کلمه باشد به صورت --word1-word2 خواهد بود. به‌علاوه، در مورد فرمت short، اکثر کامندها اجازه می‌دهند که چند آپشن پشت سر هم بیایند. مثلاً‌ به‌جای ls -l -a می‌توان از ls -la استفاده کرد.

توجه داشته باشید که نام آپشن‌ها مانند نام فایل‌ها در لینوکس نسبت به بزرگی و کوچکی حروف حساس یا اصطلاحاً case sensitive است.

خوب، برگردیم سراغ کامند ls و تعدادی از مهمترین و پرکاربردترین آپشن‌های این کامند را ببینیم. جدول زیر این آپشن‌ها را در دو فرم short و long لیست کرده و توضیح مختصری راجع به هر یک آورده است.

آپشن short آپشن long توضیح
-a --all همه‌ی فایل‌ها را لیست می‌کند، از جمله فایل‌های مخفی که نامشان با یک کاراکتر نقطه (period) شروع می‌شود و در حالت عادی لیست نمی‌شوند.
-A --almost-all مانند آپشن -a عمل می‌کند با این تفاوت که دایرکتوری‌های . و .. را لیست نمی‌کند.
-d --directory استفاده از این آپشن به همراه -l باعث می‌شود که به‌جای لیست کردن محتویات یک دایرکتوری، جزئیاتی در مورد خود دایرکتوری ارائه شود.
-F --classify این آپشن یک کاراکتر به انتهای فایل‌های لیست‌شده اضافه می‌کند که نوع آن فایل را نشان می‌دهد. برای مثال، به دایرکتوری‌ها یک کاراکتر / اضافه می‌کند یا به فایل‌های اجرایی یک کاراکتر * اضافه می‌کند.
-h --human-readable استفاده از این آپشن باعث می‌شود که در فرمت Long سایز آیتم‌ها به‌جای بایت بر حسب فرمت‌های مناسب‌تری نمایش داده شود.
-l نتایج را در فرمت Long نمایش می‌دهد.
-r --reverse ترتیب نمایش آیتم‌ها را که در حالت پیش‌فرض صعودی است، معکوس می‌کند.
-S ترتیب نمایش آیتم‌ها را از روی سایز آنها تعیین می‌کند.
-t ترتیب نمایش آیتم‌ها را از روی زمان ویرایش آنها تعیین می‌کند.

نگاهی دقیق‌تر به فرمت Long

گفتیم و دیدیم که آپشن -l باعث می‌شود که خروجی دستور ls در فرمت Long نمایش داده شود که با ارائه‌ی جزئیات و اطلاعات زیادی در مورد آیتم‌های لیست‌شده همراه است. یک بار دیگر به خروجی کامند ls -l در دایرکتوری home یک یوزر با نام me نگاه کنید:

$ ls -l 
total 56
drwxrwxr-x 2 me me 4096 2024-07-26 17:20 Desktop
drwxrwxr-x 2 me me 4096 2024-07-26 17:20 Documents
drwxrwxr-x 2 me me 4096 2024-07-26 17:20 Music
drwxrwxr-x 2 me me 4096 2024-07-26 17:20 Pictures
drwxrwxr-x 2 me me 4096 2024-07-26 17:20 Public
drwxrwxr-x 2 me me 4096 2024-10-26 17:20 Templates
drwxrwxr-x 2 me me 4096 2024-10-26 17:20 Videos

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

فیلد معنی
drwxrwxr-x این رشته از ۱۰ کاراکتر تشکیل شده که اولی نشان‌دهنده‌ی نوع فایل است. در مورد دایرکتوری‌ها حرف d و در مورد فایل‌های معمولی یک کاراکتر خط تیره به عنوان اولین کاراکتر این رشته دیده می‌شود. ۹ کاراکتر بعدی را باید در قالب سه گروه سه‌تایی ببینیم که مجوز دسترسی به فایل را به‌ترتیب، برای یوزر مالک فایل، اعضای گروه مالک فایل و سایر افراد نمایش می‌دهند. برای درک جزئیات مربوط به این رشته باید تا فصل نهم صبر کنید.
2 تعداد لینک‌های Hard مربوط به فایل را نمایش می‌دهد. در بخش پایانی همین درس با لینک‌های Hard و Soft آشنا خواهیم شد.
me نام کاربری مالک فایل
me نام گروه مالک فایل
4096 سایز آیتم بر اساس بایت
2024-07-29-17:20 تاریخ و زمان آخرین دستکاری فایل
Desktop نام فایل

تعیین نوع فایل با کامند file

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

$ file picture.jpeg
picture.jpg: JPEG image data, JFIF standard 1.01
$ file /etc/passwd
/etc/passwd: ASCII text

در مثال بالا، خروجی کامند file را برای یک فایل تصویری و یک فایل متنی می‌بینید.

مشاهده محتوای فایل با کامند less

کامند less برنامه‌ای است برای مشاهده‌ی محتوای فایل‌های متنی. در لینوکس خیلی از فایل‌ها از نوع فایل‌های متنی هستند و less محتوای این فایل‌ها را به شکلی مناسب نمایش می‌دهد. در سیستم‌های لینوکسی ابزارهای قدرتمندی هم برای ویرایش فایل‌های متنی وجود دارد که فعلاً موضوع بحث ما نیستند. الان فقط می‌خواهیم در مورد مشاهده‌ی محتوای فایل‌های متنی صحبت کنیم؛ یعنی همان کاری که کامند less انجام می‌دهد. فرم کلی کامند less به صورت زیر است:

$ less fiename

پس، کافیست آدرس فایل مورد نظر را به عنوان آرگومان کامند less وارد کنیم. less در واقع، یک ابزار Pager است؛ چنین ابزارهایی امکان جابجایی بین صفحات را در فایل‌های متنی که بیش از یک صفحه هستند، فراهم می‌کنند. جدول زیر چند کامند کیبورد را لیست کرده که در برنامه‌ی less قابل استفاده هستند.

کامند کیبورد کاربرد
b اسکرول به صفحه‌ی قبل
space اسکرول به صفحه‌ی بعد
اسکرول به خط قبل
اسکرول به خط بعد
G انتقال به انتهای فایل
g انتقال به ابتدای فایل
/characters جستجوی رو به جلو برای عبارت characters. منظور از جستجوی رو به جلو این است که کل فایل جسجتجو نمی‌شود، بلکه از جایی که هستیم تا انتهای فایل ملاک جستجو خواهد بود.
n اگر عبارت جستجو شده در کامند قبل بیش از یک بار در متن آمده باشد، با فشردن کلید n می‌توان به مورد بعدی منتقل شد.
h نمایش صفحه‌ی help
q خروج از less

Less Is More!

این یک شعار در طراحی و معماری مدرن است. ارتباطش با بحث ما این است که ابزار less یک نسخه‌ی توسعه‌یافته از یک ابزار Pager قدیمی‌تر با نام more است که بخشی از پروژه‌ی GNU بود. بر خلاف less که امکان حرکت رو به جلو و عقب بین صفحات را می‌دهد، ابزار more تنها قادر به حرکت رو به جلو بود.

مهمترین دایرکتوری‌های لینوکس

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

طراحی Filesystem در لینوکس مشابه با سایر سیستم‌های Unix-like است. علت این شباهت این است که استانداردی وجود دارد به نام Filesystem Hierarchy Standard یا FHS که همه‌ی توزیع‌های لینوکسی آن را تقریباً به طور کامل پیاده‌سازی کرده‌اند. جدول زیر مهمترین دایرکتوری‌هایی را که استاندارد FHS معرفی کرده به همراه توضیحی از نقش هر دایرکتوری آورده است. ممکن است بسته به توزیعی که از آن استفاده می‌کنید، به تفاوت‌هایی بربخورید که چیز مهمی نیست.

نام دایرکتوری نقش دایرکتوری
/ دایرکتوری root که ریشه‌ی درخت یا نقطه‌ی شروع Filesystem است.
/bin شامل فایل‌های باینری (برنامه‌های اجرایی) است.
/boot شامل کرنل لینوکس و boot loader است.
/dev این دایرکتوری جایی است که کرنل یک لیست از همه‌ی دستگاه‌هایی که می‌شناسد را به صورت فایل نگه می‌دارد.
/etc شامل همه‌ی فایل‌های کانفیگ سیستمی است و علاوه بر آن، چندین اسکریپت را نگه می‌دارد که سرویس‌های سیستمی را در زمان بوت راه‌اندازی می‌کنند. اینجا فایل‌های مهم زیادی وجود دارد که یکی از آنها فایل /etc/passwd است که شامل اطلاعات اکانت‌های کاربری است.
/home در پیکربندی نرمال، به هر یوزر یک دایرکتوری در /home اختصاص داده می‌شود که دایرکتوری home آن یوزر گفته می‌شود و هم‌نام با نام یوزر است. مثلاً دایرکتوری home برای یوزری به نام me دایرکتوری /home/me است. یک یوزر معمولی فقط در دایرکتوری home خود قادر به انجام عملیات نوشتن (write operation) است.
/lib شامل فایل‌های کتابخانه‌ای اشتراکی است که توسط برنامه‌های سیستمی استفاه می‌شوند. این فایل‌ها مشابه فایل‌های .dll در ویندوز هستند.
/lost+found هر دستگاه یا پارتیشن فرمت‌شده که از یک Filesystem مثل ext4 استفاده می‌کند، دارای این دایرکتوری است. این دایرکتوری در صورت نیاز به ریکاوری ناشی از خرابی بخشی از Filesystem استفاده می‌شود و جز در مواردی که اتفاق بدی برای سیستمتان افتاده باشد، خالی است.
/media در سیستم‌های لینوکسی مدرن، این دایرکتوری حاوی نقاط اتصال (mount points) برای دستگاه‌های جداشدنی (Removable) مانند فلش‌های USB یا CD-ROM است که به صورت خودکار هنگام اتصال نصب می‌شوند.
/mnt در سیستم‌های لینوکسی قدیمی‌تر، دستگاه‌های Removable به طور خودکار mount نمی‌شدند، بلکه باید آنها را به صورت دستی به دایرکتوری /mnt متصل یا mount می‌کردیم.
/opt این دایرکتوری به عنوان یک مخزن برای نرم‌افزارهای اضافی و اختیاری (optional) که بخشی از سیستم‌عامل نیستند، در نظر گرفته شده است. مثلاً اگر ویرایشگر vim را نصب کنید، معمولاً فایل‌های نرم‌افزار در دایرکتوری /opt/vim نصب می‌شوند.
/proc هر پراسس در حال اجرا یک دایرکتوری جداگانه در /proc دارد که شامل اطلاعاتی مانند وضعیت پراسس، منابعی که مصرف می‌کند و موارد دیگر است. محتوای دایرکتوری /proc نه در دیسک بلکه در RAM ذخیره می‌شود، چون محتوای این دایرکتوری به صورت دینامیک تعیین می‌شود و با تغییر پراسس‌های در حال اجرا تغییر می‌کند. از این‌رو، این دایرکتوری یک دایرکتوری مجازی محسوب می‌شود و عملاً بخشی از Filesystem نیست.
/root دایرکتوری home برای یوزر root است.
/sbin این دایرکتوری شامل باینری‌های سیستمی است؛ یعنی برنامه‌هایی که کارهای حیاتی مربوط به سیستم را انجام می‌دهند و فقط توسط یوزر ادمین قابل اجرا هستند.
/tmp این دایرکتوری برای ذخیره‌ی فایل‌های موقت تولید شده توسط برنامه‌ها طراحی شده است. معمولاً تنظیمات سیستم‌ها به‌گونه‌ای باشد که این دایرکتوری با هر ری‌استارت، خالی شود.
/usr بزرگترین دایرکتوری در یک سیستم لینوکسی است که شامل همه‌ی برنامه ها و فایل‌های مورد استفاده توسط کاربران عادی است.
/usr/bin شامل برنامه‌های اجرایی نصب‌شده توسط توزیع لینوکسی است. معمولاً این دایرکتوری شامل هزاران فایل است.
/usr/lib شامل کتابخانه‌های اشتراکی است که توسط برنامه‌های موجود در /usr/bin استفاده می‌شوند.
/usr/local برنامه‌هایی که برای استفاده‌ی کل سیستم در نظر گرفته شده‌اند، در این دایرکتوری قرار می‌گیرند. این دایرکتوری در ابتدا خالی است تا زمانی که مدیر سیستم چیزی به آن اضافه کند.
/usr/sbin شامل برنامه‌های سیستمی در سطح ادمین است.
/usr/share حاوی تمام داده‌های مشترک استفاده‌شده توسط برنامه‌های موجود در /usr/bin است. مثلاً فایل‌های کانفیگ، آیکون‌ها و فایل‌های صوتی در این دایرکتوری هستند.
/usr/share/doc اکثر برنامه‌های نصبی شامل نوعی مستندات هستند که آنها را می‌توانیم در این دایرکتوری پیدا کنیم.
/var داده‌هایی که مستعد تغییر هستند (مثل دیتابیس‌ها، فایل‌های spool، ایمیل کاربر و غیره) در این دایرکتوری نگهداری می‌شوند.
/var/log این دایرکتوری حاوی فایل‌های log است که سوابق فعالیت‌های سیستم را نشان می‌دهند. دسترسی به برخی از این گزارشات به مجوز ادمین نیاز دارد.

آشنایی با لینک‌های Soft و Hard

خروجی زیر را برای کامند ls -l در نظر بگیرید:

lrwxrwxrwx 1 root root 11 2024-06-11 07:34 foo -> foo-2.6

یادآوری می‌کنم که اولین حرف از رشته‌ی ۱۰ کاراکتری ابتدای خروجی کامند ls -l نشان‌دهنده‌ی نوع فایل است که در مورد فایل‌های معمولی کاراکتر dash و در مورد دایرکتوری‌ها d است. در مثال بالا، این حرف l است که از عبارت link گرفته شده و به این معناست که فایل مورد نظر یک لینک به فایلی دیگر است. نام این لینک foo است که به فایلی با نام foo-2.6 اشاره می‌کند. نحوه‌ی ایجاد لینک‌ها را بعداً خواهیم دید اما الان می‌خواهیم بدانیم استفاده از لینک‌ها چه لطفی دارد.

فرض کنید فایلی داریم با نام foo که در چندین برنامه از آن استفاده می‌شود. از طرفی این فایل در طول زمان تغییر می‌کند و یک نسخه‌ی جدید از آن ارائه می‌شود. وقتی ورژن این فایل مثلاً از 2.6 به 2.7 تغییر می‌کند، باید این تغییر را روی همه‌ی برنامه‌هایی که از این فایل استفاده می‌کنند، اعمال کنیم که کاری است پر زحمت و مستعد خطا. اینجاست که لینک‌های Soft به کمک ما می‌آیند.

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

نوع دیگری از لینک‌ها هم وجود دارند که با نام لینک Hard شناخته می‌شوند. در مورد این لینک‌ها و تفاوتی که با لینک‌های Soft دارند و همینطور در مورد نحوه‌ی ایجاد لینک‌ها در درس بعد صحبت خواهیم کرد.