دسته بندی:

آموزش کار با yum و dnf؛ راهنمای کامل مدیریت بسته در لینوکس

آموزش کار با yum و dnf؛ راهنمای کامل مدیریت بسته در لینوکس

حدود ۱۲ دقیقه مطالعه

به یک سرور CentOS، AlmaLinux یا Rocky Linux وصل شده‌اید و باید یک بسته را نصب، حذف یا به‌روزرسانی کنید. ابزار این کار yum است؛ همان مدیر بسته‌ای که سال‌ها روی هر سرور RPM-Based دیده می‌شد و امروز روی توزیع‌های جدید زیر نام dnf ادامه پیدا کرده است. در ادامه هم دستورهای روزمره را می‌بینید و هم تفاوت‌هایی که اگر ندانید، همان دستور همیشگی روی سرور جدید نتیجه‌ای غیرمنتظره می‌دهد.

yum چیست و چه کاری انجام می‌دهد؟

yum مخفف Yellowdog Updater Modified است و یک مدیریت بسته (Package Manager) برای توزیع‌های RPM-Based محسوب می‌شود؛ یعنی خانواده Red Hat Enterprise Linux، CentOS، Fedora، AlmaLinux، Rocky Linux و Oracle Linux.

yum یک دستور خط فرمانی است که می‌تواند بسته‌های مورد نیاز را از مخازنی (Repository) که روی سیستم فعال هستند نصب، حذف یا آپدیت کند. هوشمندی اصلی آن در مدیریت پیش‌نیازهاست: هنگام نصب یک بسته، ابتدا پیش‌نیازهای آن (dependencies) را در صورت وجود پیدا و نصب می‌کند و در مرحله بعد سراغ خود بسته اصلی می‌رود. تفاوت آن با دستور rpm دقیقاً همین‌جاست: rpm فقط یک فایل مشخص را نصب می‌کند و اگر پیش‌نیازی کم باشد صرفاً خطا می‌دهد، اما yum می‌رود و آن پیش‌نیاز را از مخزن می‌آورد.

برای کار با yum باید دسترسی کاربر root را در اختیار داشته باشید. روش قدیمی این بود که یک ترمینال (terminal) باز کنید و مستقیم با کاربر root لاگین کنید، اما روش امن‌تر و امروزی این است که با کاربر عادی وارد شوید و دستور را با sudo اجرا کنید:

sudo yum install httpd

همچنین اگر مخازن اینترنتی روی سیستم شما فعال باشند (که حالت پیش‌فرض است) برای کار با yum باید به اینترنت دسترسی داشته باشید.

برخی از ویژگی‌های مدیریت بسته yum

  • پشتیبانی و استفاده از چند مخزن به‌طور هم‌زمان
  • پیکربندی ساده
  • تشخیص خودکار پیش‌نیازها
  • سازگاری کامل با بسته‌های RPM
  • قابلیت نصب گروهی بسته‌ها
  • رابط کاربری ساده و قابل پیش‌بینی
  • پشتیبانی از پلاگین‌های مختلف

یک نکته صادقانه درباره «سرعت»: yum کلاسیک در حل وابستگی‌ها کند بود و همین یکی از دلایل اصلی ساخته شدن dnf شد. dnf از کتابخانه libsolv برای حل وابستگی استفاده می‌کند و محسوس‌تر سریع‌تر است.

yum یا dnf؟ وضعیت امروز توزیع‌های RPM

متن‌های قدیمی می‌گویند «yum مدیر بسته پیش‌فرض فدوراست». این جمله دیگر درست نیست و مهم‌ترین نکته‌ای است که باید بدانید:

  • Fedora: از نسخه ۲۲ به بعد، dnf جای yum را به‌عنوان مدیر بسته پیش‌فرض گرفته است.
  • RHEL 6/7 و CentOS 6/7: اینجا yum واقعی و اصلی اجرا می‌شود. توجه کنید که CentOS 7 در ۳۰ ژوئن ۲۰۲۴ به پایان پشتیبانی (EOL) رسید و دیگر به‌روزرسانی امنیتی دریافت نمی‌کند.
  • RHEL 8/9، AlmaLinux، Rocky Linux و Oracle Linux 8 به بعد: مدیر بسته واقعی dnf است و yum فقط یک symlink به dnf است که برای سازگاری با اسکریپت‌ها و آموزش‌های قدیمی نگه داشته شده.

