استخدام journalctl للقرص — التفريغ مؤقت، SystemMaxUse يسدّ
حجم journalctl على القرص بالأرقام: ما الذي يحتسبه --disk-usage، ولماذا يعود --vacuum-size إلى الامتلاء، وقصاصة drop-in واحدة تسدّ الصنبور إلى الأبد.
SystemMaxUse هو الصمام على الأنبوب.ماذا يقيس journalctl --disk-usage حقًا؟
جملة الأطروحة: journalctl --disk-usage يبلّغ حجم ملفات سجلك على القرص — المؤرشفة والنشطة — الساكنة في /var/log/journal على أي تثبيت دائم. إنه قراءة: لا يحذف شيئًا، ولا يعيد تشغيل شيئًا. على آلة المنصّة، قبل إضافة أي سجلات:
$ sudo journalctl --disk-usage
Archived and active journals take up 48.2M in the file system.
$ ls /var/log/journal/
fd766b9ea5a540e68e6c43ea74f98a15 ← one directory per machine-id
تحقق: Arch الأصلي يشحن /var/log/journal موجودةً — وStorage=auto (الافتراضي المعلّق #Storage=persistent) تعني الدوامية من الإقلاع الأول. شغّله بـ sudo: بلا عضوية في adm/systemd-journal/wheel لا تغطي قراءة المستخدم العادي إلا ملفاته هو — قاست المنصّة 16M كمستخدم و48.2M كجذر في الثانية نفسها.
شيئان يوقعان الناس هنا. أولًا، الرقم يشمل السجل النشط — الملف الذي يكتب فيه journald الآن — فحتى الإقلاع الجديد ليس صفرًا أبدًا. ثانيًا، إن لم تكن /var/log/journal موجودةً كان journald volatile: كل شيء يسكن /run/log/journal (tmpfs)، قراءاته شبه صفرية، ويموت عند إعادة التشغيل. تلك ليست «سجلًا صغيرًا» — تلك بلا تاريخ سجل على الإطلاق. sudo mkdir -p /var/log/journal && sudo systemctl restart systemd-journald يحوّلك إلى الدوامي.
لماذا يواصل السجل النمو؟
لأن الصنبور مفتوح بالتصميم. يجيء /etc/systemd/journald.conf الأصلي وكل مقابض الحجم معلّقة:
$ grep -E '^#(Storage|Compress|SystemMaxUse)' /etc/systemd/journald.conf
#Storage=persistent
#Compress=yes
#SystemMaxUse=
تحقق: منقول من صندوق المنصّة — SystemMaxUse موجودة في الملف كتعليق فقط؛ يقرأها journald كغير مضبوطة ولا يفرض سقفًا.
بلا سقف، لا شيء يتقاعد ولا شيء يُسقَّف: خدمة ثرثارة أو cron صاخب واحد يضيف ميغابايتات يوميًا، إلى الأبد. وأثبتت المنصّة الميلَ بالطريقة الشريفة — اغرقها، وافرض تدويرًا، واقرأ العدّاد من جديد:
$ for i in $(seq 1 400); do logger -t benchflood "entry $i: …~1KB line…"; done
$ sudo journalctl -t benchflood --no-pager | wc -l # all 400 landed
400
$ sudo journalctl --rotate # close the active file
$ sudo journalctl --disk-usage
Archived and active journals take up 56.2M in the file system.
تحقق: 48.2M → 56.2M من غارة صغيرة واحدة. ويختبئ في ذلك إيصالان: النمو لا يظهر إلا عند التدوير — يخصص journald الملف النشط مسبقًا بقطع 8M، فالغارات داخل الملف لا تحرّك العدّاد حتى يُغلق الملف — وdu -sh /var/log/journal (57M) يوافق رقم journald نفسه ضمن التقريب.
كانت الغارة 400 سطر كيلوبايتي — خطأ تقريب أمام ضجيج يومي في صندوق حقيقي. الحجم ليس المبتغى؛ بل الاتجاه: بلا سقف تعني أن الحالة المستقرة الوحيدة هي «المزيد»، بخطوات 8M لم تخترها أبدًا.
هل يحذف journalctl --vacuum-size إلى الأبد؟
لا — والاعتراف مطبوع في مخرجات الأمر نفسه. الـ vacuum هو دلو الغرفلة: غرفةٌ واحدة، ارتياحٌ فوري، وبنيويًا لا شيء:
$ sudo journalctl --vacuum-size=1M
Deleted archived journal …/system@…-adf16c8ac48706f4.journal~ (8M).
Deleted archived journal …/system@d1d286….journal (8.2M).
Deleted archived journal …/user-1000@…journal~ (8M).
Deleted archived journal …/system@…c3f9281226bbfdc4.journal~ (8M).
Deleted archived journal …/system@…5244-….journal (4.4M).
Deleted archived journal …/user-1000@…57b6-….journal (3.4M).
Deleted archived journal …/system@…59c8-….journal (976K).
Deleted archived journal …/user-1000@…59cb-….journal (296K).
Vacuuming done, freed 41.4M of archived journals from /var/log/journal/fd766b9e….
$ sudo journalctl --disk-usage
Archived and active journals take up 16M in the file system.
تحقق: قائمة الحذف و«Vacuuming done, freed 41.4M» هي مخرجات --vacuum-size نفسها، منقولة حرفيًا — هبط 56.2M إلى 16M.
أدقّق في الأرضية، فهي الجزء الذي لا تنتبه إليه مهام cron أبدًا: 16M بقيت. تلك هما ملفا السجل النشطان — system.journal وuser-1000.journal، مخصصان مسبقًا 8M لكلٍّ منهما — و--vacuum-size لا يحذف إلا الملفات المؤرشفة. لا يقدر الـ vacuum على القطع تحت ما يكتب فيه journald حاليًا، مهما صغّرتَ الرقم الذي تمرّره.
ثم اختبار الامتلاء من جديد — الجزء الذي لا يشغّله أحد. الغارة نفسها ثانيةً، تدوير، قراءة:
$ sudo journalctl --disk-usage
Archived and active journals take up 20.3M in the file system.
$ sudo du -sh /var/log/journal
21M /var/log/journal
تحقق: 16M → 20.3M من غارة مطابقة من 400 سطر — حذف الـ vacuum التاريخ؛ ولم يغيّر شيئًا في الغد.
لهذا يبقى cron التفريغ علاجًا شعبيًا لا يكاد ينجح: يقاتل الصنبور بدلو، وفق جدول، إلى الأبد. إن شغّل الـ cron --vacuum-size=100M أسبوعيًا ووصل السجل إلى 1G منتصف الأسبوع، دفع القرّاء ثمن 1G أسبوعًا كاملًا. وكل تمريرة حادثةُ فقد بيانات صامتة — الأسطر المحرَّرة هي الأقدم، تاريخك الذي تمدّ يدك إليه تحديدًا وقت الحادثة.
كيف تسقّف حجم السجل نهائيًا؟
قصاصة واحدة، إعادة تشغيل واحدة — ثم يفرض journald السقف بنفسه، عند كل تدوير، إلى الأبد:
$ sudo mkdir -p /etc/systemd/journald.conf.d
$ sudo tee /etc/systemd/journald.conf.d/size.conf >/dev/null <<'EOF'
[Journal]
SystemMaxUse=5M
EOF
$ sudo systemctl restart systemd-journald
$ sudo systemd-analyze cat-config systemd/journald.conf | grep SystemMaxUse
SystemMaxUse=5M
تحقق: systemd-analyze cat-config يطبع الإعداد المدموج — SystemMaxUse=5M في القصاصة حيّة، لا مجرّد كتابة في ملف لا يقرأه أحد.
والآن الغارة المطابقة التي رفعت السجل المفرَّغ إلى 20.3M:
$ for i in $(seq 1 400); do logger -t benchflood "entry $i: …"; done
$ sudo journalctl --rotate
$ sudo journalctl --disk-usage
Archived and active journals take up 1.2M in the file system.
$ sudo ls -lh /var/log/journal/*/ | awk '{print $5, $9}'
640K system.journal
640K user-1000.journal
$ sudo journalctl -t benchflood --no-pager | wc -l
0
تحقق: الغارة نفسها التي رفعت سجلًا بلا سقف إلى 20.3M تركت المسقوفَ عند 1.2M — دار journald، وطبّق السقف، وحذف الغارة كليًا: 400 مدخلة داخلة، 0 محفوظة، بلا cron ولا إشراف.
لاحظ ما فعله السقف ولم يقدر عليه التفريغ: نزل تحت أرضية 16M. لا يلمس الـ vacuum الملفات النشطة أبدًا، لكن السقف يحكم التدوير نفسه — يعيد journald بناء ملفات نشطة أصغر متى صار السقف حيًّا. ذاك هو الفرق بين الغرفلة والسباكة.
اختر رقمك بالمساحة الاحتياطية لا بالذوق: تحقق من حجم اليوم بـ journalctl --disk-usage، ثم اضبط SystemMaxUse على نحو أقصى ما قد ترغب بالاحتفاظ به — 100M أو 200M وفير لمحطة عمل؛ والخادم المشغول قد يريد 1G. وSystemKeepFree=1G هو الشقيق «الحزام والشنطة»: أسقِّف السجل وواعدْ نظام الملفات بأرضية. المحذوف هو دائمًا أقدم الملفات المؤرشفة — يحتفظ journald بالملف النشط وبما يتسع تحت سقفك.
العلاج، بالترتيب
الغرفلة ضد الصمام، بنظرة واحدة
| الأداة | ماذا تفعل | متى تنفع | مقيسًا على المنصّة |
|---|---|---|---|
--vacuum-size=1M | يحذف أقدم المجلات المؤرشفة نزولًا إلى حجمٍ ما، مرة واحدة | الطوارئ: القرص ممتلئ الآن | 56.2M → 16M (حرّر 41.4M)، وعاد إلى 20.3M بالغارة المطابقة التالية |
--vacuum-time=2weeks | الوظيفة نفسها، بالعمر بدل الحجم | تنظيف أرشيف لمرة واحدة | الشكل نفسه — لمرة واحدة، لا شيء يمنع النمو من جديد |
قصاصة drop-in SystemMaxUse=5M | يفرض journald السقف بنفسه عند كل تدوير | دائم: الصنبور يسدّ | الغارة المطابقة حُجزت عند 1.2M — مدخلات الغارة حُذفت كليًا (400 داخلة، 0 محفوظة) |
SystemKeepFree=1G | وعدْ نظام الملفات بمساحة حرة، مهما كان السقف | أقراص صغيرة، إلى جانب السقف | روح الإعداد الافتراضي، صريحة الآن |
«الـ vacuum يغرف الحوض؛ والـ SystemMaxUse يسدّ الصنبور. الكل يغرف — والحوض يفوز افتراضيًا.»
ما لم تغطّه المنصّة
مقيسًا: آلة Arch افتراضية واحدة جديدة (systemd 262, 262.1-1-arch) — الاستهلاك الأساسي، غارة من 400 سطر بتدوير مفروض، --vacuum-size=1M بمخرجاته الكاملة، غارة امتلاء مطابقة، قصاصة SystemMaxUse=5M + إعادة تشغيل مع قراءة عكسية للإعداد المدموج، غارة مطابقة تحت السقف، وشهود du/ls على مستوى الملفات عند كل خطوة. غير المقيس: تفاعل SystemMaxFileSize/عدّ الملفات تحت السقف، مجلات LogNamespace= لكل وحدة، التسجيل البعيد (systemd-journal-remote)، الختم الأمامي الآمن (Seal=)، والاحتفاظ الزمني (MaxRetentionSec). ركبت أسطر الغارة مقبس syslog الذي يقصّ الأسطر الطويلة (~1 KB وصلت) — لا صلة له بالحسبة، إذ كل رقم أعلاه هو --disk-usage الخاص بـ journald نفسه مقابلًا بـ du. حملت الأرضية أرشيفَ إقلاع سابق (48.2M مسكونة، كأي صندوق حقيقي). آلة واحدة، بناء واحد: قراءة الصنبور ضد الغرفلة هي الجزء القابل للنقل؛ و--disk-usage خاصتك هي الحكم.
منصّة موثّقة يدويًا · systemd 262 (262.1-1-arch) · آلة Arch افتراضية جديدة · آخر اختبار 2026-11-12
رقمٌ واحد يقولك الحقيقة — journalctl --disk-usage. سطرٌ واحد يبقيها صادقة — SystemMaxUse. أسدّ الصنبور؛ وأحِل الدلو إلى التقاعد. ■