فصل ۱۴ – مدیریت بسته‌ها

اگر مدتی را در جامعهٔ لینوکس بگذرانیم، حتماً با دیدگاه‌های گوناگونی دربارهٔ این‌که «کدام توزیع لینوکس بهترین است» روبه‌رو می‌شویم. این بحث‌ها گاهی بسیار سطحی می‌شوند و مثلاً به رنگ پس‌زمینهٔ دسکتاپ یا تم پیش‌فرض اوبونتو گیر می‌دهند! در حالی‌که مهم‌ترین عامل تعیین‌کنندهٔ کیفیت یک توزیع، سیستم بسته‌بندی (Package System) و پویایی جامعهٔ پشتیبان آن است.

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


مدیریت بسته چیست؟

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

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


سیستم‌های بسته‌بندی

هر توزیع لینوکس سیستم بسته‌بندی خاص خود را دارد، و به‌طور کلی بسته‌ای که برای یک توزیع ساخته شده با توزیع دیگر سازگار نیست. بیشتر توزیع‌ها در دو خانوادهٔ اصلی جای می‌گیرند:

سیستم بسته‌بندی نمونه توزیع‌ها
سبک Debian (.deb) Debian، Ubuntu، Xandros، Linspire
سبک Red Hat (.rpm) Fedora، CentOS، RHEL، OpenSUSE، Mandriva، PCLinuxOS

البته توزیع‌هایی مانند Gentoo، Slackware و Foresight از سیستم‌های متفاوتی استفاده می‌کنند.


نحوهٔ کار یک سیستم بسته‌بندی

در نرم‌افزارهای تجاری معمولاً کاربر باید دیسک نصب را خریداری کرده و برنامهٔ نصاب (wizard) را اجرا کند.
اما در لینوکس تقریباً تمام نرم‌افزارها از اینترنت دریافت می‌شوند. بیشتر آن‌ها توسط توزیع ارائه می‌شوند و باقی به صورت کد منبع برای نصب دستی در دسترس‌اند.


فایل‌های بسته (Package Files)

واحد پایهٔ نرم‌افزار در سیستم بسته‌بندی، فایل بسته است. این فایل مجموعه‌ای فشرده از فایل‌هایی است که برنامه را تشکیل می‌دهند. هر بسته ممکن است شامل چندین برنامه و داده‌های پشتیبان آن‌ها باشد.
به‌علاوه، فایل بسته شامل متاداده‌ها (مثل توضیحات، نسخه، وابستگی‌ها) و اسکریپت‌های پیش‌از‌نصب و پس‌از‌نصب است که وظایف پیکربندی را انجام می‌دهند.

فایل بسته توسط فردی به‌نام نگه‌دارندهٔ بسته (Package Maintainer) ساخته می‌شود. او کد منبع را از توسعه‌دهندهٔ اصلی دریافت کرده، آن را کامپایل می‌کند، و متاداده‌ها و اسکریپت‌ها را اضافه می‌نماید. گاهی برای بهبود سازگاری با بقیهٔ اجزای توزیع، تغییراتی نیز در کد منبع ایجاد می‌کند.


مخازن (Repositories)

بیشتر بسته‌ها توسط شرکت یا تیم توسعه‌دهندهٔ توزیع ساخته و در مخازن مرکزی قرار می‌گیرند؛ جایی که هزاران بسته برای نصب در دسترس کاربران آن توزیع قرار دارد.

معمولاً هر توزیع چند نوع مخزن دارد، مانند:

برخی توزیع‌ها همچنین از مخازن شخص ثالث (third-party) پشتیبانی می‌کنند؛ مثلاً برای نرم‌افزارهایی که به‌دلیل محدودیت‌های قانونی (مثل حق ثبت اختراع یا DRM) نمی‌توانند در مخزن اصلی باشند. نمونهٔ معروف آن پشتیبانی از DVD رمزگذاری‌شده است که در ایالات متحده قانونی نیست. این مخازن معمولاً در کشورهای دیگر اداره می‌شوند و برای استفاده از آن‌ها باید به‌صورت دستی در فایل تنظیمات سیستم بسته اضافه شوند.