برای اینکه بدانید روی کدام سیستم هستید:

cat /etc/os-release
ls -l /usr/bin/yum

اگر خروجی دستور دوم چیزی شبیه /usr/bin/yum -> dnf-3 باشد، شما در عمل دارید dnf را صدا می‌زنید. خبر خوب این است که تقریباً همه دستورهای این مقاله با هر دو کار می‌کنند و کافی است yum را با dnf جایگزین کنید. در تازه‌ترین نسخه‌ها نسل جدید dnf (با نام dnf5) جایگزین شده، اما نام دستوری که تایپ می‌کنید همچنان dnf است.

پیش‌نیازهای کار با yum

  • دسترسی root یا کاربری با مجوز sudo.
  • مشخص بودن توزیع و نسخه سیستم‌عامل (خروجی /etc/os-release).
  • دسترسی شبکه به مخازن فعال.
  • فضای خالی کافی روی پارتیشن /var، چون کش بسته‌ها و دیتابیس RPM آنجا هستند. با df -h /var بررسی کنید.
  • برای به‌روزرسانی‌های بزرگ روی سرور تولیدی: یک نسخه پشتیبان یا اسنپ‌شات تازه.

نصب بسته با yum

yum install package
yum install package1 package2 package3
yum -y install package

دستور اول یک بسته را نصب می‌کند، دستور دوم چند بسته را هم‌زمان و در قالب یک تراکنش نصب می‌کند و سوییچ -y یعنی همه سؤال‌های تأیید به‌طور خودکار «بله» پاسخ داده شوند. -y برای اسکریپت‌ها لازم است، اما روی سرور زنده آن را عادت نکنید؛ درست همان لحظه‌ای که باید فهرست تغییرات را بخوانید، آن را از شما پنهان می‌کند.

نصب یک فایل RPM محلی به‌همراه پیش‌نیازهایش:

yum localinstall ./package.rpm     # روش قدیمی در CentOS/RHEL 7
dnf install ./package.rpm          # روش امروزی در AlmaLinux/Rocky/RHEL 8+

اگر فایل‌های یک بسته خراب شده‌اند، به‌جای حذف و نصب دوباره از yum reinstall package استفاده کنید. برای اطمینان از نتیجه هم:

rpm -q package
systemctl status httpd

حذف بسته

yum remove package
yum erase package     # هم‌معنی remove

قبل از تأیید، حتماً فهرست بسته‌هایی را که yum قصد حذفشان را دارد بخوانید. حذف یک کتابخانه ظاهراً بی‌اهمیت می‌تواند httpd، php یا حتی بخشی از سیستم را با خودش ببرد. این خطرناک‌ترین جایی است که استفاده از -y می‌تواند سرور را از دسترس خارج کند.

برای پاک کردن پیش‌نیازهایی که دیگر هیچ بسته‌ای به آن‌ها نیاز ندارد:

yum autoremove

خروجی این دستور را هم پیش از تأیید بررسی کنید؛ اگر بسته‌ای در گذشته به‌عنوان وابستگی نصب شده ولی امروز شما مستقیماً به آن نیاز دارید، در فهرست حذف ظاهر می‌شود. روی سرورهای قدیمی CentOS/RHEL 7 با autoremove محتاط‌تر باشید: yum کلاسیک برای بسته‌هایی که پیش از فعال شدن این قابلیت نصب شده‌اند «دلیل نصب» درستی ثبت نکرده و ممکن است فهرست حذف غیرمنتظره بلند شود. هرگز آن را با -y اجرا نکنید.

به‌روزرسانی بسته‌ها

yum check-update          # فقط نمایش آپدیت‌های موجود، بدون تغییر
yum update package        # آپدیت یک بسته
yum update                # آپدیت کل سیستم
yum -y update package     # آپدیت بدون نیاز به تأیید

دستور check-update اگر آپدیتی موجود باشد کد خروج ۱۰۰ و اگر چیزی نباشد کد ۰ برمی‌گرداند؛ برای مانیتورینگ و اسکریپت‌نویسی مفید است.

