لینوکس، عشق، برنامه نویسی

لینوکس، عشق، برنامه نویسی

در این وبلاگ مطالبی درباره سیستم عامل لینوکس و همچنین درمورد برنامه نویسی و کامپیوتر مینویسم.

 

 

سلام.

در این مقاله می‌خوام به نحوه‌ی نصب نرم‌افزار در دو سیستم عامل لینوکس و ویندوز و تفاوت اونها بپردازم. می‌خوام این بهترین مقاله‌ای باشه که در عمرتون درباره لینوکس خوندید و بهترین مقاله‌ای باشه که از اغاز پیدایش اینترنت، به زبان فارسی درباره لینوکس نوشته شده!

 

در همین ابتدا بگم، در این مقاله، از علایم نگارشی به درستی استفاده شده تا خواندن متن برای شما راحت باشه.

 

پس کمربندها رو محکم ببندید و ماسک اکسیژن خودتون را روی صورت بذارید چونکه میخایم به اعماق سیستم عامل لینوکس بریم و ببینیم در عمق سیستم عامل چه خبره و چجوری کار میکنه.

 

 

بهترین شیوه ای که می تونم به شما یاد بدم که یک نرم افزار چگونه در لینوکس نصب میشه این هست که اونو با ویندوز مقایسه کنم. اما در ابتدا باید بببینیم که یک نرم افزار از چه فایل هایی تشکیل میشه. پس سوال اول ما میشه این:

 

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

اگر بخواهم  خیلی ساده و بدون پیچیدگی توضیح بدم، یک نرم افزار چیزی بیشتر از یک فایل اجرایی نیست. این نرم افزار میتونه به هر زبان برنامه نویسی ای نوشته بشه، ولی توی لینوکس، تقریبا همه ی نرم افزار ها به زبان قدرتمند C نوشته میشن. و اگر می خواهید لینوکس رو بیشتر درک کنید، حتما یادیگری زبان C رو توی برنامتون داشته باشید.

 

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

مثلا دانلود منیجرها رو فرض کنید، بیشتر این دانلود منیجرها، اطلاعات فایل های دانلود شده رو توی دیتابیس ذخیره میکنن. یا مثلا برخی نرم افزار ها، اطلاعات setting و تنظیمات کانفیگ رو در فایل های xml ذخیره میکنن و یا اینکه اطلاعاتشون رو داخل فایل های text ساده میریزن. در ساخت خیلی از اینها، از لایبرری ها استفاده میشه. توی نرم افزار ممکنه از عکس ها و ایکن های های خاص و یا از فایل های صوتی هم استفاده بشه. پس همونطور که می بینید، یک نرم افزار از مجوعه ای از فایل ها تشکیل شده.

 

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

مثلا فرض کنید من میخوام یک نرم افزار text editor درست کنم. ابتدا یک پوشه درست میکنم به نام text editor project، بعد داخلش یک پوشه درست میکنم به نام src که سورس کد نرم افزار رو توش قرار میدم. یک پوشه درست میکنم به نام config و کانفیگ نرم افزار رو داخل اون قرار میدم. یک پوشه درست کنم به نام xml و فایل های ایکس ام ال رو توش قرار بدم، یک پوشه درست میکنم به نام lib و لایبرری های مورد نیاز رو داخل اون قرار میدم. یک پوشه ممکنه به نام Icons درست کنم و داخلش icon رو قرار بدم و همینجوری برای هر چیزی ممکنه پوشه ای درست کنم که نرم افزار سازماندهی بشه.

 

پس ما یاد گرفتیم که برنامه نویسان روند کارشون چجوریه و نرم افزار تقریبا چه ساختاری داره (دقت کنید که همه ی نرم افزارها دقیقا این ساختار رو ندارن، بستگی به سادگی و پیچیدگی نرم افزار داره، ممکنه اجزای کمتر یا بیشتری داشته باشن. یا بستگی به زبان برنامه نویسی داره، توی جاوا ممکنه کمی متفاوت تر از C باشه. توی این ساختاری که گفتم، من بیشتر C مد نظرم بود).

 

حالا فرض کنید که من تکست ادیتورم رو نوشتم و کامپایل کردم و اماده هست، و میخوام که اونو منتشر بکنم تا کابران ویندوز و لینوکس از سراسر دنیا ازش استفاده بکنن.

چیکار باید بکنم؟ ایا باید همون پوشه ی text editor project رو بریزم داخل یک فایل zip و روی اینترنت قرار بدم و بگم دانلودش کنید و استفاده کنید؟؟؟ نه!

اینجاست که تفاوت مهم لینوکس و ویندوز آشکار میشه و قسمت شیرین ماجرا پیش میاد :) پس با ادامه ی مقاله همراه باشید.

 

ابتدا بریم سراغ ویندوز و ببینیم نرم افزار چجوری منتشر، دانلود و نصب میشه

ویندوز رو دیگه همه ی ماها از بچگی میشناسیم. وقتی برنامه نویس برنامشو نوشت، کل فایل ها و پوشه ها رو میزاره داخل یک فایل به نام setup.exe و این فایل رو اپلود میکنه روی اینترنت و ما، میریم به سایت (مثلا) www.downloadha.ir و اونو دانلود میکنم. سپس، دو بار روی فایل کلیک میکنیم تا فرایند نصب شروع بشه. در طول فرایند نصب، چندبار Next میزنیم، از ما مسیر نصب نرم افزار رو میپرسه، و همه ی ماها اکثرا مسیر /C:/ProgramFiles رو انتخاب میکنیم و یک پوشه مخصوص نرم افزار در این مسیر ایجاد میشه(مثلا firefox) و کل فایل ها و پوشه های نرم افزار، در داخل C:/ProgramFiles/firefox قرار میگیرن.

 

توضیحات مختصری درباره فایل های setup.exe و install.exe :

اجازه بدید کمی هم درباره این فایل ها صحبت کنم. به اینجور فایل ها، در اصطلاح، Archive file (آرکایو فایل) گفته میشه ("و" رو درست بخونید، مثل وام، وجدان) (تلفظ فارسیش میشه آرشیو)

 

اگرچه فایل setup.exe و install.exe پسوند exe دارن و فایل اجرایی محسوب میشن، ولی در حقیقت مثل یک فایل آرکایو هستن.

 

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

اکسترکت کردن هم در واقع همون کپی کردن هست. وقتی یک فایل آرکایو رو Extract میکنید، فایل ها و پوشه های داخلش کپی میشن به بیرون. مثلا اگر در دسکتاپ باشید و یک فایل آرکایو رو اکسترکت کنید، فایل ها و پوشه های داخلش کپی میشن به دسکتاپ. فایل های rar و zip از معروف ترین فایل های آرکایو هستن که در ویندوز وجود دارن.

 

نتیجه گیری:

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

 

و حالا بریم سراغ لینوکسwink

 

فرایند نصب نرم افزار در لینوکس چگونه است؟

خب، لحظه ی موعود فرا رسید و رسیدیم به قسمت حساس و مهم ماجرا smiley

مهمترین و اصلی ترین و حیاتی ترین و ضروری ترین نکته ای که باید بدونید این هست که در لینوکس، برخلاف ویندوز، تمام فایل های یک نرم افزار، در یک پوشه قرار "نمی گیرند"، بلکه در پوشه های متعدد در دایرکتوری روت پخش می شوند. این مساله، اصلی ترین تفاوت لینوکس و ویندوز هست.

 

در دایرکتوری روت، برای هر نوع فایلی یک دایرکتوری وجود داره! مثلا دایرکتوری /usr/lib/ رو در نظر بگیرید. این دایرکتوری محل ذخیره ی لایبرری های C هست. یا دایرکتوری /usr/bin/ رو در نظر بگیرید. این دایرکتوری محل ذخیره ی فایل اجرایی برنامه هاست. ینی هر نرم افزاری که در لینوکس نصب بکنید، "فایل اجرایی برنامه" میره داخل این دایرکتوری (همون فایلی که روش دوبار کلیک میکنید و نرم افزار اجرا میشه!)

اگه برید توی این دایرکتوری و به داخلش نگاهی بندازین متوجه حرفم میشید. به عنوان تمرین میخام بهتون بگم که برید توش و ببینید ایا میتونید فایل اجرایی firefox، vlc، gimp و سایر برنامه هارو توش پیدا کنید یا نه؟ البته اگه این برنامه هارو نصب کرده باشیدsmiley

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

 

نتیجه گیری:

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

 

حالا بریم ببینم که نرم افزار ها در لینوکس، در چه شکل و قالبی منتشر میشن

در لینوکس عموما به این شکل هست که، برنامه نویس برنامه اش رو می نویسه و سورس رو در اینترنت منتشر میکنه (مثلا در گیت هاب).
حالا، سازندگان توزیع های لینوکسی، میان و سورس رو دریافت میکنن، و کامپایل میکنن، و سپس همه ی فایل های نرم افزار رو میزارن داخل یک فایل ارکایو!

برای مثال، توزیع debian، فایل آرکایو deb رو داره. ینی سازندگان توزیع دبین، وقتی بخوان نرم افزاری رو برای دبین منتشر بکنن، باید کل فایل های نرم افزار رو بریزن داخل یک فایل deb و اون فایل دب رو اپلود کنن روی یک سرور تا ما بتونیم اونو دانلود و  نصب بکنیم. به این سرور میگن ریپازیتوری یا مخزن. هر توزیع لینوکس برای خودش یک ریپازیتوری داره.

 

ممکنه براتون سوال پیش بیاد که در لینوکس چند نوع فایل ارکایو داریم؟ ایا فقط فایل های deb رو داریم؟

در جواب باید گفت که هر توزیع لینوکسی برای خودش یک فرمت درست کرده. برای مثال، توزیع Debian، فرمت deb رو ایجاد کرده. یا مثلا توزیع آرچ، از فایل tar استفاده میکنه. یا مثلا توزیع فدورا، فرمت RPM رو ایجاد کرده.

 

اما سوال اصلی اینجاست:

ایا برای نصب نرم افزار، باید بصورت دستی بریم و این فایل های آرکایو رو از روی ریپازیتوری دانلود و نصب بکنیم؟ برای مثال، برای نصب نرم افزار gimp، باید بریم فایل deb  گیمپ رو از روی ریپازیتوری دانلود بکنیم؟ و بعد اکسترکت بکنیم؟ و بعد هر فایلی رو بصورت دستی به دایرکتوری مربوط خودش در روت کپی کنیم؟

جواب: نه! ما اینکار رو می سپاریم به یک نرم افزار به نام package manager

 

package manager ها یا مدیر بسته ها چی هستن؟

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

 

بزارید با ذکر یک مثال بریم جلو، برای مثال وقتی شما در اوبونتو دستور sudo apt-get install firefox رو میزنید، پکیج منیجر apt میره و فایل ارکایو مربوط به فایرفاکس رو (ینی فایل firefox.deb رو)، از روی ریپازیتوری دانلود میکنه، سپس اونو اکسترکت میکنه، سپس تک تک فایل ها رو به دایرکتوری خودش در روت کپی میکنه. همونطور که در بالا هم گفتم، در واقع فایل آرکایو رو نصب میکنهsmiley

 

هر توزیع لینوکسی اومده و برای خودش یک پکیج منیجر نوشته و براش اسم گذاشته. برای مثال، توزیع Debian، پکیج منیجر apt رو نوشته. یا توزیع Fedora، پکیج منیجر dnf رو نوشته.

و نکته ی مهم اینجاست که هر پکیج منیجری فقط میتونه فایل آرکایو مخصوص به خودش رو بخونه. برای مثال apt فقط میتونه فایل های deb رو بخونه و پکیج منیجر dnf فقط میتونه فایل های RPM رو بخونه.

 

ممکنه یه سوال دیگه براتون پیش بیاد، چرا پکیج منیجر باید اینکار رو انجام بده؟ چرا ما نباید بصورت دستی فایل deb رو اکسترکتش کنیم و فایل هارو به روت انتقال بدیم؟

جواب: مدیریت این همه فایل بصورت دستی کار ساده ای نیست و پکیج منیجر کار مارو خیلی راحت میکنه. اگرچه بصورت دستی هم میتونید یک فایل deb رو دانلود بکنید و Extract بکنید و فایل ها رو بطور دستی به دایرکتوری مربوطه در روت کپی کنید. این کار کاملا شدنی هست ولی دردسر داره. فرض کنید که اینکار رو انجام دادید و فایل های فایرفاکس رو بصورت دستی به روت کپی کردید، حالا اگه به شما بگم که فایرفاکس رو از روی سیستم پاک کنید، شما باید برید تک تک فایل هایی که بصورت دستی به روت کپی کردید رو پاک کنید. ینی مغز شما باید اونقدر قوی باشه که یادتون بمونه کدوم فایل رو به کدوم دایرکتوری کپی کردیدsmiley

 

