SSD Nodes Learn 🎉 VPS من $5.50/شهر
الأدلة Matt Connorبقلم Matt Connor · آخر تحديث في 2026-08-15

تنظيف النوى القديمة في Ubuntu وتحرير ‎/boot‎

عند ظهور خطأ No space left on device، تعرّف إلى النوى التي يمكنك حذفها بأمان، وتحقق من النواة قيد التشغيل قبل إصلاح apt وتحرير ‎/boot‎.

لماذا يتوقف apt عن العمل عند امتلاء /boot بالنوى القديمة

في Ubuntu، يكتب كل تحديث للنواة مجموعة جديدة من الملفات في /boot ويُبقي الملفات السابقة، لذلك يمتلئ قسم /boot الصغير ولا يتمكن apt من إكمال التثبيت. يتطلب الإصلاح خطوتين. حدّد الحزم التي تمثل النوى على الخادم، وحدّد النواة التي أقلعتَ بها، ثم أزل بقية النوى باستخدام apt autoremove --purge.

الترتيب مهم. النواة قيد التشغيل هي حزمة يجب ألا تزيلها. وقد يكون الخادم في حالة لا يستطيع فيها apt العمل إطلاقاً. شخّص المشكلة أولاً.

كيف يبدو الفشل فعلياً

يثبّت إصدار النواة ملفين كبيرين في /boot: النواة المضغوطة (vmlinuz-<version>) وinitramfs (نظام الملفات الأولي في الذاكرة، initrd.img-<version>، وهو أرشيف صغير تفككه النواة قبل تركيب root الحقيقي). يُبنى initramfs على جهازك وقت التثبيت، ولذلك يحتاج التثبيت إلى مساحة حرة، وليس إلى نطاق ترددي للتنزيل فقط. عند نفاد المساحة، يفشل البناء، وتتأثر الحزمة بالفشل نفسه.

update-initramfs: Generating /boot/initrd.img-6.8.0-64-generic
gzip: stdout: No space left on device
E: mkinitramfs failure gzip 1
update-initramfs: failed for /boot/initrd.img-6.8.0-64-generic with 1.
dpkg: error processing package linux-image-6.8.0-64-generic (--configure):
 installed linux-image-6.8.0-64-generic package post-installation script subprocess returned error exit status 1

ستكون سلسلة الإصدار خاصة بك. يأتي اسم أداة الضغط من COMPRESS= في /etc/initramfs-tools/initramfs.conf، لذلك قد يسمّي ملف حديث zstd، بينما يسمّي ملف أقدم gzip. السطران اللذان يحددان هذه المشكلة هما No space left on device وسطر dpkg: error processing package الموجود تحته.

بعد ذلك، تبقى الحزمة في حالة إعداد غير مكتمل. تحاول كل عملية تشغيل لاحقة لـ apt إعدادها من جديد، وتفشل بالطريقة نفسها، وتنتهي بـ E: Sub-process /usr/bin/dpkg returned an error code (1). هذه هي النقطة المهمة التي تتجاوز مشكلة مساحة القرص: تُشغّل unattended-upgrades وفق مؤقتها، وتواجه الخطأ نفسه، ثم تتوقف. يبدو الخادم سليماً، لكنه يتوقف بصمت عن تطبيق تصحيحات الأمان. يعني ذلك أيضاً أن أي تثبيت غير مرتبط تحاول تنفيذه سيفشل بالسطر نفسه، وسينسب الخطأ إلى الشيء الذي كنت تضيفه في ذلك الوقت. لذلك يجدر بك قراءة تثبيت Tailscale الذي يفشل على Ubuntu باعتباره خطأ في apt أولاً. إذا فشل apt update قبل الوصول إلى هذه المرحلة، فهذه مشكلة منفصلة، وغالباً ما تكون إدخالاً مكرراً بعد ترحيل مصادر deb822.