وابستگی‌ها (Dependencies)

برنامه‌ها معمولاً مستقل عمل نمی‌کنند و به سایر مؤلفه‌های نرم‌افزاری وابسته‌اند. بسیاری از قابلیت‌های مشترک (مثل ورودی/خروجی) توسط کتابخانه‌های اشتراکی (shared libraries) فراهم می‌شود.

اگر بسته‌ای به یک منبع اشتراکی نیاز داشته باشد، می‌گوییم وابستگی (dependency) دارد. سیستم‌های مدرن مدیریت بسته، مکانیزم‌هایی برای حل وابستگی‌ها (dependency resolution) دارند تا هنگام نصب یک بسته، تمام اجزای موردنیاز آن به‌صورت خودکار نصب شوند.


ابزارهای سطح بالا و پایین در مدیریت بسته‌ها

سیستم‌های مدیریت بسته معمولاً از دو نوع ابزار تشکیل شده‌اند:

در این فصل، ابزارهای مورد استفاده در سیستم‌های سبک دبیان (Debian-style) مثل اوبونتو و ابزارهای سبک ردهت (Red Hat-style) بررسی می‌شوند. همهٔ توزیع‌های خانوادهٔ ردهت از برنامهٔ سطح پایین rpm استفاده می‌کنند، اما ابزارهای سطح بالای متفاوتی دارند. در این‌جا تمرکز ما بر روی yum خواهد بود که در Fedora، Red Hat Enterprise Linux و CentOS به کار می‌رود.


جدول ۱۴-۲: ابزارهای مدیریت بسته در توزیع‌های مختلف

توزیع‌ها ابزارهای سطح پایین ابزارهای سطح بالا
سبک دبیان dpkg apt-get، aptitude
فدورا، ردهت، CentOS rpm yum

وظایف رایج در مدیریت بسته‌ها

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

در توضیحات زیر، منظور از package_name نام خود بسته است (مثلاً emacs)، و package_file نام فایل حاوی آن (مثلاً emacs_1.2.3.deb یا emacs-1.2.3.rpm).


یافتن یک بسته در مخزن

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

جدول ۱۴-۳: دستورات جستجوی بسته

سبک دستور(ها)
Debian apt-get update
apt-cache search search_string
Red Hat yum search search_string

نمونه:
برای جستجوی ویرایشگر متن emacs در مخزن yum، دستور زیر استفاده می‌شود:

yum search emacs

نصب یک بسته از مخزن

ابزارهای سطح بالا امکان دانلود و نصب بسته‌ها را از مخازن با درنظرگرفتن تمام وابستگی‌ها فراهم می‌کنند.

جدول ۱۴-۴: دستورات نصب بسته

سبک دستور(ها)
Debian
apt-get update
apt-get install package_name
Red Hat
yum install package_name

نمونه:
برای نصب ویرایشگر emacs از مخزن apt، دستور زیر اجرا می‌شود:

apt-get update; apt-get install emacs

نصب بسته از روی فایل (Package File Installation)

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

جدول ۱۴-۵: دستورات نصب بسته با ابزار سطح پایین

سبک دستور(ها)
Debian dpkg --install package_file
Red Hat rpm -i package_file

نمونه:
اگر فایل بسته‌ای با نام emacs-22.1-7.fc7-i386.rpm از سایتی خارج از مخزن رسمی دانلود شده باشد، با دستور زیر نصب می‌شود:

rpm -i emacs-22.1-7.fc7-i386.rpm

توجه:
در این روش از ابزار سطح پایین rpm برای نصب استفاده می‌شود و بنابراین هیچ‌گونه حل وابستگی (dependency resolution) انجام نمی‌گیرد.
اگر rpm تشخیص دهد بسته‌ای که نیاز است وجود ندارد، عملیات نصب را با خطا متوقف می‌کند.


