
ویدیو مربوط به این مقاله: (کلیک کن)
تو ویندوز وقتی میخوای یه نرمافزار نصب کنی، معمولا میری یه فایل با پسوند exe یا msi دانلود میکنی. دابل کلیک میکنی، نصاب باز میشه، Next Next Finish، و برنامه آمادهست.
ولی لینوکس اینجوری نیست. هر توزیع، ساختار مخصوص خودش برای بستهبندی و نصب برنامهها داره.
در واقع توی لینوکس نرمافزارها معمولا به صورت Package (بسته) وجود دارن، نه یه فایل اجرایی تنها.
یه package یه جور جعبست که داخلش همهچیز برای نصب آمادست. مثال:
کد اجرایی، فایلهای تنظیمات، آیکنها، و توضیحاتی که سیستم بدونه چطوری باید نصبش کنه.
ریپوزیتوری (Repository) چیه؟
یه زمانی، وقتی تازه سیستمعاملهای شبهیونیکس (مثل لینوکس) شکل گرفته بودن، هرکی میخواست یه برنامه نصب کنه، باید میرفت سورسکدش رو از سایت سازنده دانلود میکرد، بعد دستی کامپایلش میکرد.
اینجا بود که لینوکس فهمید باید یه سیستم متمرکز برای مدیریت نرمافزارها بسازه. جایی که بشه گفت:
برو آخرین نسخهی فلان برنامه رو نصب کن و سیستم خودش همهچی رو از یه منبع امن و منظم بگیره.
اون منبع شد Repository.
درنهایت: ریپوزیتوری یا مخزن نرمافزار، یه جاییه که کلی برنامه و ابزار لینوکسی داخلش ذخیره شده. مثل یه فروشگاه آنلاینه، ولی بهجای لباس و خوراکی، توش نرمافزار هست. وقتی تو لینوکس میخوای یه برنامه نصب کنی، سیستم عامل میره سراغ ریپوزیتوری، بستهی موردنظر رو پیدا میکنه، دانلود میکنه و نصبش میکنه.
چرا ریپوزیتوری وجود داره؟ به چند دلیل مهم:
امنیت: فقط نرمافزارهای تاییدشده داخلش هستن
راحتی: نصب با یه دستور ساده انجام میشه
آپدیت سریع: همه برنامهها از یه جا آپدیت میشن
مدیریت وابستگیها: اگه یه برنامه نیاز به کتابخونه خاصی داشته باشه، خودش میره و نصبش میکنه
آیا همه توزیعها از یه Repository استفاده میکنن؟
هر خانواده از توزیع ها، ریپوزیتوریهای مخصوص خودش رو داره.
دلیلش هم اینه که هر توزیع ساختار بستهها، نسخهی هسته و حتی کتابخونههاش فرق داره.
بیا چندتا از معروفها رو بررسی کنیم:
Debian و خانوادهاش (Ubuntu، Linux Mint و غیره):
بستههاشون با پسوند .deb هست.
از سیستم APT (Advanced Package Tool) استفاده میکنن.
ریپوزیتوریهاشون معمولا توی /etc/apt/sources.list تعریف میشن.
Fedora، Red Hat و CentOS:
اینا از فرمت .rpm استفاده میکنن و ابزار DNF یا YUM رو دارن.
فایلهای ریپوزیتوریشون معمولا تو /etc/yum.repos.d/ هست.
ریپوزیتوری ها بصورت کلی به چند دسته تقسیم میشن:
Official repositories: توسط شرکت/تیم اصلی مدیریت میشن (امنترین)
Community repositories: ساختهشده توسط کاربران
Third-party repositories: برای نرمافزارهای خاص، مثل Google Chrome یا VSCode
Local repositories: شرکتها برای شبکه داخلی خودشون میسازن تا بدون اینترنت بسته نصب کنن
فرضا شرکت google اومده Google Chrome رو ساخته، در کنار بسته این نرمافزار، یک مخزن (Repository) هم ایجاد کرده و Google Chrome رو داخلش قرار داده. حالا آدرس این مخزن رو منتشر کرده تا هر کاربری که میخواد کروم رو روی لینوکسش نصب کنه، بیاد اون Repository رو به سیستمش اضافه کنه تا بتونه به واسطه اون، دانلود و نصب کنه! حالا این مدل Repository چون توسط تیم سازنده اون توزیع لینوکسی ساخته نشده، تو دسته Third-party repository قرار داره. یعنی یه شرکت دیگه برای نرمافزار خودش اومده اون رو ایجاد کرده.
و همچنین، به ریپوزیتوری هایی که خود تیم سازنده اون توزیع ساختن، Official repository گفته میشه.
خود Official repositories به چندتا دسته تقسیم میشه: (بیشتر تو Ubuntu)
main: نرمافزارهای رسمی و آزاد که مستقیما پشتیبانی میشن
restricted: نرمافزارهایی که آزاد نیستن ولی ضروریان (مثل درایور GPU)
universe: نرمافزارهای آزاد اما پشتیبانیشده توسط جامعه
multiverse: نرمافزارهای غیرآزاد که پشتیبانی رسمی ندارن (مثل کدکها)
مثلا مرورگر Firefox از main میاد، ولی VLC معمولا از universe.
همینطور که قبلتر گفته شد، توزیع debian و خانوادش از APT استفاده میکنن تا وصل بشن به Repository و کارهای مختلفی رو انجام بدن! از طرفی توزیع های Red Hat یا Fedora یا CentOS از DNF یا YUM استفاده میکنن.
اول با APT شروع کنیم...
APT یه مجموعه ابزار و دستور برای مدیریت بستهها تو Debian و خانوادشه. کارش اینه که:
به ریپوزیتوریها وصل بشه
بستهها رو دانلود کنه
وابستگیها (dependencies) رو به صورت خودکار پیدا و نصب کنه
آپدیتها رو مدیریت کنه
در واقع، APT یه مغز هوشمند برای سیستم بستهبندی .debـه.
برای نصب یک بسته (نرمافزار) هم میتونم مستقیما وصل بشم به ریپوزیتوری و دانلود/نصب کنم (حالت آنلاین) هم میتونم فایل نصبیش (package) رو دانلود کنم و بصورت محلی نصب کنم (حالت آفلاین)
برای کار با سیستم APT باید از دستور apt استفاده کنم. وقتی از دستور apt استفاده میکنم، سیستم عامل میره سراغ ریپوزیتوریهایی که توی فایل /etc/apt/sources.list تعریف شدن. اونجا دنبال بستهی موردنظر میگرده، وابستگیهاش رو بررسی میکنه، و همه رو نصب میکنه.
به این دستور دقت کن:
sudo apt update
APT اول از همه میره سراغ فایلهای /etc/apt/sources.list و /etc/apt/sources.list.d/
تو این فایلها آدرس همه ریپوزیتوریهایی که سیستم بهشون وصله نوشته شده.
APT یکییکی به همهی این repoها وصل میشه. فهرست کامل بستههای موجود تو تمام این repoها رو دانلود میکنه. مثلا اگه 5000 بسته توی repo باشه، APT میاد اسم، نسخه، توضیح و مسیر تمام این 5000 بسته رو میگیره و توی کش خودش ذخیره میکنه.
بعد از اینکه دستور sudo apt update رو وارد کردم و لیست پکیج ها بروزرسانی شد، میتونم بسته/نرمافزار مدنظرم رو نصب کنم. مثال:
sudo apt install vlc
بعد از وارد کردن این دستور، APT دیگه نمیره دنبال VLC بگرده! بلکه از کش مربوط به خودش میفهمه که VLC تو کدوم repo قرار داره، نسخش چیه، چه بستههایی نیاز داره و... درنهایت میره سراغ همون repo و فایل deb. رو دانلود و نصب میکنه.
پس همیشه یادتون باشه، قبل از نصب یک پکیج حتما دستور sudo apt update رو وارد کنید.
معرفی دیگر دستورات apt
apt full-upgrade یا apt dist-upgrade: این دستور میاد بستههای جدید که داخل repository هستن رو دانلود میکنه، و جایگزین نسخه قبلی داخل سیستم میکنه. این دستور میتونه بستههایی رو اضافه یا حذف کنه تا سیستم بصورت کامل آپدیت بشه.
apt remove package-name: حذف یه package از سیستم (فقط فایلهای اجراییش، نه تنظیماتش)
apt purge package-name: حذف کامل یه package به همراه تنظیمات و فایل های پیکربندیش.
apt autoremove: پاک کردن بسته های اضافی که خودشون نصب شدن ولی الان دیگه استفاده نمیشن.
apt search package-name: جستوجو بین package های موجود در repository های ثبت شده.
apt show package-name: نمایش اطلاعات کامل یه بسته (نسخه، توضیح، وابستگیها و...).
apt list --installed: نمایش بستههای نصب شده روی سیستم.
apt list --upgradable: بستههایی که آپدیت دارن.
apt edit-sources: بازکردن فایل sources.list توی ویرایشگر برای ویرایش مستقیم repoها.
apt download package-name: فقط فایل deb. اون بسته رو دانلود میکنه (بدون نصب).
حالا چطوری با فایل یک بسته رو نصب کنم؟
فرضا فایل زیر رو دارم:
code_1.84.2-1708327883_amd64.deb
برای نصب این بسته دو تا روش وجود داره. روش اول استفاده از apt عه:
sudo apt install ./code_1.84.2-1708327883_amd64.deb
تو این دستور apt وقتی فایل محلی رو بهش میدم، خودش میفهمه که کدوم بستهها رو باید از repo دانلود کنه تا وابستگیها کامل بشن.
روش دوم استفاده از dpkg عه:
sudo dpkg -i ./code_1.84.2-1708327883_amd64.deb
دستور dpkg وابستگیها رو بررسی نمیکنه.
با APT آشنا شدیم! بریم سراغ DNF و YUM...
سال 1993، یه شرکت به اسم Red Hat Software تأسیس شد. Red Hat تصمیم گرفت یه توزیع لینوکس بسازه که برای شرکتها و سرورها قابل اعتماد باشه. اسم اون شد Red Hat Linux
تا حدود سال 2003، این توزیع خیلی معروف شد، مخصوصا بین مدیران شبکه و شرکتها، ولی یه مشکل پیش اومد!
کاربران خونگی میخواستن با نسخهی رایگانش کار کنن، در حالی که شرکتها پشتیبانی حرفهای میخواستن (با قرارداد و پشتیبانی فنی و طول عمر بالا).
در سال 2003، Red Hat تصمیم گرفت پروژش رو به دو شاخه تقسیم کنه:
Red Hat Enterprise Linux (RHEL): نسخهی تجاری (Enterprise) برای شرکتها، با پشتیبانی رسمی، تستهای سنگین و آپدیتهای کنترلشده. این نسخه پولیه و تمرکزش روی پایداریه، نه جدید بودن.
Fedora Project: یه نسخهی رایگان، باز و سریعالانتشار برای توسعهدهندهها و جامعهی کاربری. هدفش آزمایش فناوریهای جدید قبل از اینکه وارد RHEL بشن. بهزبان سادهتر: Fedora شد آزمایشگاه Red Hat و RHEL شد محصول نهایی و پایدارِ اون آزمایشها.
درنهایت: Fedora همیشه از نظر تکنولوژی جلوتر از RHEL هست.
چون RHEL پولیه، بعضی گروهها اومدن نسخههای رایگان و بازسازیشدهی RHEL رو ساختن:
CentOS (قدیمیترین، الان تبدیل شده به CentOS Stream)
Rocky Linux
AlmaLinux
اینا دقیقا از سورسکد RHEL ساخته شدن اما رایگان و بدون پشتیبانی.
جمع بندی: اول Red Hat Linux بود. از دلش Fedora و RHEL متولد شدن. و از دل RHEL هم CentOS و Rocky و Alma اومدن.
و اما...
سالهای اول لینوکس، هر توزیع خودش یه جور بستهبندی داشت. Red Hat اومد و یه فرمت استاندارد ساخت به اسم: RPM یا Red Hat Package Manager
RPM چی بود؟ یه فایل بستهبندیشده rpm. بود، شبیه فایل exe در ویندوز. داخلش فقط برنامه نبود، بلکه مسیر نصب، نسخه، توضیحات و وابستگیها (dependencies) هم تعریف شده بود.
RPM خودش نمیتونست وابستگیها رو حل کنه. مثلا اگه میخواستی Firefox نصب کنی و اون به libX11 نیاز داشت، RPM خطا میداد و باید دستی میرفتی اون بسته رو پیدا میکردی و نصبش میکردی.
یه دانشگاهی پیشنهاد داد که: بیاید یه مغز هوشمند برای RPM بسازیم که خودش وابستگیها رو پیدا و نصب کنه! نتیجش شد YUM یا Yellowdog Updater, Modified.
YUM چی کار میکرد؟ میرفت ریپوزیتوریها (repositories) رو چک میکرد.
متادیتای بستهها رو دانلود میکرد (لیست همه بستهها، نسخهها، وابستگیها).
وقتی یه برنامه میخواستی نصب کنی، خودش تمام وابستگیها رو پیدا و نصب میکرد.
برنامه نصب میشد، اطلاعاتش تو دیتابیس سیستم ثبت میشد.
با بزرگتر شدن Fedora و RHEL، مشکلات YUM خودش رو نشون دادن:
سرعت پایین
مصرف زیاد رم
مشکلات در حل وابستگیهای پیچیده
کدنویسی قدیمی با Python 2
Fedora گفت بیاید یه YUM جدید بسازیم، سریعتر و دقیقتر و مدرنتر. نتیجه شد DNF یا Dandified YUM
تفاوتها و مزیتها:
سرعت خیلی بهتر
کش بهینهتر
Rollback بهتر (میتونه بستهها رو به حالت قبل برگردونه)
استفاده از Python 3
API برای برنامهنویسها
معرفی دستورات کاربردی DNF
dnf install firefox: نصب برنامه مدنظر.
dnf remove firefox: حذف برنامه مدنظر.
dnf check-update: بررسی آپدیت ها.
dnf upgrade یا dnf update: آپدیت کل سیستم.
dnf search vlc: جستوجوی بستهها.
dnf list installed: لیست بستههای نصب شده.
dnf autoremove: حذف بستههای اضافی و بلااستفاده.
dnf clean all: پاک کردن کش.
dnf history: سابقه نصب و حذفها.
dnf download firefox: دانلود بدون نصب.
من فرضا فایل rpm. یک برنامهایی رو دارم! چطور بصورت محلی نصبش کنم؟ روش اول:
sudo rpm -i firefox-115.0-1.x86_64.rpm
سوئیچ i یعنی install. این دستور package رو نصب میکنه اما وابستگیها رو خودش حل نمیکنه. روش دوم:
sudo dnf install ./firefox-115.0-1.x86_64.rpm
تو این روش وابستگیها هم دانلود و نصب میشه.