تحقّق مما إذا كان /boot قسماً منفصلاً

قبل حذف أي شيء، اعرف ما الذي ستوفر مساحته فعلياً.

findmnt /boot
findmnt -T /boot
df -h /boot /

يطبع الأمر الأول سطراً فقط إذا كان /boot نقطة تحميل مستقلة. أما الأمر الثاني فيطبع دائماً، ويحدد نظام الملفات الذي يحتوي فعلياً على /boot. إذا أشار كلاهما إلى نظام الملفات نفسه الذي يشير إليه /، فهذا يعني أن /boot مجرد دليل في نظام الملفات الجذر، ولا يمكن أن يمتلئ منفرداً: نظام الملفات الجذر لديك ممتلئ، والنوى القديمة أحد عدة أسباب لذلك. في هذه الحالة، يفرّغ sudo apt clean ملفات .deb التي جرى تنزيلها داخل /var/cache/apt/archives، ويوفر لك مساحة. أما على جهاز يحتوي على قسم /boot فعلي، فلن يحرر apt clean أي مساحة فيه، لأن ذاكرة التخزين المؤقت موجودة في نظام ملفات مختلف.

احصل الآن على الرقم الذي ستبني عليه عملك.

df -h /boot
ls -lh /boot/vmlinuz-$(uname -r) /boot/initrd.img-$(uname -r)

قارن العمود Avail بحجم هذين الملفين. ملف initrd هو الأكبر. يحتاج تحديث النواة التالي إلى مساحة لزوج آخر يقارب هذا الحجم، لذلك إذا كان Avail أصغر من ملف initrd الحالي، فسيفشل التحديث التالي حتماً.

تحديد النواة قيد التشغيل

uname -r
cat /var/run/reboot-required.pkgs

يعرض uname -r سلسلة إصدار النواة الموجودة حالياً في الذاكرة. انسخ هذه السلسلة إلى مكان ما. هذه هي النسخة الوحيدة التي يجب ألا تلمسها.

لا يوجد الملف الثاني إلا عندما تطلب حزمة ما إعادة التشغيل. يعني وجود سطر linux-image فيه أن نواة أحدث مثبتة على القرص وغير مستخدمة، لأن الجهاز لم يُعَد تشغيله منذ تثبيتها. أعد التشغيل قبل التنظيف إن أمكن. يحمي apt النواة قيد التشغيل وأحدث نواة، لذلك يؤدي التنظيف أثناء تشغيل نواة قديمة إلى تثبيت نسخة إضافية لا تحتاج إليها.

سرد حزم النواة وقراءة حالاتها

dpkg --list | grep -E 'linux-(image|modules|headers|tools)' | awk '{print $1, $2}'

الحقل الأول هو رمز حالة dpkg. يعني ii أن الحزمة مثبّتة ومهيّأة. ويعني iF أنها مثبّتة لكن تهيئتها غير مكتملة، وهذا بالضبط ما يخلّفه التحديث الفاشل أعلاه. ويعني rc أنها أزيلت مع بقاء إعداداتها على القرص، وهي لا تشغل مساحة في /boot، ويمكن حذفها نهائياً بأمان.

يحدد الحقل الثاني نوع الحزمة. الاسم الذي يتضمن إصداراً، مثل linux-image-6.8.0-64-generic، يمثل نواة محددة. أما الاسم الذي لا يتضمن إصداراً، مثل linux-image-generic أو linux-headers-generic أو linux-generic، فهو حزمة وصفية. لا تحتوي هذه الحزمة على نواة. وتتمثل وظيفتها بالكامل في الاعتماد على أحدث نواة ذات إصدار، حتى يجلب apt upgrade نوى جديدة. يؤدي حذف الحزمة الوصفية إلى إيقاف تلقي الجهاز تحديثات النواة، ولن يظهر أي تحذير بعد ذلك.

