انسان یک گونه نقاد ، هنرمند و هوشمند است ! به همین خاطر است که پرسشگری میکند!
یونیکس و شبه-یونیکس قدم اول | بخش 3-1 کتاب bash2003
فصل اول [ قسمت سه از پنج ] (قسمت قبل)
خب خب توی این بخش از فصل اول کتاب bash2003 بهتون یه کوچولو در مورد UNIX و سیستم های
Unix-like ( یا شبه یونیکسی) میگم.
یونیکس یا UNIX چیه؟

به طور خیلی ساده و کوتاه یه سیستم عامل.
سیستم عاملی که یکی از دلایل محبوبیت زبان C و افرادی مثل کن تامپسون و دنیس ریچی (سازندگان سیستم عامل یونیکس و C) بود. یونیکس به دلیل این که اولین سیستم عامل قابل حمل (portable) بود خیلی معروف شد .
همینطور چند کاره (Multi tasking) و چند کاربره (Multi User) بودن و انعطاف بالاش به معروفیتش کمک کرد از طرفی یونیکس یک رویکرد ماژولار داشت یعنی به شکل ماژولار دیزاین شده بود که همین رویکرد بعد ها به فلسفه یونیکس یا (Unix philosophy) معروف شد.
این ماژولار بودن این رو بیان میکرد که هر فانکشن و برنامه در یونیکس باید یک کار کاملا واضح و کوچک رو انجام بده. (که بعد ها همین فلسفه در کتاب Clean Code به عنوان یک قانون برای نوشتن فانکشن های بهتر و تمیز تر در برنامه نویسی بیان شد).
و خب از اونجایی که هر فانکشن و برنامه در یونیکس یک کار کوچک رو انجام میداد نیاز به یک ابزار بود که بتونیم باهاش این برنامه ها و فانکشن ها رو با هم به کار بگیریم تا کار های پیچیده تر رو انجام بدیم.
اون ابزار Unix Shell بود که به تامپسون شل یا sh (اس اچ) معروف بود. (حالا نسخه پیچیده ترش که در این کتاب بهش میپردازیم bash هست. که یه مشت ویژگی خفن به همین sh (تامپسون شل) که نه بلکه به یه sh (که به بورن شل معروف هست) دیگه که بعد ها جایگزین این sh (تامپسون شل) شده بود اضاف کرده که بهتون میگم چیا هستند.)
ممکنه این sh تو sh ای که شد یکم براتون درک این مطلب رو پیچیده کرده باشه یه توضیح بدم :
ببینید اولین شلی که ساخته شد unix shell بود که کن تامپسون ساختش و به اختصار بهش میگفتن sh بعد ها یه نفر به اسم bourne اومد یه شل دیگه ساخت که خب جایگزین همین شلی شد که تامپسون ساخته بود که به اونم میگفتن sh حالا bash در حقیقت نسخه پیشرفته تر sh ای هست که bourne ساخته!
خب اگر در مورد یونیکس دوست دارید بیشتر بدونید، کلی منبع هست از ویکی پدیا تا کتاب و ... که میتونید مطالعه کنید. هدف من از این که در مورد یونیکس اینه که به فایل سیستم برسم.
یکی از مهمترین بخش های سیستم عامل یونیکس فایل سیستمش (Inode-based filesystem) بود. و خب کل بحث ما در این بخش حول محور ساختار این فایل سیستم هستش.
خیلی جاها ممکنه بنویسن سیستم فایل که به نظرم هارمونی نداره و یه جوریه! حداقل از نظر من اینجوریه، من ترجیح میدم فارسی بنویسم فایل سیستم. چون حداقل هارمونیش حفظ میشه نسبت سیستم فایل.
اما قبل از این که بریم که با فایل سیستم و مفاهیم بامزه اش آشنا بشیم . بیاید یه سر به سیستم عامل های Unix-like یا شبه یونیکس بزنیم.
شبه یونیکس یا Unix-like چیه؟

