خب، سلام و خسته نباشید خدمت عزیزان، قصد دارم که توی این پست وارد دنیای گنو/لینوکس بشیم و در طی این مسیر به: تاریخچه کامپیوتر و سیستمعامل، کاربرد سیستمعامل، جایگاه گنو/لینوکس و مفاهیم بنیادی و عمومی این حوزه بپردازم و مطالبی که میدونم رو با شما بهاشتراک بزارم تا شاید جرقهای باشه برای ورود شما به دنیای زیبای متنباز یا همون Open Source و حتی فراتر از اون، ضمن اینکه نمیخوام مطلب رو زیاد طولانی کنم ولی ناچارا برای درک و تفهیم یکسری موارد باید مقدمهسازی کنم، پس با یک داستان جذاب شروع میکنیم
قبل از شروع صرفا یک نکته رو خدمتتون عرض کنم که مطالب بهصورت ترتیبی نوشته شدند و توصیه میکنم دقیقا بهترتیبی که نوشته شدند و با حوصله بخونید تا براتون داستان و سفر جالبی باشه
داستان پیدایش کامپیوترها
کامپیوترها یا قطعات الکترونیکی، با انقلاب در صنعت نیمهرساناها کمکم وارد عرصه فعالیت شدند و ما کمکم تونستیم متریالهایی رو ایجاد کنیم که طبق شرایطی که میخواهیم بهعنوان رسانا عمل کنند و طبق شرایطی که ایجاد میکنیم، غیررسانا عمل کنند، یا به عبارتی، جریان برق رو از خودشون عبور بدند یا اینکه تصمیم بگیرند که اینکار رو نکنند، با این مفهوم جدید به درک پایهای رسیدیم از دنیای 0 و 1 یا همان باینری (دودویی)، بر اساس این سیستم دودویی ما میتونستیم کنترل کنیم که یک ترانزیستور میتونه داخلش برق داشته باشه و یک منطق باشه، یا اینکه برق نداشته باشه یا برق کمتر از حدی داشته باشه و بهعنوان صفر منطق ازش یاد کنیم
همین قابلیت نمایش اعداد بهصورت On و Off های الکتریکی، یا وجود یا عدم وجود برق در یک ترانزیستور، باعث شد که ما کمکم به فکر ساخت ماشینحساب بیوفتیم و محاسبات عددی که برای خودمون وقتگیر بودند رو به یک دیوایس بدیم که از مبنای 10 ما به مبنای 2 یا همون 0 و 1 تبدیل کنه و ما با ایجاد گیتهای منطقی ساده، نتیجه اعمال ریاضی روی اونها رو در کمترین زمان ممکن ببینیم
این در واقع شروع دنیای الکترونیکی ما بود، ما یکسری قطعاتی رو به شکل اختصاصی برای یک کار مشخص طراحی میکردیم و بهصورت اختصاصی هم برای اون کدنویسیهای لازم رو انجام میدادیم
ساختار هر قطعه الکترونیکی با اون یکی متفاوت بود، برنامهای که برای ماشینحساب نوشته میشد، فقط روی همون مدل ماشینحساب با همون ساختار و چینش قطعات میتونست کار بکنه و خب منطقی بود، کسی اون زمان انتظار نداشت که یک تلوزیون داشته باشه که بتونه باهاش محاسبات انجام بده، کاربرد هر دیوایس مشخص بود و میدونستند که تلوزیون برای دیدن تصویر هست و ماشینحساب برای محاسبات
این داستان از جایی جذاب شد که آدمها تصمیم گرفتند یک دیوایس همهجانبه بسازند که کارهای متنوعتری رو بتونه انجام بده، هم بتونه فیلم پخش کنه، هم بتونه محاسبات انجام بده، هم بتونیم باهاش کتاب بنویسیم و ...، همین تفکر اولیه باعث ایجاد یک تفکر انقلابی شد
داستان اولین سیستمعامل عمومی (یونیکس | Unix)
از دورانی که قطعات الکترونیکی مرسوم شدند، دنیای نرمافزار هم کمکم در بین آدمها جا افتاد و به این نظریه رسیدند که "قسمتی از کامپیوتر که میشه با چکش خورد کرد، سختافزار هست و قسمتی از کامپیوتر که فقط میشه بهش فحش داد، نرمافزار هست"، اینجا بود که مرز بین نرمافزار و سختافزار مشخص شد و شرکتهای تولید کننده دیوایسها شروع به تولید نرمافزار اختصاصی برای قطعات الکترونیکی خودشون کردند
در سال 1970 میلادی بود که شخصی بهنام دِنیس ریچ (Dennis Ritchie) بههمراه دوستش، اولین سیستمعامل عمومی جهان رو با قابلیت Multi-Tasking به دنیا عرضه کرد و اسم این سیستمعامل رو یونیکس (Unix) گذاشت
این سیستمعامل یک تفاوت خیلی مهم با سایر سیستمهای نوشته شده در دوران خودش داشت، اونهم این بود که این سیستمعامل یا بهعبارتی نرمافزار، میتونست روی سختافزارهای متنوعی اجرا بشه و تعهد یا وابستگی به سختافزار مخصوصی نداشت، یک تکه نرمافزاری بود که شما میتونستید روی دیوایسهای مختلفی نصباش کنید و این در دوران خودش شگفتانگیز بود
در واقع، تا قبل از سیستمعاملهای عمومی، هر کامپیوتری که تولید میشد، شرکت تولیدکننده بهصورت اختصاصی برای اون سختافزار خاص، یک سیستمعامل خاص مینوشت مخصوص یک کار خاص، برای مثال شما یک کامپیوتر بزرگ برای محاسبات سنگین تهیه میکردید، اون کامپیوتر یک سیستمعامل اختصاصی داشت که براش نوشته بودند و هیچکاری به جز محاسبه بلد نبود انجام بده، فقط بلد بود محاسبات انجام بده
با پیدایش سیستمعاملها، کامپیوترها چند منظوره شدند و شما با داشتن یک دیوایس و نصب یک سیستمعامل روی اون، همزمان میتونستید از ماشینحساباش استفاده کنید و در موقع نیاز هم از ماشینحساب بیرون بیاید و شروع به نوشتن کتاب یا ... کنید
سیستمعامل یونیکس در ابتدا با زبان اسمبلی (Assembly) نوشته شده بود و بعد از سه سال تجربه موفق، در سال 1973 سازندهاش تصمیم گرفت که یک زبان برنامهنویسی مناسبتر بهنام C ایجاد کنه و کل یونیکس رو با C بازنویسی کنه و این کار رو هم انجام داد و نسخه جدیدی که ارائه کرد با زبان C بود
بعد از بازنویسی یونیکس با زبان C و ارائه اون، از اونجایی که بخش بزرگی از بازار در دست یونیکس بود، از این فرصت سو استفاده شد و استفاده تجاری یا Enterprise از یونیکس با محدودیتهایی همراه شد که نیاز به هزینه نسبتا بالایی بود، بهعبارت سادهتر، سازندههای یونیکس تا دیدند میتونند کسب درآمد کنند، از فرصت استفاده کردند
در اون دوران، هزینههای هنگفت برای سیستمعامل و نرمافزار در جهان مرسوم نبود، همونطور که اکثریت کاربران همین الان هم برای استفاده از سیستمعامل ویندوز که پولی هست، هزینه نمیپردازند و بهصورت غیرقانونی استفاده میکنند، با این تفاوت که در اون دوران روشهای استفاده غیرقانونی به گستردگی الان نبود و خیلی از شرکتها مجبور بودند که هزینه بپردازند تا کارشون لنگ نباشه
از طرفی هم یونیکس اوپنسورس و آزاد نبود و واقعا کسی نمیدونست که داخل این سیستمعامل چی میگذره! شایعات و خزعبلاتی از جمله اینکه "ابزار جاسوسی آمریکاست" و "کار خودشونه" و موارد مشابه در بین اکثریت جا افتاده بود و کاربران رو بیش از پیش به یونیکس بیاعتماد میکرد
داستان اولین سیستمعامل آزاد (گنو/هرد | GNU/Hurd)
بر اساس اتفاقات بند قبل، عوامل زیادی دستبهدست هم دادند که محبوبیت سیستمعامل یونیکس رو به مرور زمان کاهش بدند و بعد از چند سال فراز و نشیب، در سال 1983 شخصی بهنام ریچارد استالمن (Richard Stallman) پروژهای بهنام GNU رو شروع میکنه که مخفف یک لوپ تکراری Gnu Not Unix هست، این پروژه با هدف اصلاح کاستیهای یونیکس و با تاکید بر اینکه "گنو، یونیکس نیست!" بهعنوان یک سیستمعامل وارد عرصه میشه
این سیستمعامل از کرنلی بهنام Hurd استفاده میکرد که توسط تیم توسعهدهنده GNU توسعه داده شده بود و در بندهای پایینتر بهصورت کامل درمورد کرنل صحبت میکنیم
تفاوت انقلابی سیستمعامل گنو با سایر سیستمعاملهای دوران خودش این بود که: رایگان، متنباز و آزاد بود و شما برای استفاده از اون هزینهای پرداخت نمیکردید، شما بهعنوان یک فرد متخصص در حوزه کامپیوتر میتونستید سورسکد یا کد منبع این سیستمعامل رو دریافت کنید و بهنیاز خودتون ویرایش کنید و بازنشر اش کنید، شما بهعنوان یک فرد شکاک میتونستید سورسکد اون رو بهصورت کامل مطالعه کنید و مطمئن بشید که هیچ جاسوسیای یا نیت بدی در کار نیست
این سه اصل، باعث شد که سیستمعامل گنو به رشد خیلی سریعی در بین طرفدار آزادی و امنیت برسه و باعث شروع دنیایی بهنام "جنبش نرمافزار آزاد" بشه و در طی همین جنبش هم رویدادهای زیادی برگزار بشه
داستان کرنل لینوکس و سیستمعامل گنو/لینوکس
در یکی از رویدادها و سخنرانیهای مرتبط با جنبش نرمافزار آزاد، شخصی بهنام لینوس توروالدز (Linus Torvalds) شرکت میکنه و تحت تاثیر دنیای نرمافزار آزاد، در سال 1991 شروع به توسعه کرنلی کاملا آزاد به اسم لینوکس (Linux) میکنه و اون رو بهصورت کاملا رایگان و متنباز منتشر میکنه
بعد از انتشار اولین نسخه از کرنل لینوکس، به توسعهدهندههای مختلفی ایمیل ارسال میکنه که "من این کرنل رو برای تفریح نوشتم و خوشحال میشم که بررسی کنید و نظرتون رو درموردش بگید و اگر ایرادی هم داشت، خودتون اصلاحاش کنید!"، از همین مرحله سر و کله زدن با کرنل لینوکس شروع میشه و به جای مشارکت یک نفر، کرنل لینوکس توسط افراد مختلفی توسعه پیدا میکنه و هر توسعهدهنده سعی میکنه بهبودش بده و حاصل بهبوداتش رو به سورس اصلی اضافه کنه
در همین حین، تعدادی از توسعهدهندهها شروع به ترکیب کرنل لینوکس با سیستمعاملهای مختلف میکنند و به نتایج جالبی هم میرسند! شروع به ساخت Distribution یا بهاصلاح Distro های مختلف میکنند و اولین Distro های لینوکس رو ایجاد میکنند
یکی از اولین توزیعهای لینوکس، سیستمعاملهای MCC Interim و TAMU و SLS بودند که هرکدوم به دلایل مختلفی توسعهشون بعد از مدتی متوقف شد
بعد از مدتی، با ترکیب سیستمعامل گنو با کرنل لینوکس، سیستمعامل جدیدی بهنام Slackware ساخته شد که تا به امروز هم توسعهاش ادامه داره و یکی از اولین توزیعهای GNU/Linux محسوب میشه
بعد از انتشار موفق سیستمعامل گنو با کرنل لینوکس، افراد و شرکتهای مختلفی شروع به ایجاد ترکیبهای مختلف از سیستمعامل گنو و کرنل لینوکس کردند و نتیجهها به ترتیب Debian و RedHat و Enoch و Arch Linux و ... شدند
به همین شکل، رشد تصاعدی و تکثیر سریع توزیعهای گنو/لینوکسی شروع شد و انقلاب بزرگی در این زمینه شکل گرفت، بهطوریکه دیگه کسی گنو/هرد نمیشناخت و اکثریت مردم گنو رو با کرنل لینوکس میشناختند و استفاده میکردند
این پایان ماجرا نبود، بلکه تازه شروع ماجراهای بزرگتر بود، حتی خود توزیعهای پایه مانند Debian هم تکثیر شدند و سیستمعاملهای محبوب امروزی مثل Ubuntu به وجود اومدند، یا از RedHat سیستمعامل CentOS و از Arch Linux سیستمعامل Manjaro و ... به وجود اومدند
این رشد و تکثیر بهصورت پیوسته ادامه داشته و همچنان ادامه داره، بهطوریکه حتی از خود اوبونتو هم توزیعهای زیادیی مثل Linux Mint و ... بهوجود اومدند و حتی از خود Mint هم توزیعهای متنوعی بهوجود اومدند و ...، این زنجیر به جایی منتهی نمیشه
یک موضوعی که در طول زمان فراموش شد این بود که ما معمولا "لینوکس" استفاده نمیکنیم، بلکه از یک توزیع "گنو/لینوکس" استفاده میکنیم، این موضوع بهقدری عادیسازی و سادهسازی شد که اکثریت دنیا، توزیعهای گنو/لینوکسی رو صرفا با عبارت لینوکس شناختند که این یک اشتباه محض هست که اشارهای به گنو نکنیم
و این داستان ترکیب کرنل لینوکس با سیستمعامل گنو بود، بهقدری این ماجرا ادامه پیدا کرد و محبوب شد که اکثریت سرورهای امروزی و همچنین بخش قابل توجهی از کاربران خانگی از توزیعهای گنو/لینوکسی استفاده میکنند
کرنل چیست (Kernel)
این سوالی هست که توضیح دادنش مثل "توضیح ضرب و تقسیم به کلاس اولی" هست، بدون داشتن پیشنیاز نمیشه چنین موردی رو توضیح داد، فرد ابتدا باید با عدد و جمع و تفریق آشنا بشه و بعدش میتونه ضرب و تقسیم رو درک کنه
اگر به ابتدای مقاله دقت کرده باشید، درمورد این صحبت کردیم که: تا قبل از سیستمعاملها، برای هر کامپیوتر، یک سیستم و نرمافزار مخصوص نوشته میشد که با توجه به چیدمان و قطعات و سختافزار اون کامپیوتر بود و اون نرمافزار روی هیچ دیوایس دیگهای با چینش یا ساختار قطعات دیگه، کار نمیکرد
بزارید براتون بهشکل سادهتری مثال بزنم، فرض کنید نرمافزار، آب هست و قطعههای الکترونیکی هم لیوان
ما یک برنامهای نوشتیم که اندازهاش یک لیتر هست، و سختافزاری که ما در اختیار داریم هم یک لیوان دقیقا با ظرفیت یک لیتر هست، پس ما بهراحتی میتونیم این آب یک لیتری رو داخل لیوان یک لیتری که خودمون ساختیم، بریزیم و هیچ مشکلی پیش نمیاد
اما فرض کنید که برنامهای که ما نوشتیم همچنان یک لیتر هست ولی برای ما یک لیوان نیم لیتری دادند! در این حالت اگر یک لیتر آب رو به لیوان نیملیتری بریزیم، آب سر ریز میشه و باعث خرابی قطعات میشه
راهحل چی هست ؟ ما میتونیم یک فردی رو بهعنوان واسطه قرار بدیم و ریختن آب توی لیوانها رو به ایشون بسپاریم، ایشون خودشون با درک و شناختی که از آب و لیوان دارند، تصمیم بگیرند که چطوری لیوان رو پر میکنند
مثلا اگر آب ما یک لیتر هست، به لیوان یک لیتری بریزند، اگر لیوان ما نیم لیتر بود، همون آب یک لیتری رو در دو مرحله بهصورت نیملیتر نیملیتر بریزند، یا حالتهای مختلف، خلاصه که کل تلاش ایشون این باشه که هیچموقع آبی سر ریز نشه، فرقی هم نکنه که چه مقدار آب با چه گنجایش لیوانی بهش میدیم، بتونه دقیق محاسبه کنه و هر مقدار آب رو دقیقا به اندازه ای به لیوان بریزه که سر ریز نشه
این دقیقا نقش کرنل هست، فرض کنید ما قصد طراحی یک ماشین حساب رو داریم، در ابتدا مجبور هستیم برای ماشین حسابمون یک لایه نرمافزاری سطح بالا بنویسیم که مثلا X رو بهعلاوه Y بکنه، و علاوه بر این منطق، باید کلی وقت بگذاریم و یک لایه سطح پایین برای ماشینحساب بنویسیم که این X و Y رو دقیقا از کدوم پینها با کدوم ولتاژ به کدام بخش از پردازنده بفرسته و مقادیر رو در چه موقعیت از حافظه یا در کدام رجیستر قرار بده و ...، دقیقا مثل این هست که ما داریم از یک شهر رد میشیم و تصمیم میگیریم استراحت کنیم، ولی توی این شهر جایی برای استراحت نمیشناسیم، پس یکماه وقت میگذاریم و یک خونه میسازیم همونجا، یک شب استراحت میکنیم و بعد به مسیرمون ادامه میدیم! در حالی که میتونیم یک واسطه پیدا کنیم که با این شهر آشنایی داره تا برامون یک سوئیت پیدا کنه
با اختراع کرنل، نیاز به اختراع مجدد چرخ در کامپیوترها به حداقل رسید، به جای اینکه برای هر کامپیوتر، واسط نرمافزار و سختافزار بنویسیم، اینکار رو به یک گروه متخصص این کار واگذار کردیم که کرنل بنویسند و ما از اون کرنل واسط استفاده کنیم
بهعبارت سادهتر، کرنل، پایینترین لایه ارتباطی بین سیستمعامل با سختافزار هست، کرنل کارش این هست که سختافزارهای مختلف رو شناسایی کنه و نحوه برخورد با اونها رو بشناسه
میتونید مثل مترجم در نظر بگیرید که در طول زمان به اکثر زبانهای دنیا مسلط شده و ما به هرکشوری بریم میتونیم با خودمون ببریم تا صحبتهای ما و اونها رو به همدیگه ترجمه کنه، و نیازی نباشه که ما زبان هر کشوری رو یاد بگیریم
سیستمعامل چیست (Operating System)
با دونستن کاربرد و نقش کرنل، بهصورت ساده میتونیم تعریف کنیم که سیستمعامل مجموعهای از نرمافزارهای مفید متصل به هم هست که هرکدوم از این ابزارها و نرمافزارها، مثل قطعات یک ماشین عمل میکنند و هرکدوم در جای خودشون قرار میگیرند و نقش جزئی رو برای یک کل (ماشین | کامپیوتر) ایفا میکنند و همچنین سیستمعامل، لایهای نرمافزاری هست که در بالای کرنل قرار گرفته و میتونه طبق ارتباطی که با کرنل داره، سایر نرمافزار ها رو هم اجرا کنه و به کرنل معرفی کنه
گنو چیست ؟ (GNU)
با دونستن تعریف سیستمعامل، میتونیم بگیم که گنو مجموعهای از نرمافزارهای آزاد هست که در کنار هم چیده شدند و نقش مکمل رو ایفا میکنند، نرمافزارهایی از قبیل:
Core Utils, Bash, GZip, TAR, Time, Grep, CPIO, GRUB, DiffUtils, FindUtils, Finger, و ادامه این لیست رو بهصورت کامل میتونید اینجا مشاهده کنید
در واقع، گنو صرفا شامل ابزارهایی پایه برای خوندن/نوشتن فایل، تجزیه و تحلیل فایل، کار با تاریخ و زمان، مقایسه و انجام پروسس و ایجاد پروسس و ... هست و حتی به خودی خود رابط کاربری گرافیکی هم نداره
ویندوز چطور کار میکنه (Windows)
دقیقا ویندوز هم بهعنوان یک سیستم کامل، دارای لایههای مختلفی از جمله لایه سیستمعامل و لایه کرنل و ... هست، با این تفاوت که همه این اتفاقات در پشتصحنه میافته و ما صرفا از حضور و نحوه عملکرد اونها بیخبر هستیم، دقیقا مثل سالن تئاتر که در پشت پرده کلی اتفاق در جریان هست ولی ما صرفا صحنه رو میبینیم
تفاوت عمده اینجاست که در گنو/لینوکس، با خوندن سورسکد میتونیم به نحوه دقیق رخدادن این اتفاقها پی ببریم و در صورت نیاز تغییرشون بدیم، در ویندوز چنین امکانی نیست و مهندسین مایکروسافت تصمیم میگیرند که چی برای ما خوب هست و چی بد
در یک مقایسه کلی، ویندوز مثل یک ماشین اسباببازی کنترلی هست که مایکروسافت در اختیار کاربرانش قرار داده و کاربران میتونند طبق نیازشون رنگبندی و ... ماشین رو شخصیسازی و استفاده کنند، ولی گنو/لینوکس یک ماشین اسباببازی آماده نیست، بلکه تعداد زیادی LEGO هست که در اختیار شما قرار دادند و این شما هستید که تصمیم میگیرید با استفاده از این LEGO ها یک ماشین کنترلی بسازید، یا اینکه یک هواپیمای جنگی
دنیای نرمافزار آزاد چیست (Open Source)
دنیای نرمافزار آزاد یا جنبش نرمافزار آزاد، تاکید بر این داره که ما باید صاحب نرمافزار باشیم، نه اینکه برده نرمافزار
از اصول کلی این دنیا این هست که ما بهعنوان یک مصرفکننده نرمافزار، حق داریم بدونیم که درون این نرمافزار چی میگذره و چه اتفاقاتی میافته و حتی در سطوح خاصی حق داریم که این نرمافزار رو با توجه به نیاز خودمون تغییر بدیم و حتی اون رو بازنشر و تکثیر کنیم یا حتی اون رو تکمیل کنیم
یک مثال ساده از این دنیا میتونه پروژههای GNU و Linux و ... باشه که بهدلیل آزاد بودن، توسط داوطلبین و بهمرور زمان توسعه پیدا کردند و الان تبدیل به غولهایی شدند که با کمپانیهای بزرگی مثل اپل و مایکروسافت رقابت میکنند
در بندهای قبلی اشاره کردیم که گنو/لینوکس به خودی خود، رابط کاربری گرافیکی هم نداره، ولی از اونجایی که اوپنسورس بوده و هست، از همون ابتدا پروژهای تحت عنوان XOrg بهعنوان سرور نمایشی گرافیکی برای این سیستم عرضه شد که باعث شد بتونیم با مفهوم برنامههای GUI یا گرافیکی در این سیستمها آشنا بشیم و همه اینها بهلطف دنیای نرمافزار آزاد هست، وگرنه کسی نمیتونه برای سیستمعاملی مثل ویندوز پروژهای مشابه XOrg ایجاد کنه چون مستندات مورد نیازی برای اینکار در دسترس نیست و بهصورت محرمانه توسط مایکروسافت نگهداری میشه
نتیجهگیری
بهصورت کلی، فهمیدیم که سیستمعامل چیه و یونیکس چیه و چطوری وارد عرصه شد و چه تاثیراتی داشت و چطوری محو شد و باعث بهوجود اومدن گنو و لینوکس و توزیعهای گنو/لینوکسی شد
همچنین با دنیای نرمافزار آزاد سعی کردیم آشنا بشیم و تا حد امکان در رشد اون مشارکت داشته باشیم
در نهایت، لزوما گنو/لینوکس مناسب هر کاربری نیست و قرار هم نیست که کل دنیا از گنو/لینوکس استفاده کنند، نه ویندوز بد هست و نه مک و نه سایر سیستمعاملها، بلکه هرکدوم مزیتها و معایبی دارند و برای قشر مشخصی از کاربران ساخته شدند، اگر به گنو/لینوکس علاقهمند شدید که حتما توصیه میکنم وارد این دنیا بشید و امتحان کنید، سعی کنید به کسانی که میشناسید از خوبیهای دنیای گنو/لینوکس بگید، ولی به هیچعنوان سعی نکنید کسی رو به اجبار به سمت گنو/لینوکس بکشونید، چرا که فلسفه گنو/لینوکس این نیست که "ما خوبیم و بقیه بد"، بلکه سعی میکنیم خوبیهای این جامعه رو به افراد بیشتری نشون بدیم تا افراد بیشتری با این سیستم آشنایی پیدا کنند و در صورتی که مناسب نیازشون بود، استفاده کنند
در نهایت، آرزوی موفقیت دارم، ممنون از وقتی که برای خوندن این پست صرف کردید