تنقسم العائلات كما يلي. تحتوي linux-image-* على النواة المضغوطة في /boot. وتحتوي linux-modules-* وlinux-modules-extra-* على برامج التشغيل ضمن /lib/modules. وتحتوي linux-headers-* على ترويسات البناء ضمن /usr/src، ما يعني أن حذف الترويسات نهائياً يحرر مساحة في نظام الملفات الجذر، وليس مساحة /boot. إذا كانت المشكلة هي امتلاء قسم /boot، فحزم صور النواة هي ما يجب البحث عنه.

ls -1 /boot/vmlinuz-*
ls -1 /lib/modules/

ينبغي أن تتطابق هاتان القائمتان معاً ومع ناتج dpkg --list. ووجود دليل في /lib/modules من دون حزمة مثبّتة مطابقة يعني أنه متبقٍّ بعد حذف شخص للملفات يدوياً.

كيف يحدد apt نوى Linux التي يحتفظ بها

لن يزيل apt autoremove نواة يعتبرها محمية، وتشمل مجموعة النوى المحمية النواة التي تعمل بها الآن. تغيّرت سياسة الاحتفاظ بين إصدارات Ubuntu، لذلك اقرأها من جهازك نفسه بدلاً من الاعتماد على رقم مكتوب في مكان آخر.

apt-config dump | grep -i -e neverautoremove -e versionedkernel
ls -l /etc/apt/apt.conf.d/01autoremove /etc/apt/apt.conf.d/01autoremove-kernels

APT::NeverAutoRemove هي قائمة أنماط أسماء الحزم التي يرفض apt autoremove التعامل معها. أما APT::VersionedKernelPackages فهي قائمة بادئات الأسماء التي يعتبرها apt حزم نوى ذات إصدارات من الأساس. في الإصدارات التي تنشئ /etc/apt/apt.conf.d/01autoremove-kernels، يعيد /etc/kernel/postinst.d/apt-auto-removal كتابة ذلك الملف كلما ثُبّتت حزمة نواة، لذلك لا يفيد تعديل الملف يدوياً؛ إذ تستبدل عملية تثبيت النواة التالية تعديلاتك. في الإصدارات التي لا يوجد فيها الملف، يطبّق apt الحماية نفسها داخلياً. في كلتا الحالتين، يعرض apt-config dump القواعد السارية على جهازك، ويكون هذا الناتج هو الإجابة الصحيحة لإصدارك.

التنظيف الآمن للتنفيذ

sudo apt update
sudo apt autoremove --purge --dry-run

لا يغيّر --dry-run أي شيء على القرص، ويطبع بالضبط ما ستزيله عملية التنفيذ الفعلية. اقرأ القائمة. هناك أمران يستدعيان التوقف. وجود حزمة وصفية مثل linux-generic أو linux-image-generic في قائمة الإزالة يعني أن شيئاً ما صنّفها تلقائياً، وأن إزالتها ستوقف تحديثات النواة. ووجود السلسلة الناتجة من uname -r في قائمة الإزالة يعني أن النواة قيد التشغيل غير محمية. لا ينبغي أن يحدث ذلك، ويجب التحقيق فيه قبل المتابعة.

إذا بدت القائمة صحيحة، نفّذ الأمر فعلياً.

sudo apt autoremove --purge
df -h /boot

يحذف الجزء --purge أيضاً إعدادات الحزمة المتبقية، إلى جانب الحزمة نفسها. لا يوفّر ذلك مساحة إضافية كبيرة، لكنه يمنع dpkg --list من تراكم أسطر rc، ما يجعل التدقيق التالي قابلاً للقراءة.

ثم تأكد من إعادة بناء قائمة الإقلاع. تؤدي إزالة حزمة نواة إلى تشغيل update-grub تلقائياً، لذلك يجب أن تشير القائمة فقط إلى الملفات التي لا تزال موجودة.

sudo grep -o 'vmlinuz-[^ ]*' /boot/grub/grub.cfg | sort -u
ls -1 /boot/vmlinuz-*

يجب أن يظهر كل إصدار في المخرجات الأولى في المخرجات الثانية. تؤدي إشارة أحد عناصر القائمة إلى ملف لم يعد موجوداً إلى تحويل خادم يعمل إلى خادم يتوقف عند موجه GRUB. وهذا أحد المسارات التي تؤدي إلى VPS لا يقلع بعد تحديث النواة، كما أن إصلاحه من وحدة تحكم الإنقاذ أصعب بكثير من تجنبه هنا.

لماذا لا يزيل apt autoremove شيئاً أحياناً

لا يزيل apt autoremove إلا الحزم المعلَّمة على أنها تلقائية، أي الحزم التي ثُبّتت كتبعيات لحزمة أخرى. أما النواة التي ثبّتها بنفسك باستخدام apt install linux-image-6.8.0-40-generic فتُعلَّم على أنها يدوية، ولذلك لن يزيلها autoremove مهما قَدُم إصدارها.

apt-mark showmanual | grep -E '^linux-'

تكون أي نواة ذات إصدار محدد تظهر في ذلك الناتج غير مرئية بالنسبة إلى autoremove. أعد وسمها كحزمة تلقائية باستخدام سلاسل الإصدارات من القائمة الخاصة بنظامك:

sudo apt-mark auto linux-image-6.8.0-40-generic linux-modules-6.8.0-40-generic
sudo apt autoremove --purge --dry-run

اترك حزم meta معلَّمة على أنها يدوية. فهذا هو الوضع المقصود لها، لأنك طلبت تثبيتها بنفسك.

إزالة نواة محددة عمداً

قد تحتاج أحياناً إلى إزالة إصدار محدد الآن، بدلاً من انتظار الوقت الذي تسمح فيه السياسة بذلك. حدّد حزمة صورة النواة، ودَع apt يتولى تحديد ما يلزم.

sudo apt purge linux-image-6.8.0-40-generic

يطبع apt قائمة الإزالة قبل تنفيذ أي إجراء، لأن linux-modules-extra-* يعتمد على حزمة الصورة ويجب إزالته في المعاملة نفسها. هذه القائمة المطبوعة هي فحص الأمان الفعلي، ومنها تكتشف إزالة حزمة meta مع الإصدار الذي قصدت إزالته. أجب بـn إذا تضمنت القائمة أي عنصر غير متوقع. بعد ذلك، استخدم sudo apt autoremove --purge لجمع حزم الوحدات والترويسات التي لم تعد لها حاجة.

لماذا لا تحذف النواة قيد التشغيل مطلقاً

تستمر النواة الموجودة في الذاكرة في العمل بعد حذف ملفاتها، لذلك لا يتعطل شيء في البداية. لكن ما يتعطل هو كل ما لم تحمّله النواة بعد. يؤدي حذف linux-modules-$(uname -r) إلى حذف /lib/modules/$(uname -r)/، ولذلك يفشل تحميل الوحدة التالية:

modprobe: FATAL: Module nf_tables not found in directory /lib/modules/6.8.0-64-generic

يفشل إعادة تحميل جدار الحماية منذ تلك اللحظة، وكذلك يفشل تركيب نوع نظام ملفات لم تتعامل معه هذه النواة منذ الإقلاع. وفي الوقت نفسه، يُحذف /boot/vmlinuz-$(uname -r)، لذلك لا تعود قائمة الإقلاع تعرض النواة التي تعمل بها، وتنتقل عملية الإقلاع التالية إلى خيار آخر. يواصل الجهاز تقديم حركة الشبكة، لكنه يصبح غير قابل للإقلاع. تحقّق من uname -r مقابل قائمة الحذف في كل مرة.

عندما يمتلئ ‎/boot‎ إلى حد يمنع apt من العمل تماماً