خب یونیکس به عنوان اولین سیستم عامل قابل حمل اینقدر محبوب دل ها بود که کلی مشتقات داشت یعنی کلی سیستم عامل بودن که حتی کدهاشون هم همون کد های یونیکس اولیه (UNIX RESEARCH ) بود. یا حالا اون کد ها رو برداشته بودن و یه مشت ویژگی بهش اضاف کرده بودن یا بخشی از کدها دقیقا همون کد های یونیکس بود و خلاصه ربط مستقیمی از لحاظ کدبیسی به پروژه اولیه که به Unix Research معروف بود داشتند.
بعد ها یه سری سیستم عامل ها مثل لینوکس بالا اومدن که اینا اصولا از لحاظ کدبیسی شباهتی به کد های شرکت AT&T و یونیکس اولیه نداشتند ولی طراحی ماژولار داشتند، قابل حمل، چندکاربره و چند کاره بودن و خلاصه به شدت به فلسفه یونیکس نزدیک بودند جوری که مثلا دنیس ریچی سازنده یونیکس در رابطه با لینوکس میاد میگه که اقا این یکی از معدود سیستم عامل هایی هست که به شدت به فلسفه یونیکس نزدیکه! با این که کدبیسش فرق میکنه!
پس به طور کلی ما یه سیستم عامل یونیکس داشتیم و یه سری مشتقات که بهشون میگن شبه یونیکس. هرچند گروه اصلی ای که امتیاز UNIX رو به عهده داره اصلا این قضیه Unix-like و شبه یونیکس رو قبول نداره و بیشتر به عنوان یه فریب تجاری میشناستش.
اگر دقت کرده باشید هر جا از خود UNIX گفتم همه حروف بزرگ بودند و هر جا از Unix-like فقط u بزرگ بود این دقیقا یکی از وجه تمایز های بین سیستم عامل هایی هست که اون گروه UNIX صداشون میکنند و سیستم عامل هایی که مردم Unix-like یا شبه یونیکس صداشون میزنن.
هر چند اگر شما پول کافی داشته باشید و یه سیستم یونیکس لایک ساخته باشید (حالا چه از لحاظ کدبیسی شباهت داشته باشه چه از لحاظ فلسفی و فایل سیستمی) با چیزی در حدود چند ۱۰۰ هزار دلار میتونید بگید که سیستم عاملتون UNIX هست! و حتی اجازه و حق تجاری سازیش هم دریافت کنید.
حالا که منظورم از شبه یونیکس بودن سیستم عامل لینوکس رو گرفتید. بریم سراغ بحث اصلیمون. ساختار فایل سیستم لینوکس.
فایل سیستم (File System) چیست؟
فایل سیستم در حقیقت یک بخشی از سیستم عامل هست که به ما امکان ذخیره سازی و بازیابی اطلاعات رو میده. اطلاعاتی که در یک سری فایل بخصوص ذخیره شده اند. اون اوایل وقتی یونیکس به وجود اومد کلا سه نوع فایل رو بیشتر ساپورت نمیکرد :
یا فایل های عادی مثل فایل های متنی ordinary files
directories یا دایرکتوری ها (
کلا توی سیستم عامل های شبه یونیکس و یونیکس به فولدر میگیم دایرکتوری)
special files یا فایل های خاص که بهشون device files هم میگن (اینا رو سر موقع اش براتون مثال میزنم.)
پس در حقیقت فایل سیستم بخشی از سیستم عامل هست که اجازه میده ما اطلاعاتی که داخل این فایل ها هستند رو ذخیره و حتی بازیابیشون کنیم.
اما بریم سراغ
ساختار فایل سیستم
ساختار فایل سیستم رو اصولا در هر منبعی که اون بیرون پیدا میشه و یکم معتبر باشه به شکل یه درخت تشبیه میکنن درختی که از ریشه و تنه (root)* شروع میشه و کلی شاخه (دایرکتوری) میزنه و هر شاخه میتونه توی خودش یه مشت شاخه دیگه داشته باشه و در نهایت روی این شاخه ها یه مشت برگ (فایل) وجود داشته باشن.
یک نکته : اون بخشی که براتون * زدم به این خاطر هست که همین الان بهتون این نکته رو بگم که بچه ها در این درخت فرضی که فایل سیستم بهش تشبیه شده تنه و ریشه رو یکی میدونیم پس هر موقع گفتیم root یا ریشه کلا منظورمون تنه و ریشه هست. (تازه نکته باحال ترش اینجاست که در اکثر اوقات تقریبا ۹۹ درصد مواقع اصلا منظور فقط همون تنه هست.)