حذف بسته‌ها (Removing a Package)

برای حذف یک بسته می‌توان از ابزارهای سطح پایین یا سطح بالا استفاده کرد. در عمل، ابزارهای سطح بالا کاربردی‌تر هستند زیرا وابستگی‌ها و وضعیت سیستم را نیز در نظر می‌گیرند.

جدول ۱۴-۶: دستورات حذف بسته

سبک دستور(ها)
Debian apt-get remove package_name
Red Hat yum erase package_name

نمونه:
برای حذف بستهٔ emacs از یک سیستم سبک دبیان:

apt-get remove emacs

به‌روزرسانی بسته‌ها از مخزن (Updating Packages from a Repository)

رایج‌ترین وظیفه در مدیریت بسته‌ها، به‌روزرسانی سیستم با آخرین نسخه‌های موجود است. ابزارهای سطح بالا این کار را تنها با یک یا دو دستور انجام می‌دهند.

جدول ۱۴-۷: دستورات به‌روزرسانی بسته‌ها

سبک دستور(ها)
Debian apt-get update; apt-get upgrade
Red Hat yum update

نمونه:
برای اعمال به‌روزرسانی‌های در دسترس در سیستم سبک دبیان:

apt-get update; apt-get upgrade

ارتقای بسته از روی فایل (Upgrading a Package from a File)

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

جدول ۱۴-۸: دستورات ارتقای بسته با ابزار سطح پایین

سبک دستور(ها)
Debian dpkg --install package_file
Red Hat rpm -U package_file

نمونه:
برای ارتقای بستهٔ emacs به نسخهٔ جدیدتر در یک سیستم سبک ردهت:

rpm -U emacs-22.1-7.fc7-i386.rpm

نکته:
در حالی‌که ابزار rpm دستور ویژه‌ای برای ارتقا (Upgrade) دارد (-U)، ابزار dpkg چنین گزینه‌ای ندارد و همان دستور نصب (--install) برای هر دو کاربرد استفاده می‌شود.


فهرست‌کردن بسته‌های نصب‌شده (Listing Installed Packages)

برای مشاهده‌ی فهرست تمام بسته‌هایی که روی سیستم نصب شده‌اند، می‌توان از دستورات زیر استفاده کرد:

جدول ۱۴-۹: دستورات نمایش فهرست بسته‌ها

سبک دستور(ها)
Debian dpkg --list
Red Hat rpm -qa

بررسی نصب بودن یک بسته (Determining if a Package is Installed)

برای فهمیدن اینکه آیا یک بستهٔ مشخص روی سیستم نصب شده است یا نه، ابزارهای سطح پایین دستورهای زیر را ارائه می‌کنند:

جدول ۱۴-۱۰: دستورات بررسی وضعیت بسته

سبک دستور(ها)
Debian dpkg --status package_name
Red Hat rpm -q package_name

نمونه:
برای بررسی اینکه بستهٔ emacs در سیستم دبیان نصب شده یا نه:

dpkg --status emacs

مشاهده‌ی اطلاعات یک بسته‌ی نصب‌شده (Displaying Info About an Installed Package)

اگر نام بسته‌ای که از قبل نصب شده را بدانیم، می‌توانیم توضیحات و مشخصات آن را با دستورات زیر ببینیم:

جدول ۱۴-۱۱: دستورات نمایش اطلاعات بسته

سبک دستور(ها)
Debian apt-cache show package_name
Red Hat yum info package_name

نمونه:
برای مشاهده‌ی توضیحات بستهٔ emacs در سیستم دبیان:

apt-cache show emacs

شناسایی بسته‌ای که یک فایل را نصب کرده است (Finding Which Package Installed a File)

برای فهمیدن اینکه کدام بسته مسئول نصب یک فایل خاص بوده، می‌توان از دستورات زیر استفاده کرد:

جدول ۱۴-۱۲: دستورات شناسایی بسته بر اساس فایل