هذه هي الحالة التي تدفع المستخدمين إلى البحث عن هذه الصفحة. يحتاج apt autoremove إلى dpkg لإكمال إعداد حزمة kernel التي أُعدّت جزئياً أولاً، وتعيد هذه الخطوة إنشاء initramfs، الذي يحتاج إلى مساحة في /boot لا تتوفر فيها مساحة. اكسر هذه الحلقة يدوياً، لمرة واحدة.

uname -r
ls -1 /boot/initrd.img-*

اختر ملف initrd واحداً لا يكون إصداره هو السلسلة التي أعادها uname -r، ثم احذف هذا الملف وحده.

sudo rm /boot/initrd.img-6.8.0-40-generic
sudo apt --fix-broken install
sudo apt autoremove --purge
sudo update-grub

لكل سطر سبب. يُعد rm استثناءً مقصوداً يجعل dpkg يعتقد أن ملفاً موجود رغم عدم وجوده. يُكمل apt --fix-broken install إعداد الحزمة الذي فشل بعد أن أصبحت هناك مساحة لـinitramfs. ثم يزيل autoremove --purge الحزمة التي حذفت ملفها، إلى جانب الإصدارات القديمة الأخرى، وبذلك يعيد dpkg إلى التوافق مع محتويات القرص. يعيد update-grub إنشاء القائمة من الملفات الموجودة فعلياً. لا تعِد التشغيل بين rm وupdate-grub، لأن القائمة قد تشير خلال هذه الفترة إلى الملف الذي حذفته للتو. إذا أبلغ dpkg عن أن العملية متوقفة، فإن sudo dpkg --configure -a ينفّذ الإصلاح نفسه الذي ينفّذه apt --fix-broken install.

المهمة نفسها على أنظمة dnf

إذا كان VPS لديك يعمل بنظام Fedora أو إحدى توزيعات RHEL المعاد بناؤها مثل Rocky Linux، فآلية العمل معكوسة. تحمي Debian وUbuntu نوى النظام بقواعد apt autoremove، وتترك عملية التنظيف لك أو لـunattended-upgrades لتشغيلها، بينما يفرض dnf عدداً يسمى installonly_limit، ويزيل أقدم نواة تلقائياً بمجرد أن يؤدي تثبيت نواة جديدة إلى تجاوز هذا العدد. اعرض القيمة المطبقة باستخدام grep installonly_limit /etc/dnf/dnf.conf وman 5 dnf.conf، ونظّف التراكم الموجود باستخدام sudo dnf remove --oldinstallonly. وتحظى النواة قيد التشغيل بالحماية هناك أيضاً. للاطلاع على المقابلة الأوسع بين مديري الحزم، راجع مكافئات أوامر dnf وapt.

أوقف حدوث المشكلة مرة أخرى

ستفشل إجراءات التنظيف التي تعتمد على تذكّرك تنفيذها في نهاية المطاف، لذلك ضعها في الأداة التي تثبّت نوى النظام. افتح /etc/apt/apt.conf.d/50unattended-upgrades وابحث عن هذه المفاتيح؛ فالملف المضمَّن يحتوي عليها مسبقاً في صورة أسطر معلّقة:

Unattended-Upgrade::Remove-Unused-Kernel-Packages "true";
Unattended-Upgrade::Remove-Unused-Dependencies "true";

أزل التعليق عنها بدلاً من إلحاق نسخة ثانية في نهاية الملف. في إعدادات apt، تكون قيمة المفتاح في آخر تعيين هي المعتمدة، لذلك يجعل التكرار الملف متناقضاً مع نفسه ويخفي القيمة الفعلية. تحقّق من القيمة التي انتهى إليها المحلّل، وراقب عملية لا تغيّر شيئاً:

apt-config dump | grep -i 'Unattended-Upgrade::Remove'
sudo unattended-upgrade --dry-run --debug
sudo tail -n 40 /var/log/unattended-upgrades/unattended-upgrades.log

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