از اونجایی که ما میخوایم لینوکس رو از طریق یادگیری شل یاد بگیریم و از قسمت قبل هم میدونیم منظورمون از شل هایی که در سیستم های شبه یونیکس وجود دارند شل های متنی هست و شل های متنی هم در CLI حضور دارند. پس باید بتونیم به یه نحوی این ساختار درختی ای که بالا براتون توصیف کردم رو به شکل متنی نشون بدیم درسته؟ اما چطوری؟
خب اصولا به این شک اجزا رو نشون میدیم :
- برای نشون دادن ریشه یا root از علامت / استفاده میکنیم.
/- برای نشون دادن یک شاخه یا بهتره بگم دایرکتوری از علامت : /directory_name استفاده میکنیم یعنی نام دایرکتوری رو مینویسیم بعلاوه یه /
پس اگر یه دایرکتوری داشته باشیم به اسم user اینجوری نشونش میدیم :
user/- و برای نشون دادن یک برگ یا بهتره بگم فایل، کافیه نامش رو بنویسیم مثلا فکر کنید یه فایل هست به اسم farhan.txt اینجوری نشونش میدیم :
farhan.txtپس به طور کلی در یک فایل سیستم ما با یک ساختار درختی روبه رو هستیم که از ریشه و مخصوصا تنه (root) شروع میشه تا برسیم به شاخه (دایرکتوری) و سپس به برگ (فایل).
به این صورت که اگر بخوایم یک فایل با نام farhan.txt که توی دایرکتوری users هست که خودِ اون دایرکتوری هم توی root قرارداره اشاره کنیم میتونیم اینو بنویسیم :
/users/farhan.txtکه اگر دقت کنیم نوشتیم / یعنی root که داخلش دایرکتوری users هست . (چرا دایرکتوری؟ چون نام + یه اسلش اومده دیگه) که داخل اون دایرکتوری یه فایل داریم که اسمش farhan.txt هست.
پس نحوه خوندنش این شکلیه :
از سمت راست :
فایل farhan.txt که توی دایرکتوری users قرارداره که اون دایرکتوری توی root قرار داره
از سمت چپ :
از root میریم به دایرکتوری users که توش یه فایل هست به نام farhan.txt
به صورت شکلی :
root -> users(directory) -> farhan.txt(file)
حالا برای این که مطمعن بشم نحوه خوندنشو یاد گرفتید این رو بخونید و این زیر کامنت کنید :
/users/mentors/ali.txtخب حالا که تا حدودی اینا رو فهمیدیم بریم سراغ نشون دادن ساختار استاندارد این فایل سیستم.
در یک سیستم عامل شبه-یونیکسی یا بهتره دیگه نگیم اینو بگیم در لینوکس ساختار دایرکتوری های اصلی ما ایناست:
/
/bin/
/boot/
/dev/
/etc/
/etc/opt/
/etc/sgml/
/etc/X11/
/etc/xml/
/home/
/lib/
/lib<qual>/
/media/
/mnt/
/opt/
/proc/
/root/
/run/
/sbin/
/srv/
/sys/
/tmp/
/usr/
/usr/bin/
/usr/include/
/usr/lib/
/usr/libexec/
/usr/lib<qual>/
/usr/local/
/usr/sbin/
/usr/share/
/usr/src/
/usr/X11R6/
/var/
/var/cache/
/var/lib/
/var/lock/
/var/log/
/var/mail/
/var/opt/
/var/run/
/var/spool/
/var/tmp/این شاخه ها یا بهتره دیگه بگیم دایرکتوری هایی که میبینید در حقیقت سیستم عامل ما رو شکل میدن. من کم کم در طول مسیر یادگیریمون و در فصل های بعدی تک تک اینا رو بهتون معرفی میکنم و بهتون میگم که چیکار میکنند و اصلا چرا حضور دارند.
فقط یک نکته : ممکنه گاهی دایرکتوری هارو بدون اسلش نهایی نشون بدن که مشکلی نیست مثلا به جای :
/var/tmp/
به این شکل نمایش میدن :
var/tmp/
که اوکیه!
مهم برای بهتر یادگرفتن : بچه ها ببینید در ساختار بالا یه دایرکتوری هست که به این شکل نشون دادم /dev/ فقط جان جدتون این رو دیو بخونید نه دِو چون این برای دیوایس هاست و اصلا دیو باید باشه ولی خب Device چون اول dev داره اینجوری نوشتنش. پس بگید دیو تا دیوایس براتون تداعی بشه تا بعدا که دارم دلیل موجودیتش و این که چیکار میکنه و چه فایل هایی توش هستند رو بهتون میگم دیگه یهو نخوره تو ذوقتون که عه؟ من فکر میکردم این برای فایل هایی که develope و توسعه کردیم هست پس مال دیوایساست؟ پشمام...
یه نکته دیگه هم بگم :
توی توضیح فایل سیستم گفتم به یه درخت تشبیه اش میکنیم که همه چیز از ریشه و تنه که بهش میگیم root شروع میشه، اگر دقت کنید تمام ۴۳ دایرکتوری ای که بالا در ساختار استاندارد نشون دادم از / که نشون دهنده root هست شروع شدن!
خب این پست هم تموم شد. فقط یک قانون رو همینجا بدون دلیل و پرسش بیاید حفظ کنیم و اون هم اینه :
همه چیز در لینوکس فایل هست همه چیز.
کم کم توی فصل ها و پست های بعد هی به این نکته که همه چیز در لینوکس فایل هست پی میبریم پس از الان یه آشناییتی باهاش داشته باشید تا گوش و چشمتون بهش عادت کنه!
خلاصه ماجرا :
توی این پست فهمیدیم که یونیکس چیه و دلیل محبوبیتش چی بود. بعد فهمیدیم که لینوکس یک سیستم عامل شبه یونیکسی هست که طراحیش به فلسفه یونیکس خیلی شبیه هست. بعد در مورد فایل سیستم گفتیم که فضایی برای ذخیره سازی و بازیابی فایل هامون هستش، که به شکل یک درخت میتونیم بهش نگاه کنیم که به تنه و ریشه اش میگن root و به هر شاخه اش میگن directory و به هر برگش میگن یک فایل. و این نکته هم گفتیم که چطوری این اجزا رو در محیط CLI و در نهایت شل نشون میدیم. در آخر هم به بحث ساختار استاندارد یک سیستم عامل لینوکسی بر اساس استاندارد FHS پرداختیم. که صرفا یه آشناییت کوچولویی داشته باشیم .
تمرین
لطفا سعی کنید از ساختار استاندارد فایل سیستم لینوکس که در بالا براتون گذاشتم ۵ تاش رو بردارید به دلخواه بخونید میخوام که بفهمید مثلا منظور از این که نوشته شده :
/bin/چیه ؟ و خب این باعث میشه ذهن و چشمتون به این شکل از نوشتار عادت کنه و کم کم بتونیم توی جلسات بعدی و مخصوصا فصل های بعدی راحت تر و بدون مقدمه چینی های زیاد به یادگیری بپردازیم.
جوابتون رو توی کامنتا بنویسید.
سخن پایانی
از پست بعد وارد درک مسیر ها در فایل سیستم میشیم و در نهایت بعد از یک پست دیگه فصل اول تموم میشه و میتونیم دست به کد بشیم و با شل کار کنیم و بیشتر سیستم عامل های شبه-یونیکسی خودمون رو بشناسیم و لینوکس رو یاد بگیریم.
کتاب bash2003 تحت لایسنس CC-BY-SA منتشر میشه و میتونید آزادانه و با خیال راحت استفاده کنید.
پست بعدی و ساعت ۱۳:۰۰ فردا
مطلبی دیگر از این انتشارات
چرا هنوز هم باید CLI بلد باشیم؟ | بخش 2-1 کتاب bash2003
مطلبی دیگر از این انتشارات
مفهوم مسیر های مطلق و نسبی در فایل سیستم | کتاب bash2003 بخش 1-4
مطلبی دیگر از این انتشارات
بش اسکریپت، فصل اول | کتاب bash2003