درباره تفاوت update و upgrade: در yum کلاسیک، yum upgrade معادل yum update --obsoletes بود، یعنی بسته‌های منسوخ‌شده را هم با جایگزین‌هایشان عوض می‌کرد. در dnf این تفاوت برداشته شده و update صرفاً نام مستعار upgrade است.

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

yum update --exclude='kernel*'

الگو را حتماً داخل کوتیشن بگذارید؛ اگر kernel* را بدون کوتیشن بنویسید و در مسیر جاری فایلی با همین نام وجود داشته باشد، پوسته آن را قبل از رسیدن به yum بازنویسی می‌کند و استثنا اعمال نمی‌شود.

برای دائمی کردن این استثنا، خط exclude= را در /etc/yum.conf (یا /etc/dnf/dnf.conf در نسخه‌های جدید) قرار دهید. برای قفل کردن نسخه یک بسته هم افزونه versionlock وجود دارد.

هسته (kernel) رفتار ویژه‌ای دارد: به‌جای جایگزینی، در کنار هسته قبلی نصب می‌شود و تعداد هسته‌های نگه‌داشته‌شده با پارامتر installonly_limit کنترل می‌شود. آپدیت هسته تا زمانی که سرور ریبوت نشود اثر نمی‌کند. برای اینکه بدانید ریبوت لازم است یا نه، بسته yum-utils / dnf-utils را نصب کنید و اجرا کنید:

needs-restarting -r

این دستور اگر ریبوت لازم نباشد کد خروج ۰ و اگر لازم باشد کد ۱ برمی‌گرداند، پس در اسکریپت هم قابل استفاده است.

در RHEL با اشتراک فعال می‌توان با dnf update --security فقط به‌روزرسانی‌های امنیتی را نصب کرد؛ روی توزیع‌های بازسازی‌شده نتیجه به کامل بودن متادیتای errata در مخزن بستگی دارد و ممکن است چیزی برنگرداند.

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

yum downgrade package

جست‌وجو و کسب اطلاعات درباره بسته‌ها

yum search nginx            # جست‌وجو در نام و توضیح بسته‌ها
yum info nginx              # نسخه، حجم، مخزن و توضیحات
yum list installed          # بسته‌های نصب‌شده
yum list available          # بسته‌های قابل نصب از مخازن فعال
yum list nginx              # وضعیت یک بسته مشخص

پرکاربردترین دستور این بخش زمانی است که می‌دانید به چه فایلی نیاز دارید ولی نمی‌دانید در کدام بسته است:

yum provides /usr/sbin/httpd
yum provides '*/bin/dig'

برای دیدن پیش‌نیازهای یک بسته، در yum قدیمی yum deplist package و در نسخه‌های جدید:

dnf repoquery --requires --resolve package

مدیریت مخازن (Repository)

تعریف مخازن در فایل‌های .repo داخل مسیر /etc/yum.repos.d/ نگهداری می‌شود و ساختار هر مخزن چیزی شبیه این است:

[myrepo]
name=My Example Repository
baseurl=https://example.com/repo/$releasever/$basearch/
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-myrepo

این فقط یک نمونه است. برای مخازن واقعی مثل EPEL فایل .repo را دستی نسازید؛ بسته epel-release را نصب کنید تا فایل مخزن و کلید GPG درست و متناسب با نسخه سیستم شما نوشته شوند.

کلید enabled فعال یا غیرفعال بودن مخزن را مشخص می‌کند و gpgcheck=1 یعنی امضای بسته‌ها بررسی شود؛ این مقدار را روی ۰ نگذارید مگر آنکه دقیقاً بدانید چه می‌کنید.

yum repolist              # مخازن فعال
yum repolist all          # همه مخازن، فعال و غیرفعال
dnf repolist --all        # شکل امروزی همان دستور در dnf

گاهی می‌خواهید یک مخزن فقط برای همین یک دستور فعال شود، بدون آنکه به‌طور دائم روشن بماند:

yum --enablerepo=epel install package
yum --disablerepo=epel update

برای فعال یا غیرفعال کردن دائمی یک مخزن:

yum-config-manager --enable <reponame>        # CentOS/RHEL 7 با بسته yum-utils
dnf config-manager --set-enabled <reponame>   # RHEL 8+ با بسته dnf-plugins-core

نام دقیق مخزن همان چیزی است که در yum repolist all در ستون اول می‌بینید. محبوب‌ترین مخزن جانبی خانواده Red Hat هم EPEL است که روی CentOS، AlmaLinux و Rocky Linux با yum install epel-release نصب می‌شود. درباره مخازن شخص ثالث محتاط باشید: مخزنی که نسخه‌های تازه‌تری از بسته‌های پایه (مثل PHP یا MySQL) ارائه می‌دهد، می‌تواند بسته‌های سیستم را جایگزین کند و مسیر به‌روزرسانی‌های بعدی را خراب کند.

پاک کردن کش yum

وقتی مخزنی تغییر کرده اما yum همچنان اطلاعات قدیمی را نشان می‌دهد یا با خطای متادیتا روبه‌رو می‌شوید، کش را پاک کنید:

yum clean all
yum makecache

مسیر کش در yum کلاسیک /var/cache/yum و در dnf مسیر /var/cache/dnf است. اگر پارتیشن /var پر شده باشد، همین clean all معمولاً فضای قابل توجهی آزاد می‌کند.

yum history و بازگرداندن یک تراکنش

این بخش کم‌شناخته‌ترین و در عین حال نجات‌بخش‌ترین قابلیت yum است. هر نصب، حذف یا آپدیت به‌عنوان یک تراکنش با شماره ثبت می‌شود:

yum history            # فهرست تراکنش‌ها
yum history info 24    # جزئیات تراکنش شماره 24
yum history undo 24    # برگرداندن تراکنش شماره 24
yum history redo 24    # اجرای دوباره همان تراکنش

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

نصب گروهی بسته‌ها

گروه‌ها مجموعه‌ای از بسته‌های مرتبط هستند که با یک دستور نصب می‌شوند؛ مثلاً ابزارهای کامپایل:

yum grouplist
yum groupinstall "Development Tools"
yum groupremove "Development Tools"

در dnf شکل امروزی این دستورها به‌صورت زیر است و برای دیدن گروه‌های پنهان هم سوییچ --hidden وجود دارد:

dnf group list --hidden
dnf group install "Development Tools"

در RHEL 8 و ۹ مفهوم دیگری به نام ماژول (AppStream Module) هم اضافه شده که با آن می‌توان بین نسخه‌های مختلف یک نرم‌افزار انتخاب کرد:

dnf module list php
dnf module reset php
dnf module enable php:<stream>
dnf install php

اگر پیش‌تر استریم دیگری از همان ماژول فعال بوده باشد، dnf module enable بدون reset خطا می‌دهد؛ به همین دلیل ابتدا reset می‌کنیم. عوض کردن استریم PHP روی سروری که سایت زنده دارد، نسخه PHP همه سایت‌ها را تغییر می‌دهد؛ این کار را با پشتیبان و در بازه کم‌ترافیک انجام دهید.

خطاهای رایج و راه‌حل آن‌ها

  • قفل بودن yum («Another app is currently holding the yum lock» یا انتظار برای یک PID در dnf): یعنی فرایند دیگری مثل به‌روزرسانی خودکار در حال اجراست. چند دقیقه صبر کنید. با ps aux | grep -E 'yum|dnf' بررسی کنید واقعاً فرایندی در حال اجراست یا نه و فقط اگر مطمئن شدید هیچ فرایندی در جریان نیست فایل قفل را حذف کنید؛ حذف قفل وسط یک تراکنش واقعی دیتابیس RPM را خراب می‌کند.
  • «Cannot find a valid baseurl» یا خطای mirrorlist روی CentOS 7: پس از پایان پشتیبانی، محتوای مخازن به vault.centos.org منتقل شد. راه‌حل درست، مهاجرت به AlmaLinux یا Rocky Linux است؛ راه‌حل موقت، اصلاح فایل‌های مخزن است. حتماً اول پشتیبان بگیرید.
