أساسيات لينكس

إدارة الحزم

18 دقيقة الدرس 8 من 26

إدارة الحزم

في بيئات إنتاج Linux، يتم تثبيت البرمجيات وتحديثها وإزالتها عبر مدير الحزم — لا بتنزيل الكود المصدري وتصريفه يدويًا. تقوم مديرات الحزم بحل شجرة الاعتماديات، والتحقق من التوقيعات التشفيرية، وتتبع البرمجيات المثبتة، مما يتيح لك إعادة إنتاج نفس حالة البرمجيات بالضبط عبر مئات الخوادم. هذا هو أساس البنية التحتية الموثوقة.

يهيمن نظامان على عالم DevOps: APT (أداة الحزم المتقدمة) في التوزيعات المشتقة من Debian مثل Ubuntu، وDNF/YUM في التوزيعات المشتقة من Red Hat مثل RHEL وCentOS Stream وRocky Linux وAmazon Linux 2023. فهم كلا النظامين أمر لا غنى عنه لأي مهندس متقدم — فموفرو الخدمات السحابية يستخدمون كليهما، وستصادفهما في الإنتاج.

كيف تعمل الحزم والمستودعات

الحزمة (package) هي أرشيف مضغوط (.deb لـ Debian/Ubuntu، و.rpm لـ RHEL/CentOS) يحتوي على ملفات ثنائية وملفات إعداد وبيانات وصفية تصف اعتمادياتها. المستودع (repository) هو خادم منظَّم يستضيف آلاف الحزم جانب فهرس يتيح لمدير الحزم البحث والحل والتنزيل بدقة. عند تشغيل أمر التثبيت، يقوم مدير الحزم بـ: قراءة فهرس المستودع المحلي، وحل شجرة الاعتماديات بالكامل، وتنزيل جميع الحزم المطلوبة، والتحقق من كل توقيع GPG، وتطبيق التغييرات بشكل ذري — مما يبقي النظام في حالة اتساق حتى لو انقطعت العملية.

Package manager flow: client resolves deps, fetches from repo, verifies and installs CLI Client apt / dnf Dep Resolver builds install plan Repository mirrors.ubuntu.com GPG Verify signature check Install / Unpack atomic, rollback-safe Filesystem /usr, /etc, /var Package Manager Install Flow 1 2 3 4 5
كيف تعمل apt/dnf عند تثبيت حزمة: حل الاعتماديات، الجلب من المستودع، التحقق من GPG، ثم الفك التلقائي إلى نظام الملفات.

APT — Debian وUbuntu

APT هو مدير الحزم لـ Ubuntu وDebian ومشتقاتهما. الأمر رفيع المستوى الذي تستخدمه يوميًا هو apt؛ أما البنية التحتية المنخفضة المستوى فهي dpkg. تُخزَّن مصادر المستودعات في /etc/apt/sources.list وفي الملفات تحت /etc/apt/sources.list.d/.

## ── APT: الأوامر اليومية ──────────────────────────────────────── # مزامنة فهرس الحزم المحلي مع جميع المستودعات المهيأة sudo apt update # ترقية جميع الحزم المثبتة (تحافظ على الإصدارات الحالية في حال التعارض) sudo apt upgrade -y # ترقية كاملة — قد تضيف أو تزيل حزمًا لاستيفاء الاعتماديات الجديدة (مفضلة في CI) sudo apt full-upgrade -y # تثبيت حزمة sudo apt install nginx -y # تثبيت إصدار محدد sudo apt install nginx=1.24.0-1ubuntu1 -y # إزالة حزمة مع الاحتفاظ بملفات الإعداد sudo apt remove nginx # إزالة الحزمة وتنظيف جميع ملفات الإعداد (حالة نظيفة) sudo apt purge nginx -y sudo apt autoremove -y # إزالة الاعتماديات اليتيمة # البحث عن الحزم المتاحة apt search "web server" # عرض معلومات تفصيلية: الإصدار، الاعتماديات، الحجم بعد التثبيت apt show nginx # سرد الحزم المثبتة dpkg -l | grep nginx # التحقق من الحزمة المالكة لملف معين dpkg -S /usr/sbin/nginx
مبدأ أساسي — شغّل apt update دائمًا قبل التثبيت. الفهرس المحلي (مُخزَّن في /var/lib/apt/lists/) قد يكون قديمًا. التثبيت دون تحديث قد يجلب إصدارًا غير محدّث أو يفشل بخطأ "الحزمة غير موجودة" حتى لو كانت الحزمة متاحة. في أنابيب CI، يُكتب apt-get update && apt-get install -y ... دائمًا كطبقة RUN واحدة في Dockerfile حتى لا يُخزَّن الفهرس مؤقتًا بشكل منفصل عن خطوة التثبيت.

إضافة مستودعات APT من طرف ثالث

كثير من أدوات الإنتاج — Docker وKubernetes وNode.js وPostgreSQL — تنشر مستودعات APT خاصة بها لأنها تُصدر إصدارات أسرع من المستودع الرئيسي لـ Ubuntu. النمط الحديث يستخدم ملفات keyring مع signed-by، مما يحصر مفتاح GPG في مستودع محدد (أكثر أمانًا من الأسلوب القديم apt-key add).

## ── إضافة مستودع APT الرسمي لـ Docker (Ubuntu 24.04) ──────── # 1. تثبيت المتطلبات المسبقة sudo apt-get update sudo apt-get install -y ca-certificates curl # 2. استيراد مفتاح GPG لـ Docker في keyring مخصص sudo install -m 0755 -d /etc/apt/keyrings sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg \ -o /etc/apt/keyrings/docker.asc sudo chmod a+r /etc/apt/keyrings/docker.asc # 3. إضافة مصدر المستودع مع الإشارة إلى المفتاح echo \ "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] \ https://download.docker.com/linux/ubuntu \ $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \ sudo tee /etc/apt/sources.list.d/docker.list > /dev/null # 4. تحديث الفهرس لرؤية المستودع الجديد ثم التثبيت sudo apt-get update sudo apt-get install -y docker-ce docker-ce-cli containerd.io
مشكلة إنتاجية شائعة — لا تستخدم أبدًا curl | sudo bash في الإنتاج. كثير من وثائق البدء السريع لدى الموردين تطلب منك تشغيل curl https://get.example.com/install.sh | sudo bash. هذا يُنفذ كودًا عشوائيًا من الإنترنت كـ root دون أي فحص للسلامة. استخدم دائمًا أسلوب المستودع الموقَّع: نزّل مفتاح GPG بشكل منفصل، وتحقق منه، وأضف المستودع مع signed-by، ثم ثبّت بـ apt-get. سيُعلم فريق الأمان على هذا النمط في المراجعات.

DNF وYUM — RHEL وRocky وAmazon Linux

في الأنظمة المبنية على Red Hat، DNF (Dandified YUM) هو مدير الحزم الحديث. لا يزال yum موجودًا في الأنظمة القديمة (RHEL 7، CentOS 7) وفي Amazon Linux 2؛ أما في RHEL 8+ وAmazon Linux 2023 فـyum مجرد غلاف توافقي يستدعي DNF. الأوامر متطابقة تقريبًا، لذا فإن تعلم DNF يغطي كليهما.

## ── DNF: الأوامر اليومية ──────────────────────────────────────── # التحقق من التحديثات (لا يُطبّقها؛ آمن للتشغيل في الإنتاج) sudo dnf check-update # تطبيق جميع التحديثات المتاحة sudo dnf upgrade -y # تثبيت حزمة sudo dnf install nginx -y # التثبيت من مستودع محدد sudo dnf install --enablerepo=epel nginx -y # إزالة حزمة sudo dnf remove nginx -y # البحث dnf search "web server" # عرض المعلومات dnf info nginx # سرد ما هو مثبت dnf list installed | grep nginx # سرد جميع المستودعات المهيأة dnf repolist -v # إضافة EPEL (حزم إضافية لمؤسسات Linux — ضرورية على RHEL/Rocky) sudo dnf install epel-release -y # تنظيف البيانات الوصفية المؤقتة (استخدم عند تصرف المستودعات بشكل غير متوقع) sudo dnf clean all sudo dnf makecache

تثبيت الإصدارات وقفل الحزم

في الإنتاج كثيرًا ما تحتاج إلى منع تحديث حزمة تلقائيًا — مثلاً، قفل إصدار kernel محدد في نظام PCI-DSS، أو الإبقاء على إصدار موثوق من خادم قاعدة البيانات. في APT تستخدم apt-mark hold؛ وفي DNF تستخدم إضافة versionlock.

