۵. نصب بستهها و مخازن¶
مدیریت بستهها مستقیمترین راه تغییر سیستم و ورود نرمافزار ناشناخته است. قاعده: قبل از ارتقا ببینید چه چیزی تغییر میکند، بعد از آن بررسی کنید چه چیزی باید ریستارت شود.
راهنمای سریع (میانتوزیعی)¶
| کار | 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)¶
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 را با نسخهٔ نصبشده مقایسه کنید.
اطلاعات و عیبیابی¶
این دستورات ترمیمی را با توجه به خطای واقعی اجرا کنید؛ اجرای کورکورانه آنها روی سامانه حساس توصیه نمیشود.
خطای قفل dpkg/apt (Could not get lock /var/lib/dpkg/lock-frontend): معمولاً یک apt/unattended-upgrades دیگر در حال اجراست. صبر کنید و بررسی کنید:
فایل قفل را حذف نکنید مگر مطمئن باشید هیچ پردازشی فعال نیست؛ حذف قفل در حین نصب، پایگاه 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 ها) پرهیز کنید.
خلاصهٔ اجرایی¶
apt -s upgrade/dnf check-updateرا قبل از ارتقا بخوانید.- بعد از ارتقا:
needrestart/needs-restartingو reboot برای کرنل. - مخزن فقط با کلید امضا در
signed-by؛ هرگزcurl | bash. - قفل dpkg را حذف نکنید؛ ببینید چه پردازشی آن را دارد.