یک نکته ی کلی به شما بگم، همیشه این نکته رو یادتون باشه، هیچوقت نباید یک فایل رو بصورت دستی کپی کنید داخل روت! چون اینجوری حساب و کتاب اون فایل از دستتون خارج میشه. پکیج منیجر میدونه کدوم فایل رو از داخل کدوم deb، به کدوم دایرکتوری در روت کپی کرده، چون اینارو توی دیتابیس خودش ثبت میکنه. و وقتی که به پکیج منیجر میگید که firefox رو حذف کن، میدونه کدوم فایل هارو در روت باید پاک کنه!

 

سوال بعدی که براتون پیش میاد اینه که وقتی پکیج منیجر یک فایل آرکایو رو دانلود کرد، از کجا میفهمه که فایل های داخلش رو باید به کجای روت کپی کنه؟ برای مثال وقتی apt فایل deb مربوط به فایرفاکس رو دانلود کرد، از کجا میفهمه که فایل های داخلش رو باید به کجای روت اکسترکت کنه؟ خب حالا رسیدیم به حساس ترین قست ماجرا. برای پاسخ به این سوال باید یک فایل deb رو باز کنیم و ببینم توش چجوریهsmiley

برای درک بیشتر باید یک فایل deb رو دانلود کنیم و بازش کنیم تا ببینیم داخلش چی هست. ابتدا میریم به سایت https://packages.ubuntu.com و فایل deb مربوط به نرم افزار gimp رو دانلود میکنیم.(مطابق عکس زیر).

 

 

دوستان، این سایت همون ریپازیتوری اوبونتو هست و تمام فایل های deb در این ادرس قرار دارن و نرم افزار apt هم برنامه هارو از این سایت دانلود میکنهwink

من "لینک دانلود فایل" رو هم براتون میزارم، (هرچند که بهتره خودتون طبق عکس بالایی برید و دانلودش کنید).

 

بعد از اینکه فایل رو دانلود کردید، روش کلیک راست کنید و گزینه ی Extract رو بزنید تا محتویات فایل deb اکسترکت بشه. (مطابق عکس زیر)

 

 

همونطور که در عکس می بینید، در داخل هر فایل deb، سه تا فایل وجود داره

 

۱- debian-binary

۲- control.tar.xz

۳- data.tar.xz

 

 

فایل اول، یک فایل متنی ساده هست. اگه توش رو باز کنید میبینید که ورژن گیمپ رو نوشته. فایل 2 و فایل 3 از نوع tar هستن. فایل تار هم دقیقا مثل deb، از نوع آرکایو هست. اون xz هم نشون دهنده ی این هست که این فایل تار، فشرده شده (compress).

 

نکته ی مهم اینجاست، تمام فایل های نرم افزار، توی data.tar.xz قرار دارن و باید به دایرکتوری روت کپی بشن. حالا ما میریم بازش کنیم. روی فایل کلیک راست میکنیم و گزینه ی Extract رو میزنیم تا محتویاتش بریزه بیرون.(مثل عکس زیر)

 

 

همونطور که میبینید، یک پوشه داره به نام usr (پوشه usr براتون آشناست؟). حالا اگه برید داخل usr میبیند که پوشه های متعدد وجود داره، ازجمله lib bin share

آیا این پوشه ها برای شما آشنا نیست؟smiley قبلا جایی ندیدشون؟smiley

بله، درست گفتیدsmiley این پوشه ها در دایرکتوری روت هم وجود دارن. این بدین معنی هست که، تمام فایل های نرم افزار gimp (که در این پوشه ها قرار دارند)، باید به همون دایرکتوری در روت کپی بشنsmiley

 

برای مثال بزارید بریم داخل bin

همونطور که میبینید، فایل اجرایی gimp در داخل bin هستش و پکیج منیجر میاد و تمام فایل های داخل bin رو به دایرکتوری user/bin/ کپی میکنهsmiley

 

 

حالا بریم سراغ فایل control.tar.xz

روی این فایل کلیک راست کنید و Extract رو بزنید تا محتویاتش بریزه بیرون(مطابق عکس زیر)

 

همونطور که میبنید، یه پوشه درست میشه به نام control که داخلش دوتا فایل متنی هست. یکی control و دیگری md5sums

 

تمام توضیحات مربوط به فایل gimp.deb در فایل control ذخیره شده. از جمله، نام، Version، Maintainer، دیپندنسی، description و سایر اطلاعات. پکیج منیجر از اینجا میفهمه که این پکیج ورژنش چند هست و چه دیپندنسی هایی دارهsmiley

 