## ── APT: تثبيت/قفل إصدار حزمة ─────────────────────────────────── # تثبيت الإصدار المثبت الحالي (لن يُرقَّى بـ apt upgrade) sudo apt-mark hold nginx # التحقق من الحزم المقفولة apt-mark showhold # رفع القفل عند الاستعداد للترقية sudo apt-mark unhold nginx ## ── DNF: قفل حزمة عند إصدار محدد ──────────────────────────────── # تثبيت إضافة versionlock sudo dnf install python3-dnf-plugin-versionlock -y # قفل الإصدار المثبت الحالي من PostgreSQL sudo dnf versionlock add postgresql-server # سرد الحزم المقفولة sudo dnf versionlock list # إزالة قفل sudo dnf versionlock delete postgresql-server
ممارسة احترافية — وثّق كل قفل أو تثبيت للإصدار في كود البنية التحتية. إذا ثبّتت nginx على الإصدار 1.24 في Ansible playbook أو Dockerfile، أضف تعليقًا يشرح السبب (مثلاً: "مُقفَل لأن v1.26 يكسر قواعد ModSecurity لدينا — أعِد الاختبار قبل الترقية"). القفول غير الموثقة تتحول إلى مشكلات غامضة بعد 18 شهرًا حين يُشغّل أحدهم apt upgrade ويتساءل لماذا لم تُحدَّث خدمة واحدة.

إدارة الحزم في الأتمتة وCI/CD

على نطاق واسع لا تُثبّت الحزم يدويًا أبدًا. تمتلك Ansible وPuppet وChef وSaltStack وحداتٍ أصيلة لإدارة الحزم. في الحاويات، تتم جميع عمليات التثبيت في وقت بناء الصورة. الأنماط التالية هي ما تبدو عليه Dockerfile الإنتاجية وأدوار Ansible.

## ── Dockerfile: أفضل ممارسات apt في الإنتاج ───────────────────── FROM ubuntu:24.04 # طبقة RUN واحدة: تحديث + تثبيت + تنظيف في خطوة واحدة. # دمجها يمنع Docker من تخزين فهرس apt قديم مؤقتًا. # --no-install-recommends يُقلّل حجم الصورة بشكل ملحوظ. # تنظيف قوائم apt يُبقي الصورة النهائية خفيفة. RUN apt-get update \ && apt-get install -y --no-install-recommends \ nginx=1.24.* \ curl \ ca-certificates \ && rm -rf /var/lib/apt/lists/* ## ── Ansible: مهمة حزمة idempotent ─────────────────────────────── # tasks/main.yml - name: Install nginx at exact version ansible.builtin.apt: name: nginx=1.24.0-1ubuntu1 state: present update_cache: true # يعادل apt update قبل التثبيت become: true - name: Hold nginx at current version ansible.builtin.dpkg_selections: name: nginx selection: hold become: true

مراجعة الحزم المثبتة

يتطلب الامتثال الأمني معرفة ما هو مثبت بالضبط على كل خادم. أوامر المراجعة الشائعة في الإنتاج:

  • dpkg-query -W -f='${Package} ${Version}\n' — قائمة كاملة بالحزم المثبتة على Debian/Ubuntu، مناسبة لمقارنة الخوادم.
  • rpm -qa --queryformat '%{NAME} %{VERSION}-%{RELEASE}\n' | sort — ما يعادله على الأنظمة المبنية على RPM.
  • apt list --upgradable 2>/dev/null — عرض ما لديه تحديثات معلقة؛ شغّله عبر cron وأرسل تنبيهًا إن كانت تصحيحات الأمان متأخرة أكثر من 7 أيام.
  • unattended-upgrades (APT) وdnf-automatic (DNF) — خدمات تطبّق تحديثات الأمان تلقائيًا. ممارسة قياسية على خوادم الإنتاج التي لا تستطيع الانتظار لنافذة صيانة.
ملخص — النموذج الذهني لإدارة الحزم على نطاق واسع: المستودعات هي مصدر الحقيقة الوحيد؛ توقيعات GPG هي حدود الثقة؛ مديرات الحزم أدوات تصريحية (تُعلن الحالة المطلوبة وهي تحسب كيفية الوصول إليها)؛ الأتمتة (Ansible، Dockerfile) تحل محل apt install اليدوي على أي شيء يتجاوز خادمًا واحدًا؛ قفل الإصدارات والتثبيتات ديون تقنية يجب توثيقها ومراجعتها بانتظام.