پرش به محتویات

۵. نصب بسته‌ها و مخازن

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

راهنمای سریع (میان‌توزیعی)

کار Debian / Ubuntu RHEL / Rocky / Alma Alpine SUSE
به‌روزرسانی فهرست apt update dnf check-update apk update zypper refresh
ارتقا apt upgrade dnf upgrade apk upgrade zypper update
نصب apt install pkg dnf install pkg apk add pkg zypper install pkg
حذف apt remove pkg dnf remove pkg apk del pkg zypper remove pkg
جست‌وجو apt search x dnf search x apk search x zypper search x
اطلاعات apt show pkg dnf info pkg apk info pkg zypper info pkg
فایل‌های بسته dpkg -L pkg rpm -ql pkg apk info -L pkg rpm -ql pkg
این فایل از کدام بسته؟ dpkg -S /path rpm -qf /path apk info -W /path rpm -qf /path
فهرست نصب‌شده apt list --installed rpm -qa apk info rpm -qa

Ubuntu / Debian (APT)

sudo apt update
apt list --upgradable
apt -s upgrade                 # شبیه‌سازی: چه چیزی نصب/حذف/ارتقا می‌شود؟
sudo apt upgrade
sudo apt install curl jq vim
sudo apt remove package-name
sudo apt purge package-name    # + حذف فایل‌های پیکربندی
sudo apt autoremove --dry-run  # اول ببینید
apt show nginx
apt-cache policy nginx         # نسخه‌ها و مخزن مبدأ
dpkg -l | grep nginx
dpkg -S /usr/sbin/nginx
dpkg -L nginx | head
apt changelog nginx | head -30

apt update فهرست مخازن را تازه می‌کند؛ خود بسته‌ها را ارتقا نمی‌دهد. apt upgrade هرگز بسته‌ای را حذف نمی‌کند؛ apt full-upgrade ممکن است وابستگی‌ها را عوض و بسته حذف کند — قبل از اجرا خروجی -s را بخوانید. قبل از ارتقای گسترده، تغییرات پیشنهادی و پنجره نگهداری را بررسی کنید.

قفل‌کردن نسخه (hold)

sudo apt-mark hold nginx           # جلوگیری از ارتقای خودکار
apt-mark showhold
sudo apt-mark unhold nginx

RHEL / Rocky / Fedora (DNF)

sudo dnf check-update           # کد خروج 100 = به‌روزرسانی موجود است (خطا نیست!)
sudo dnf upgrade
sudo dnf upgrade --security     # فقط وصله‌های امنیتی
sudo dnf install curl vim
sudo dnf remove package-name
dnf info nginx
dnf provides '*/bin/dig'        # کدام بسته این فایل را می‌دهد؟
dnf repolist -v
rpm -qa | sort
rpm -qf /usr/sbin/nginx
sudo dnf history                # سابقهٔ تراکنش‌ها
sudo dnf history info 12
sudo dnf history undo 12        # بازگرداندن تراکنش (با احتیاط؛ اول info)
sudo dnf versionlock add nginx  # قفل نسخه (افزونهٔ versionlock)

کد خروج dnf check-update

در اسکریپت و CI، dnf check-update وقتی به‌روزرسانی هست با کد 100 خارج می‌شود. با set -e این اسکریپت را می‌کشد. [ $? -eq 100 ] را جداگانه بررسی کنید.

بعد از ارتقا: چه چیزی باید ریستارت شود؟

ارتقای کتابخانه، سرویس‌های در حال اجرا را با کد قدیمی (و آسیب‌پذیر) رها می‌کند.

# Debian/Ubuntu
ls /var/run/reboot-required 2>/dev/null && cat /var/run/reboot-required.pkgs
sudo needrestart -r l           # فهرست سرویس‌های نیازمند ریستارت (بسته needrestart)

# RHEL
sudo dnf needs-restarting -r    # آیا reboot لازم است؟
sudo dnf needs-restarting -s    # کدام سرویس‌ها؟

هسته (kernel) فقط با reboot فعال می‌شود: uname -r را با نسخهٔ نصب‌شده مقایسه کنید.

اطلاعات و عیب‌یابی

apt-cache policy nginx
sudo apt --fix-broken install
sudo dpkg --configure -a
sudo apt clean

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