قبل وصول نواة النظام التالية، تحقّق من رقم واحد. استخدم زوج الأوامر نفسه الوارد في بداية هذا الدليل:

df -h /boot
ls -lh /boot/initrd.img-$(uname -r)

إذا لم تكن قيمة Avail أكبر بهامش مريح من حجم ذلك الملف، فستفشل النواة التالية تماماً كما هو موضّح أعلاه. أصلح المشكلة الآن بدلاً من معالجتها أثناء الترقية. لا يستغرق هذا الفحص أكثر من دقيقة إلى جانب فحوصات سلامة القرص على VPS الأخرى. تزداد أهميته مباشرة قبل ترقية الإصدار، لأن ترقية Ubuntu 24.04 إلى 26.04 تثبّت نواة جديدة في مرحلة مبكرة من العملية، وسيرفض do-release-upgrade المتابعة عندما تكون مساحة /boot غير كافية.

FAQ

لماذا يحتفظ Ubuntu بالنوى القديمة بدلاً من حذفها؟

لأن النواة التي تفشل في الإقلاع تتركك بلا خيار آخر لتحديده. يتيح الاحتفاظ بالإصدار السابق استعادة النظام بعد تحديث معيب من قائمة GRUB، بدلاً من الاعتماد على وحدة تحكم الإنقاذ لدى المزوّد. لذلك يحمي apt مجموعة من حزم النواة من الإزالة التلقائية، ويشمل ذلك دائماً النواة التي تشغّلها. شغّل apt-config dump | grep -i neverautoremove لمعرفة الأنماط الدقيقة التي يحميها إصدارك، لأن السياسة تغيّرت بين الإصدارات.

هل من الآمن تشغيل apt autoremove --purge على خادم إنتاج؟

نعم، بشرط أن تقرأ التشغيل التجريبي أولاً. شغّل sudo apt autoremove --purge --dry-run، فهو لا يكتب أي شيء، ثم راجع القائمة المطبوعة. توقف إذا تضمنت حزمة meta مثل linux-generic أو linux-image-generic، لأن إزالة إحداهما توقف تحديثات النواة المستقبلية. توقف أيضاً إذا تضمنت سلسلة الإصدار التي يطبعها uname -r. إذا لم يظهر أيٌّ منهما، فالحزم التي ستُزال هي نوى قديمة وتبعيات يتيمة.

لم يُزل apt autoremove أي شيء وما زال /boot ممتلئاً. ماذا أفعل الآن؟

من شبه المؤكد أن النوى القديمة معلّمة يدوياً، بينما لا يتعامل autoremove إلا مع الحزم المعلّمة تلقائياً. شغّل apt-mark showmanual | grep -E '^linux-'. أي نواة ذات إصدار تظهر في القائمة ثُبّتت يدوياً في وقت ما. علّمها تلقائياً باستخدام sudo apt-mark auto linux-image-<version> ثم أعد التشغيل التجريبي، أو أزل ذلك الإصدار مباشرةً باستخدام sudo apt purge linux-image-<version>.

هل يمكنني حذف الملفات من /boot يدوياً؟

فقط كإجراء استثنائي مقصود، عندما يكون /boot ممتلئاً إلى حد يمنع apt من إعداد حزمة النواة المعطلة. احذف ملف initrd.img-<version> واحداً لا يطابق إصداره ناتج uname -r، ثم شغّل فوراً sudo apt --fix-broken install وsudo apt autoremove --purge وsudo update-grub. يؤدي حذف الملفات دون خطوات المتابعة هذه إلى ترك dpkg يسجّل حزم اختفت ملفاتها، كما يترك إدخالات قائمة GRUB تشير إلى ملفات مفقودة، فيفشل الخادم عند إعادة تشغيله التالية بدلاً من أن يفشل في لحظة ارتكاب الخطأ.