سبک دستور(ها)
Debian dpkg --search file_name
Red Hat rpm -qf file_name

نمونه:
برای تشخیص اینکه فایل /usr/bin/vim توسط کدام بسته روی سیستم ردهت نصب شده است:

rpm -qf /usr/bin/vim

جمع‌بندی (Summing Up)

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

با این درک تازه از مدیریت بسته‌ها (Package Management)، می‌توانیم با اطمینان کامل نرم‌افزارهای موردنیاز خود را نصب، به‌روزرسانی و مدیریت کنیم — بدون آنکه در پیچیدگی‌های وابستگی‌ها و نسخه‌ها گرفتار شویم.


افسانه‌ی سخت بودن نصب نرم‌افزار در لینوکس (The Linux Software Installation Myth)

افرادی که از سیستم‌عامل‌های دیگر به لینوکس مهاجرت می‌کنند، گاهی گرفتار این تصور اشتباه می‌شوند که نصب نرم‌افزار در لینوکس دشوار است یا تنوع سیستم‌های بسته‌بندی بین توزیع‌های مختلف مانع بزرگی است.
در واقع این تنوع شاید برای شرکت‌های نرم‌افزاری تجاری که فقط نسخهٔ دودویی (binary-only) از نرم‌افزارهای بسته و محرمانه‌ی خود را منتشر می‌کنند دردسر باشد، اما برای کاربران لینوکس نه‌تنها مانع نیست بلکه یک مزیت است.


فلسفه‌ی متن‌باز و یکپارچگی نرم‌افزارها

اکوسیستم نرم‌افزاری لینوکس بر پایه‌ی ایده‌ی متن‌باز بودن (Open Source) ساخته شده است.
اگر توسعه‌دهنده‌ای کد منبع برنامه‌اش را منتشر کند، معمولاً یکی از اعضای جامعهٔ توزیع‌ها آن را بسته‌بندی کرده و در مخزن رسمی توزیع خود قرار می‌دهد.
این روش باعث می‌شود که برنامه:

در نتیجه، نصب نرم‌افزار در لینوکس شبیه یک فروشگاه متمرکز نرم‌افزار (one-stop shop) است.


درایورها در لینوکس

درایورهای سخت‌افزار نیز تقریباً به همین شکل مدیریت می‌شوند.
به‌جای اینکه هر سخت‌افزار دیسک جداگانه‌ای برای درایور داشته باشد، درایورها به بخشی از هستهٔ لینوکس (Linux kernel) تبدیل می‌شوند.

به‌طور کلی در لینوکس چیزی به نام «دیسک درایور» وجود ندارد؛ یا هسته از آن دستگاه پشتیبانی می‌کند یا خیر.
و در واقع، هستهٔ لینوکس تعداد بسیار بیشتری از دستگاه‌ها را نسبت به ویندوز پشتیبانی می‌کند.
اما اگر دستگاه شما پشتیبانی نشود، یکی از سه علت زیر را دارد:


سه دلیل اصلی برای نبود درایور

  1. دستگاه خیلی جدید است.
    بسیاری از شرکت‌های سخت‌افزاری از توسعهٔ درایور برای لینوکس پشتیبانی رسمی نمی‌کنند.
    در این موارد، اعضای جامعهٔ لینوکس خودشان باید درایور را بنویسند — کاری که زمان می‌برد.

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

  3. سازنده در حال پنهان‌کاری است.
    اگر شرکت سازنده نه کد منبع درایور را منتشر کرده باشد و نه مستندات فنی برای توسعه‌دهندگان ارائه دهد، یعنی قصد دارد رابط‌های سخت‌افزار را مخفی نگه دارد.
    چنین سخت‌افزاری در دنیای آزاد لینوکس جایی ندارد؛ پیشنهاد نویسنده روشن است:
    «این قطعه را از سیستم‌تان جدا کنید و همراه با وسایل بی‌فایدهٔ دیگر به سطل زباله بیندازید.»


مطالعه‌ی بیشتر (Further Reading)

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