cp -a /etc/yum.repos.d /root/yum.repos.d.bak
sed -i 's/^mirrorlist=/#mirrorlist=/g' /etc/yum.repos.d/CentOS-*.repo
sed -i 's|^#?baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-*.repo
yum clean all
  • «No package X available»: یا نام بسته اشتباه است (با yum search بررسی کنید)، یا بسته در مخازن پایه نیست و باید EPEL را نصب کنید، یا مخزن مربوطه غیرفعال است.
  • خطای کلید GPG («Public key … is not installed»): کلید رسمی مخزن را وارد کنید، مثلاً rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-.... راه‌حل اشتباه، غیرفعال کردن gpgcheck است.
  • خطاهای دیتابیس RPM («rpmdb open failed»): معمولاً با rpm --rebuilddb برطرف می‌شود؛ پیش از آن از /var/lib/rpm نسخه پشتیبان بگیرید.
  • پر شدن فضای دیسک وسط تراکنش: با df -h بررسی و با yum clean all و پاک کردن هسته‌های قدیمی فضا آزاد کنید.
  • اگر هنگام اجرای yum update با خطای مربوط به بسته bind-chroot روبه‌رو شدید، در همین وبلاگ مقاله‌ای جداگانه به آن اختصاص داده شده است.

چه زمانی نباید این دستورها را اجرا کنید

  • سوییچ -y روی سرور تولیدی برای remove یا update کلی. فهرست تغییرات را بخوانید، بعد تأیید کنید.
  • روی سرورهای دارای کنترل‌پنل مانند cPanel یا DirectAdmin. بخشی از بسته‌ها (وب‌سرور، PHP، MySQL، exim و…) توسط خود پنل مدیریت می‌شوند و در فهرست exclude قرار می‌گیرند؛ دور زدن این استثناها می‌تواند سرویس را از کار بیندازد. مستندات پنل را ملاک قرار دهید.
  • وسط ساعات پرترافیک و بدون پشتیبان. برای yum update کلی، بازه کم‌ترافیک و یک اسنپ‌شات تازه انتخاب کنید.
  • افزودن هر مخزن ناشناخته‌ای که در نتایج جست‌وجو پیدا می‌کنید. مخزن جانبی می‌تواند بسته‌های پایه سیستم را جایگزین کند.
  • ادامه دادن روی توزیع EOL. روی CentOS 6 و ۷ حتی اگر yum کار کند، وصله امنیتی جدیدی دریافت نمی‌کنید؛ راه‌حل واقعی مهاجرت به AlmaLinux، Rocky Linux یا نسخه پشتیبانی‌شده دیگر است.

معادل دستورها در دبیان و اوبونتو

  • yum installapt install
  • yum removeapt removeapt purge برای حذف فایل‌های پیکربندی)
  • yum updateapt update && apt upgrade
  • yum searchapt search
  • yum infoapt show
  • yum provides /pathdpkg -S /path برای فایل‌های بسته‌های نصب‌شده و apt-file search /path برای بسته‌های نصب‌نشده

دو تله رایج در همین فهرست پنهان است. اول اینکه apt update فقط فهرست بسته‌ها را تازه می‌کند و هیچ بسته‌ای را ارتقا نمی‌دهد، در حالی که yum update واقعاً بسته‌ها را به‌روز می‌کند؛ معادل واقعی yum update در اوبونتو، apt upgrade است. دوم اینکه dpkg -S برخلاف yum provides فقط فایل‌های بسته‌های همین‌الان نصب‌شده را می‌گردد و بسته‌های موجود در مخازن را نمی‌بیند؛ برای آن حالت باید بسته apt-file را نصب و یک بار apt-file update را اجرا کنید.

جمع‌بندی

چند دستور install، remove، update، search و provides نود درصد کار روزمره را پوشش می‌دهند؛ history undo همان ده درصدی است که روز خرابکاری نجاتتان می‌دهد. و اگر سروری در اختیار دارید که هنوز CentOS 7 است، مهم‌ترین کاری که با yum می‌توانید بکنید این نیست که بسته‌ای نصب کنید، بلکه این است که برنامه مهاجرت به یک توزیع پشتیبانی‌شده را شروع کنید.

آموزش‌های مرتبط