يتطلب مستوى: مبتدئ
القرص يقول No space left و df يقول فاضي؟ الحكاية في الـ inodes
لو السيرفر رفض يكتب ملف جديد وقالك No space left on device، وفتحت df -h لقيته فاضي، المشكلة مش في المساحة. أنت خلّصت الـ inodes. في السطور الجاية هتعرف تشخّص ده في أقل من دقيقة، وتحلّه، وتمنعه يرجع تاني.
المشكلة باختصار
القرص عندك فيه حاجتين منفصلتين، مش حاجة واحدة. فيه المساحة اللي بتخزّن محتوى الملفات، وفيه عدد خانات للملفات اسمها inodes. كل ملف بياخد خانة inode واحدة، مهما كان حجمه صغير. لو الخانات خلصت، أي ملف جديد بيفشل، حتى لو المساحة لسه نص فاضية. ده اللي بيخلّي df -h يطمّنك وdf -i يفضح المشكلة.
مثال يقرّب الصورة
تخيّل مكتبة كبيرة. فيه رفوف واسعة تكفي آلاف الكتب، دي المساحة. وفيه درج فهرسة فيه بطاقات، وكل كتاب لازم بطاقة فهرسة واحدة، دي الـ inodes. لو درج البطاقات خلص، مش هتقدر تضيف كتاب جديد، حتى لو الرفوف نص فاضية. الموظف هيقولك مفيش مكان، وهو يقصد مكان في الفهرس، مش على الرف. ده بالظبط اللي بيحصل مع السيرفر.
دلوقتي بالتعريف الدقيق: الـ inode تركيبة بيانات ثابتة الحجم على القرص، بتخزّن ميتاداتا الملف: الصلاحيات، المالك، الحجم، توقيتات التعديل، ومؤشرات لأماكن البيانات الفعلية على القرص. اسم الملف نفسه مش مخزّن جوّه الـ inode، هو مخزّن في الدليل (directory) اللي بيربط الاسم برقم الـ inode. وعدد الـ inodes بيتحدّد لحظة تهيئة نظام الملفات (mkfs) وبيفضل ثابت بعد كده.
ليه بيحصل أصلاً؟
في نظام ext4، القاعدة الافتراضية بتحجز inode واحد لكل 16 كيلوبايت تقريبًا من المساحة. يعني قرص 50 جيجا ممكن يكون عنده حوالي 3.2 مليون inode ثابتة. ده رقم كبير في الأحوال العادية، لكنه بيتبخّر بسرعة لو التطبيق بيولّد ملايين الملفات الصغيرة: جلسات PHP، ملفات كاش، لوجات مقطّعة، أو مجلد /tmp منسي بيتملّى كل يوم.
الافتراض هنا إن نظام ملفاتك ext4 أو ext3. لو XFS أو Btrfs، القصة مختلفة شوية، وهنرجعلها في آخر المقال.
إزاي تكتشفها في دقيقة
الأمر الأساسي: df -i. بيوريك عدد الـ inodes المستخدم والمتبقّي لكل نظام ملفات. دوّر على العمود IUse%، لو وصل 100% دي مشكلتك.
df -i /
# Filesystem Inodes IUsed IFree IUse% Mounted on
# /dev/sda1 3.2M 3.2M 0 100% /
بعد ما تتأكد، محتاج تعرف مين بياكل الـ inodes. الأمر ده بيجمّع الملفات حسب المجلد الأب ويرتّبهم تنازليًا، فبيوصّلك للمجلد المذنب على طول: