فصل ۱۴ – مدیریت بستهها
اگر مدتی را در جامعهٔ لینوکس بگذرانیم، حتماً با دیدگاههای گوناگونی دربارهٔ اینکه «کدام توزیع لینوکس بهترین است» روبهرو میشویم. این بحثها گاهی بسیار سطحی میشوند و مثلاً به رنگ پسزمینهٔ دسکتاپ یا تم پیشفرض اوبونتو گیر میدهند! در حالیکه مهمترین عامل تعیینکنندهٔ کیفیت یک توزیع، سیستم بستهبندی (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)
بیشتر بستهها توسط شرکت یا تیم توسعهدهندهٔ توزیع ساخته و در مخازن مرکزی قرار میگیرند؛ جایی که هزاران بسته برای نصب در دسترس کاربران آن توزیع قرار دارد.
معمولاً هر توزیع چند نوع مخزن دارد، مانند:
- testing (آزمایشی): شامل بستههای تازهساختهشده که هنوز در مرحلهٔ تست هستند.
- development (توسعه): شامل بستههای در حال کار که برای نسخهٔ بعدی توزیع آماده میشوند.
برخی توزیعها همچنین از مخازن شخص ثالث (third-party) پشتیبانی میکنند؛ مثلاً برای نرمافزارهایی که بهدلیل محدودیتهای قانونی (مثل حق ثبت اختراع یا DRM) نمیتوانند در مخزن اصلی باشند. نمونهٔ معروف آن پشتیبانی از DVD رمزگذاریشده است که در ایالات متحده قانونی نیست. این مخازن معمولاً در کشورهای دیگر اداره میشوند و برای استفاده از آنها باید بهصورت دستی در فایل تنظیمات سیستم بسته اضافه شوند.
وابستگیها (Dependencies)
برنامهها معمولاً مستقل عمل نمیکنند و به سایر مؤلفههای نرمافزاری وابستهاند. بسیاری از قابلیتهای مشترک (مثل ورودی/خروجی) توسط کتابخانههای اشتراکی (shared libraries) فراهم میشود.
اگر بستهای به یک منبع اشتراکی نیاز داشته باشد، میگوییم وابستگی (dependency) دارد. سیستمهای مدرن مدیریت بسته، مکانیزمهایی برای حل وابستگیها (dependency resolution) دارند تا هنگام نصب یک بسته، تمام اجزای موردنیاز آن بهصورت خودکار نصب شوند.
ابزارهای سطح بالا و پایین در مدیریت بستهها
سیستمهای مدیریت بسته معمولاً از دو نوع ابزار تشکیل شدهاند:
- ابزارهای سطح پایین (Low-Level Tools): کارهایی مانند نصب، حذف یا باز کردن بستهها را مستقیماً انجام میدهند.
- ابزارهای سطح بالا (High-Level Tools): وظایفی مثل جستجوی متادیتا، بررسی وابستگیها و بهروزرسانی خودکار بستهها را مدیریت میکنند.
در این فصل، ابزارهای مورد استفاده در سیستمهای سبک دبیان (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) تبدیل میشوند.
بهطور کلی در لینوکس چیزی به نام «دیسک درایور» وجود ندارد؛ یا هسته از آن دستگاه پشتیبانی میکند یا خیر.
و در واقع، هستهٔ لینوکس تعداد بسیار بیشتری از دستگاهها را نسبت به ویندوز پشتیبانی میکند.
اما اگر دستگاه شما پشتیبانی نشود، یکی از سه علت زیر را دارد:
سه دلیل اصلی برای نبود درایور
-
دستگاه خیلی جدید است.
بسیاری از شرکتهای سختافزاری از توسعهٔ درایور برای لینوکس پشتیبانی رسمی نمیکنند.
در این موارد، اعضای جامعهٔ لینوکس خودشان باید درایور را بنویسند — کاری که زمان میبرد. -
دستگاه خیلی خاص یا ناشناخته است.
هر توزیع، هستهٔ مخصوص خودش را میسازد و ممکن است برخی درایورها را کنار گذاشته باشد.
با پیدا کردن کد منبع درایور، شما (بله خود شما) میتوانید آن را کامپایل و نصب کنید.
این کار چندان دشوار نیست، ولی نیازمند دقت و چند مرحلهٔ فنی است (در فصلهای بعد دربارهٔ کامپایل نرمافزار صحبت خواهد شد). -
سازنده در حال پنهانکاری است.
اگر شرکت سازنده نه کد منبع درایور را منتشر کرده باشد و نه مستندات فنی برای توسعهدهندگان ارائه دهد، یعنی قصد دارد رابطهای سختافزار را مخفی نگه دارد.
چنین سختافزاری در دنیای آزاد لینوکس جایی ندارد؛ پیشنهاد نویسنده روشن است:
«این قطعه را از سیستمتان جدا کنید و همراه با وسایل بیفایدهٔ دیگر به سطل زباله بیندازید.»
مطالعهی بیشتر (Further Reading)
برای درک بهتر سیستم مدیریت بسته در توزیع خود، وقت بگذارید و مستندات آن را بخوانید.
همچنین منابع زیر میتوانند مفید باشند:
-
سؤالات متداول دبیان (Debian FAQ) در مورد مدیریت بستهها:
http://www.debian.org/doc/FAQ/ch-pkgtools.en.html -
صفحهٔ رسمی پروژهٔ RPM:
http://www.rpm.org -
صفحهٔ رسمی پروژهٔ YUM در دانشگاه Duke:
http://linux.duke.edu/projects/yum/ -
مقالهای در ویکیپدیا دربارهٔ متادیتا (Metadata):
http://en.wikipedia.org/wiki/Metadata