في عالم أنظمة التشغيل وخاصة لينكس، يعد فهم كيفية استخدام المساحة التخزينية أحد المهارات الأساسية التي تميز المستخدمين المحترفين عن المبتدئين. يأتي أمر du (اختصار لـ “Disk Usage”) كأحد الأدوات الأساسية التي لا غنى عنها لتحليل استخدام المساحة على مستوى الملفات والمجلدات.
ما الذي يجعل du أداة لا غنى عنها؟ تخيل أنك تعمل على خادم لينكس وتفاجئ بامتلاء المساحة التخزينية. بينما يظهر لك أمر df أن المساحة ممتلئة، لا تعرف أي الملفات أو المجلدات تستهلك هذه المساحة. هنا يأتي دور du كالمفتاح الذي يكشف لك بالضبط أين تذهب مساحتك التخزينية الثمينة.
سواء كنت مدير أنظمة تحتاج إلى مراقبة الخوادم، أو مطوراً تريد تحسين استخدام مساحة التطبيقات، أو مستخدم لينكس عادي يريد فهم نظامه بشكل أفضل، فهذا الدليل سيزودك بالمعرفة العملية التي تحتاجها.
الفهم الأساسي لأمر du
أمر du هو أداة سطر أوامر أساسية في أنظمة لينكس ويونكس تقوم بحساب وحالة استخدام المساحة التخزينية للملفات والمجلدات. على عكس df الذي يركز على أنظمة الملفات ككل، يأتي du ليقدم تحليلاً أكثر دقة على مستوى الدلائل والملفات الفردية.
يعود تاريخ du إلى الإصدارات الأولى من نظام يونكس في السبعينيات، حيث تم تطويره كجزء من حزمة الأدوات الأساسية لإدارة النظام. اليوم، يأتي du كجزء من حزمة GNU coreutils التي تتواجد في جميع توزيعات لينكس تقريباً.
البنية الأساسية لأمر du
الاستخدام الأساسي لأمر du يكون كالتالي:
du [options] [file/folder]
عند استدعاء du بدون أي خيارات أو وسائط، سيقوم بمسح المجلد الحالي وجميع المجلدات الفرعية داخله، مع إظهار المساحة المستخدمة لكل منها.
المخرجات الأساسية
لننظر إلى مثال عملي:
du /var/log
ستشاهد مخرجات تشبه (تختلف حسب نظامك):
4 /var/log/private
8 /var/log/samba
132 /var/log/installer
1724 /var/log/journal
10264 /var/log
هنا نرى أن:
– كل سطر يعرض المساحة المستخدمة (بالكيلوبايت) متبوعة باسم المجلد
– الأرقام تراكمية، فمثلاً الرقم بجانب `/var/log` يشمل كل ما بداخله
– يتم عرض المجلدات الفرعية أولاً ثم المجلدات الأب التي تحتويها
الوحدات المستخدمة في مخرجات الأمر du
بشكل افتراضي، يعرض du المساحة بالكيلوبايت (KB)، ولكن يمكن تغيير ذلك باستخدام خيارات خاصة:
du -h /var/log # يظهر الأحجام بصيغة يسهل قراءتها (KB, MB, GB)
du -k /var/log # يظهر بالكيلوبايت (الافتراضي)
du -m /var/log # يظهر بالميغابايت
du -b /var/log # يظهر بالبايت
على سبيل المثال، du -h قد يعطي:
4.0K /var/log/private
8.0K /var/log/samba
132K /var/log/installer
1.7M /var/log/journal
10M /var/log
الفرق بين أمر du و أمر df
من المهم فهم الاختلاف الجوهري بين هاتين الأداتين:
– أمر df: يعطي نظرة عامة على مساحة أنظمة الملفات المثبتة
– أمر du: يحسب المساحة الفعلية المستخدمة من قبل الملفات والمجلدات
في بعض الأحيان قد تلاحظ اختلافاً بين المساحة التي يظهرها df على أنها مستخدمة وتلك التي يحسبها du. هذا الاختلاف يمكن أن يكون بسبب:
– الملفات المحذوفة التي لا تزال مفتوحة من قبل عمليات
– المساحة المحجوزة لنظام الملفات نفسه (مثل المساحة المحجوزة لـ root في ext4)
– أخطاء في نظام الملفات
في الأقسام التالية، سنتعمق في الخيارات المختلفة لـ du وكيفية استخدامها في سيناريوهات عملية متنوعة.
الخيارات الأساسية والمتقدمة لأمر du
لتحقيق أقصى استفادة من أمر du، من الضروري فهم الخيارات المختلفة التي تتيح تخصيص مخرجاته حسب الحاجة. هذه الخيارات تتراوح بين الأساسية البسيطة إلى المتقدمة القوية التي تمكنك من تحليل دقيق لاستخدام المساحة.
1. عرض الأحجام بطريقة مقروءة (-h)
الخيار -h (أو –human-readable) يحول الأحجام إلى صيغة يسهل فهمها (KB, MB, GB, TB):
du -h /var
مخرجات نموذجية:
12K /var/local
36K /var/mail
156K /var/opt
2.3M /var/cache
14M /var/log
86M /var/lib
103M /var
2. تحديد مستوى العمق (–max-depth)
للبحث على مستوى معين فقط في شجرة المجلدات:
du -h --max-depth=1 /var
هذا سيظهر المساحة للمجلدات المباشرة داخل `/var` فقط دون التعمق أكثر.
3. عرض الحجم الإجمالي (-s أو –summarize)
لرؤية الحجم الإجمالي لمجلد دون تفصيل محتوياته:
du -sh /var/log
المخرجة:
14M /var/log
4. فرز النتائج حسب الحجم
بدمج du مع sort يمكنك ترتيب المجلدات حسب حجمها:
du -h /var | sort -h
الخيار -h في sort يعني أنه سيفسر الأرقام مع وحدات القياس (K, M, G).
5. استثناء أنواع معينة من الملفات (–exclude)
لحساب المساحة باستثناء ملفات بنمط معين:
du -h --exclude='*.log' /var
6. حساب المساحة بما في ذلك الملفات المخفية (-a أو –all)
الخيار -a يجعل du يظهر الملفات أيضاً وليس فقط المجلدات:
du -ah /var/log | head -n 5
7. متابعة الروابط الرمزية (-L أو –dereference)
بشكل افتراضي، du لا يتابع الروابط الرمزية، ولكن مع -L:
du -Lh /path/with/links
8. عرض الوقت والتاريخ (–time)
لإضافة وقت التعديل الأخير للملفات:
du -ha --time /var/log | head -n 5
9. حساب المساحة بدقة أعلى (–block-size)
لضبط حجم الكتلة المستخدم في الحساب:
du --block-size=1M /var # حساب المساحة بالميغابايت مباشرة
10. التحديث المتكرر (–repeat)
في بعض إصدارات du يمكنك جعله يعرض المساحة بشكل متكرر:
du --repeat=5 /var/log # يعرض المساحة كل 5 ثواني
11. عداد العقد (–inodes)
لحساب عدد العقد (inodes) بدلاً من المساحة:
du --inodes /var
12. تنبيهات السعة (–threshold)
لجعل `du` يحذر عند تجاوز حجم معين:
du -h --threshold=100M /var
13. أقصى عمق (–max-depth=N)
للبحث حتى مستوى معين من الدلائل الفرعية فقط:
du -h --max-depth=2 /
14. الروابط الصلبة (-l أو –count-links)
بحساب حجم الروابط الصلبة كمحتوى أصلي:
du -lh /path
15. التحديث المستمر (-c أو –total)
لإظهار المجموع الكلي في النهاية:
du -ch /var/log/*
16. استثناء المجلدات (–exclude-from=FILE)
للاستثناء بناء على قائمة في ملف:
du -h --exclude-from=exclude_list.txt /
17. عرض النتائج بشكل مختصر (–summarize)
لإظهار ملخص فقط دون تفاصيل:
du -s /var
18. التخصيص باستخدام –output
لاختيار حقول محددة للإظهار:
du --output=size,name /var
الآن بعد أن أصبحنا على دراية بالخيارات الرئيسية، دعونا ننتقل إلى سيناريوهات عملية توضح كيفية تطبيق هذه المعرفة في مواقف حقيقية.
سيناريوهات عملية لأمر du
أمر `du` يظهر قوته الحقيقية عندما تطبقه على مشاكل العالم الحقيقي. فيما يلي بعض السيناريوهات العملية الشائعة التي توضح كيفية استخدام `du` بفعالية.
1. العثور على أكبر الملفات والمجلدات في النظام
للعثور على أكبر 10 مجلدات في نظامك:
du -h / | sort -rh | head -10
هذا الأمر:
1. يحسب أحجام جميع المجلدات بدءاً من الجذر (`/`)
2. يرتب النتائج تنازلياً حسب الحجم
3. يظهر أول 10 نتائج فقط
مخرج نموذجي قد يظهر:
24G /
12G /home
8.4G /home/user
5.2G /usr
3.6G /var
2.8G /var/lib
1.9G /usr/lib
1.4G /opt
1.2G /var/log
987M /var/cache
2. تحليل استخدام المساحة في مجلد معين
لتحليل المساحة في مجلد `/var/log` بدقة:
du -h --max-depth=1 /var/log | sort -h
هنا نستخدم `–max-depth=1` للحد من العمق، ثم `sort -h` لترتيب النتائج.
3. حساب المساحة المستخدمة بواسطة مستخدم معين
لحساب مساحة جميع الملفات المملوكة للمستخدم `ahmed`:
find / -user ahmed -type f -exec du -ch {} + | grep total$
هذا الأمر:
1. يبحث عن جميع الملفات المملوكة للمستخدم `ahmed`
2. يحسب حجمها باستخدام `du`
3. يظهر المجموع الكلي في النهاية
4. البحث عن ملفات كبيرة محددة
للعثور على جميع الملفات الأكبر من 100MB في مجلد `/home`:
find /home -type f -size +100M -exec du -h {} + | sort -h
5. مقارنة محتويات مجلدين
لمقارنة أحجام المجلدات بين دليلين:
diff <(du -sh /path/to/folder1/* | sort) <(du -sh /path/to/folder2/* | sort)
6. تتبع نمو المساحة مع الوقت
لإنشاء سجل تاريخي للحجم الحالي لمجلد `/var/log`:
echo "$(date): $(du -sh /var/log)" >> storage_log.txt
يمكن إضافة هذا السطر إلى crontab ليتنفذ يومياً.
7. تحليل أحجام الملفات حسب النوع
لحساب المساحة الإجمالية التي تشغلها ملفات بأمتداد معين (مثال: `.log`):
find /var -name "*.log" -exec du -ch {} + | grep total$
8. استثناء مجلدات محددة من الحساب
لحساب مساحة المسار `/` باستثناء `/home` و`/mnt`:
du -h --exclude=/home --exclude=/mnt /
9. حساب المساحة المستخدمة بواسطة عمليات النشر القديمة
في بيئات التطوير، لحساب مساحة إصدارات التطبيق القديمة:
du -h --max-depth=1 /var/www/releases | sort -h
10. مراقبة تغيرات المساحة بمرور الوقت
للمراقبة الفورية لتغيرات المساحة في مجلد `/tmp`:
watch -n 5 'du -h /tmp | sort -h'
هذا سيعرض تحديثاً كل 5 ثواني.
11. حساب المساحة الفعلية لجميع الصور في النظام
لحساب المساحة التي تشغلها جميع ملفات الصور:
find / -type f \( -name "*.jpg" -o -name "*.png" -o -name "*.gif" \) -exec du -ch {} + | grep total$
12. تحديد الملفات التي تساهم في امتلاء نظام الملفات
عندما يبلغ `df` عن امتلاء المساحة ولكن `du` لا يظهر الاستخدام المتوقع، قد تكون الملفات المحذوفة المفتوحة هي السبب:
lsof +L1 | grep deleted
13. تحليل استهلاك المساحة لمجموعة من الخوادم
لجمع بيانات المساحة من عدة خوادم:
for server in server1 server2 server3; do
ssh $server "du -sh /var/log" >> all_servers.log
done
14. قياس المساحة المستخدمة من قبل حزم النظام
على أنظمة دبيان/أوبنتو:
dpkg-query -Wf '${Installed-Size}\t${Package}\n' | sort -n
على أنظمة RHEL/CentOS:
rpm -qa --queryformat '%{size} %{name}\n' | sort -n
15. إنشاء تقرير شهري لاستخدام المساحة
إنشاء سكربت `/usr/local/bin/disk_usage_report.sh`:
#!/bin/bash
REPORT="/var/log/disk_usage_$(date +%Y-%m).log"
echo "==== Disk Usage Report $(date) ====" >> $REPORT
echo "Top directories in /:" >> $REPORT
du -h --max-depth=1 / 2>/dev/null | sort -h | tail -n 20 >> $REPORT
echo "" >> $REPORT
ثم أضفه إلى crontab ليعمل شهرياً.
في القسم التالي، سنتعرف على كيفية دمج `du` مع أدوات أخرى لتحليلات أكثر قوة، وحل بعض المشاكل الشائعة التي قد تواجهها أثناء استخدام الأداة.
دمج du مع أدوات أخرى وحل المشكلات
قوة `du` الحقيقية تظهر عند دمجه مع أدوات لينكس الأخرى في أنابيب (pipes) وأسكريبتات. هذا الفصل يغطي تقنيات متقدمة لتحليلات أكثر تفصيلاً وحل المشاكل الشائعة.
1. دمج du مع awk لتحليل متقدم
يمكن استخدام awk لتحليل مخرجات du بمرونة أكبر. مثال لحساب مجموع أحجام محددة:
du -h /var | awk '
BEGIN { total=0 }
{ if ($1 ~ /[0-9.]+[MG]/) {
size=$1;
sub(/[^0-9.]+/, "", size);
if ($1 ~ /G/) total+=size*1024;
else if ($1 ~ /M/) total+=size;
}
}
END { printf "Total: %.2f MB\n", total }'
هذا السكربت يحسب المجموع الكلي للمساحة في /var بالميغابايت.
2. إنشاء تمثيل مرئي لأحجام المجلدات
باستخدام `du` مع بعض الأوامر الأخرى، يمكن إنشاء تمثيل شريطي بسيط:
du -h --max-depth=1 / | grep -v "\.$" | sort -h |
awk '{printf("%-40s: ",$2); for(i=0;i<$1*10;i++) printf "|"; print ""}'
3. مراقبة التغيرات مع watch
للمراقبة المستمرة للتغيرات في أحجام المجلدات:
watch -n 10 'du -h --max-depth=1 /var/log | sort -h'
هذا الأمر سيعيد تشغيل `du` كل 10 ثواني، مما يسمح لك بمشاهدة التغيرات في أحجام المجلدات.
4. البحث عن أنماط الاستخدام غير الطبيعية
سكربت للبحث عن مجلدات نمت بشكل غير متوقع:
#!/bin/bash
BASE_DIR="/var"
THRESHOLD=20 # نسبة النمو المئوية التي تعتبر غير عادية
prev_file=”/tmp/du_prev”
curr_file=”/tmp/du_curr”
حفظ القيم الحاليةdu -s ${BASE_DIR}/* > $curr_file
if [ -f $prev_file ]; then
while read -r line; do
dir=$(echo $line | awk '{print $2}')
curr_size=$(echo $line | awk '{print $1}')
prev_line=$(grep "$dir" $prev_file)
if [ -n "$prev_line" ]; then
prev_size=$(echo $prev_line | awk '{print $1}')
growth=$(( (curr_size - prev_size) * 100 / prev_size ))
if [ $growth -ge $THRESHOLD ]; then
echo "Warning: $dir grew by $growth% (from $prev_size to $curr_size KB)"
fi
fi
done < $curr_file fi mv $curr_file $prev_file
5. الفرق بين du و df وحل التناقضات
عندما تظهر df مساحة مستخدمة أكبر بكثير مما يظهره du، الأسباب المحتملة تشمل:
1. ملفات محذوفة لا تزال مفتوحة:
حلول:
lsof +L1
# أو إعادة تشغيل الخدمة التي تحتفظ بالملفات المفتوحة
2. مساحة محجوزة لنظام الملفات:
Reserved
3. أخطاء نظام الملفات:
sudo fsck /dev/sda1
6. معالجة المشاكل مع الروابط الرمزية
عندما تكون الروابط الرمزية مشكلة، استخدم:
du -Lh /path # لمتابعة الروابط الرمزية
du -lh /path # لحساب الروابط الرمزية كملفات منفصلة
7. تحليل استخدام المساحة في أنظمة الملفات الشبكية (NFS)
عند استخدام `du` على أنظمة ملفات شبكية، قد تحتاج إلى:
du -sh --block-size=1M /nfs/mount # تجنب استخدام الوحدات القابلة للقراءة
لأن التنسيق البشري قد يسبب مشاكل في بعض تطبيقات NFS.
8. التعامل مع أسماء الملفات ذات المسافات
عند التعامل مع مسارات تحتوي على مسافات:
find /path -type f -print0 | xargs -0 du -h | sort -h
الخيار -print0 و -0 يضمنان التعامل الصحيح مع المسافات.
9. تسريع du على أنظمة ملفات كبيرة
لتحسين الأداء على أنظمة ملفات كبيرة:
du -hsx / # -x يمنع تجاوز حدود نظام الملفات
du -hs --timeout=10 /path # في بعض الإصدارات
10. استخدام du مع ncdu لواجهة تفاعلية
ncdu هو واجهة تفاعلية مبنية على du:
sudo apt install ncdu # لأوبنتو/دبيان
sudo yum install ncdu # لـRHEL/CentOS
ncdu /
11. تحليل مساحة المستخدمين
لحساب المساحة المستخدمة من قبل كل مستخدم:
sudo du -sh /home/* | sort -h
أو بشكل أكثر تفصيلاً:
for user in /home/*; do
echo -n "$user: ";
sudo du -sh "$user" | cut -f1;
done | sort -h
12. تتبع تغيرات المساحة عبر الوقت
إنشاء سكربت /usr/local/bin/track_disk.sh:
#!/bin/bash
LOG="/var/log/disk_usage_$(date +%Y-%m-%d).log"
echo "=== Disk Usage Report $(date) ===" > $LOG
echo "Top 20 directories in /:" >> $LOG
du -h --max-depth=1 / 2>/dev/null | sort -h | tail -n 20 >> $LOG
echo "" >> $LOG
ثم أضفه إلى crontab:
0 0 * * * /usr/local/bin/track_disk.sh
13. حساب المساحة المستخدمة من قبل عمليات معينة
لحساب المساحة المستخدمة من قبل جميع عمليات Apache:
ps aux | grep apache | awk '{print $2}' | xargs -I {} lsof -p {} | grep REG | awk '{print $NF}' | xargs du -ch | grep total
بعد هذه الجولة الشاملة في عالم أمر du في لينكس، أصبح لديك الآن فهم قوي لكيفية استخدام هذه الأداة القوية لتحليل إدارة المساحة التخزينية. ابدأ اليوم بتطبيق ما تعلمته. جرب بعض الأوامر على نظامك، أنشئ بعض الأسكريبتات البسيطة، وراقب كيف يمكن لهذه الأداة البسيطة القوية أن تحدث فرقاً في كيفية تفاعلك مع نظام لينكس الخاص بك.
المراجع والموارد
للتوسع في موضوع أمر du وإدارة المساحة في لينكس، إليك بعض المصادر الموثوقة:
الصفحة الرسمية لـ GNU Coreutils (تضم du):
https://www.gnu.org/software/coreutils/manual/coreutils.html#du-invocation
صفحة man الرسمية (متوفرة على نظامك عبر man du)
كتاب “The Linux Command Line” لـ William Shotts – مصدر ممتاز لتعلم أوامر لينكس
Stack Exchange – Unix & Linux:
https://unix.stackexchange.com/questions/tagged/du
موقع Linux Journey للتعلم التفاعلي:
https://linuxjourney.com/lesson/disk-usage-du-command
كتاب “Linux Administration Handbook” – دليل شامل لإدارة لينكس