به همین دلیل هست که وقتی شما برای مثال میخاید فایرفاکس رو نصب کنید، میبنید که پکیج منیجر میخاد ۱۰ تا پکیج دیگه رو هم به عنوان دیپندنسی نصب کنه، در واقع پکیج منیجر ابتدا میاد فایل control رو میخونه و از اینجا میفهمه که چه پکیج های دیگه ای رو هم باید نصب کنهsmiley

 

فایل md5sums هم کل فایل های نرم افزار gimp رو لیست کرده و همچنین کد هش (Hash) هر فایل رو هم اورده تا پکیج منیجر مطمعن بشه فایلی که داره کپی میکنه دقیقا همون فایل نرم افزار باشهsmiley در واقع نرم افزار apt با خوندن این فایل هست که میتونه بفهمه که کدوم فایل باید به کدوم دایرکتوری در روت کپی بشهsmiley

 

در مورد واژه ی پکیج هم یه توضیحی بدم. پکیج یه واژه ای هست که خیلی شنیده میشه. در واقع به فایل های deb tar rpm و به این قبیل فایل های آرکایو، در اصطلاح پکیج (package) گفته میشه. مثلا خارجیا اینجوری میگن، a deb package   an rpm package

پس وقتی یجایی میگن پکیج، منظور همین فایل های deb و rpm و tar هستش.

 

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

 

و در پایان، سه تا تمرین میخام بهتون بگم:

تمرین اول: برید فایل deb نرم افزار های firefox vlc gimp و هر نرم افزار دیگه ای رو که میشناسید بصورت دستی دانلود کنید تا ببینید اون نرم افزار ها چجوری نوشته شدن و از چه فایل هایی تشکیل شدنsmiley

 

تمرین دوم: برید داخل دایرکتوری روت و بصورت رندم و شانسی یک فایل رو انتخاب کنید و سعی کنید بفهمید که این فایل داخل کدوم deb بوده!!! (به عنوان راهنمایی میگم، از طریق دستورات apt میشه فهمید).

 

تمرین سوم: توی apt، بجای اینکه یک نرم افزار رو نصب کنید ( ینی بجای اینکه بزنید sudo apt-get install firefox و فایرفاکس نصب بشه)، بجاش کاری کنید که فایل deb فایرفاکس و دیپندنسی های اون فقط دانلود بشن و نصب نشن، و باید توی کامنت ها به من بگید که apt فایل های دب رو توی کدوم دایرکتوری دانلود میکنه ( راهنمایی: بازم از طریق دستورات apt باید اینکارو کنید)

 

 

خب این مقاله همینجا به پایان میرسه. من سعی کردم با زبانی ساده و روان توضیح بدم. به امید خدا در مقاله بعدی یه برنامه ساده با C میسازیم و براش پکیج درست میکنیم و بعدش پکیج رو نصب میکنیم. اگه مقاله به دردتون خورد حتما واسم کامنت بزارید. کامنت شما موجب دلگرمیه. اگه سوالی هم داشتید کامنت کنید.smiley

بدرود.

 

 

 

 

نظرات (۴)

عالی بود

پاسخ:
ممنون :)
تمرینات رو حتما انجام بدید

خیلی دقیق و روشن و  بدون هیچ ابهامی توضیح دادید. ممنون.

پاسخ:
خاهش میکنم :)

تمرین ها رو حتما انجام بدید و جوابشو تو کامنت برام بنویسید :)

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

پاسخ:
سلام به شما
خیلی خوشحالم که مطلبی که نوشتم رو دوست داشتید و تونسته به شما کمک بکنه :)
کامنت های شما مایه دلگرمی من هست و منو در آموزشه اندک چیزهایی که یاد گرفتم مشتاق تر میکنه :)
موفق باشی :)

آقا خیلی ممنون از مطلب عالی که نوشتی واقعا کارت درسته. من تازه وارد دنیای لینوکس شدم و برام خیلی لذت بخشه

پاسخ:
خواهش میکنم :)

ارسال نظر

ارسال نظر آزاد است، اما اگر قبلا در بیان ثبت نام کرده اید می توانید ابتدا وارد شوید.
شما میتوانید از این تگهای html استفاده کنید:
<b> یا <strong>، <em> یا <i>، <u>، <strike> یا <s>، <sup>، <sub>، <blockquote>، <code>، <pre>، <hr>، <br>، <p>، <a href="" title="">، <span style="">، <div align="">
تجدید کد امنیتی