خطای قفل dpkg/apt (Could not get lock /var/lib/dpkg/lock-frontend): معمولاً یک apt/unattended-upgrades دیگر در حال اجراست. صبر کنید و بررسی کنید:

ps -eo pid,etime,cmd | grep -E 'apt|dpkg|unattended' | grep -v grep

فایل قفل را حذف نکنید مگر مطمئن باشید هیچ پردازشی فعال نیست؛ حذف قفل در حین نصب، پایگاه dpkg را خراب می‌کند.

به‌روزرسانی خودکار

# Debian/Ubuntu
sudo apt install unattended-upgrades
sudo unattended-upgrade --dry-run -d | tail
systemctl status unattended-upgrades --no-pager
# RHEL
sudo dnf install dnf-automatic
sudo systemctl enable --now dnf-automatic.timer

برای سرورهای production معمولاً فقط وصله‌های امنیتی و با ریستارت دستی در پنجرهٔ نگهداری؛ ارتقای خودکار کامل ممکن است سرویس را بشکند.

مخازن و امضا

  • مخازن را فقط از منابع مورد اعتماد اضافه کنید.
  • از کلیدهای امضای معتبر و روش رسمی همان توزیع استفاده کنید.
  • افزودن مخزن ناشناس یا غیرفعال‌کردن بررسی امضا (--allow-unauthenticated، gpgcheck=0) می‌تواند زنجیره تأمین نرم‌افزار را ناامن کند.
  • برای بررسی منشأ بسته: apt-cache policy package-name یا dnf info package-name.
  • curl ... | sudo bash را اجرا نکنید؛ فایل را دانلود، بخوانید، سپس اجرا کنید.
# روش مدرن افزودن مخزن Debian/Ubuntu: کلید در keyring اختصاصی، نه apt-key (منسوخ)
sudo install -d -m 0755 /etc/apt/keyrings
curl -fsSL https://example.com/repo/key.gpg | sudo gpg --dearmor -o /etc/apt/keyrings/example.gpg
echo "deb [signed-by=/etc/apt/keyrings/example.gpg] https://example.com/apt stable main" \
  | sudo tee /etc/apt/sources.list.d/example.list
sudo apt update

بررسی صحت بسته‌های نصب‌شده

sudo debsums -s                 # Debian: فایل‌های تغییرکرده (بسته debsums)
sudo rpm -Va | head -30         # RHEL: تغییرات نسبت به بسته (S=اندازه 5=هش M=مجوز)

فایل‌های پیکربندی در /etc طبیعتاً تغییر کرده‌اند (c در خروجی rpm)؛ باینری‌های تغییرکرده در /usr/bin مشکوک‌اند (امنیت).

خطاهای رایج

نشانه علت احتمالی اقدام
Unable to locate package apt update اجرا نشده یا مخزن نیست apt update ، apt-cache policy
NO_PUBKEY / GPG error کلید مخزن نیست/منقضی شد افزودن کلید به‌روش بالا
held broken packages وابستگی ناسازگار / hold apt-mark showhold ، apt -s install
Failed to download metadata (dnf) DNS/proxy/مخزن خارج از دسترس dnf clean all ، curl -I URL
دیسک /var پر شد بعد از ارتقا کش بسته‌ها/هسته‌های قدیمی apt clean ، apt autoremove ، dnf clean all
سرویس بعد از ارتقا خراب شد تغییر پیکربندی/نسخه journalctl -u S ، dnf history undo یا نصب نسخهٔ قبلی

نکات امنیتی و عملیاتی

  • قبل از ارتقای مهم: snapshot VM / بکاپ /etc و فهرست بسته‌ها (dpkg --get-selections > pkgs.txt یا rpm -qa > pkgs.txt).
  • کرنل و کتابخانه‌های حیاتی را در production اول روی staging ارتقا دهید.
  • نسخهٔ بسته‌های مهم را در مستندات ثبت کنید؛ از مخازن بیش از حد (EPEL، PPA ها) پرهیز کنید.

خلاصهٔ اجرایی

  1. apt -s upgrade / dnf check-update را قبل از ارتقا بخوانید.
  2. بعد از ارتقا: needrestart / needs-restarting و reboot برای کرنل.
  3. مخزن فقط با کلید امضا در signed-by؛ هرگز curl | bash.
  4. قفل dpkg را حذف نکنید؛ ببینید چه پردازشی آن را دارد.