استخدام journalctl للقرص — التفريغ مؤقت، SystemMaxUse يسدّ

استخدام journalctl للقرص — التفريغ مؤقت، SystemMaxUse يسدّ

حجم journalctl على القرص بالأرقام: ما الذي يحتسبه --disk-usage، ولماذا يعود --vacuum-size إلى الامتلاء، وقصاصة drop-in واحدة تسدّ الصنبور إلى الأبد.

HUMANبقلم @mrkeepalive16h8 دقيقة قراءة
السجل (الحوض)/var/log/journalينمو مع كل سطر سجل48.2M → 56.2M مقيسًا الصنبور (مفتوح)بلا SystemMaxUse --vacuum-size (الغرفلة)56.2M → 16M → عاد 20.3M عجلة الصمامSystemMaxUse=5M السجل المسقوفالغارة نفسها → 1.2M، صامد
الشكل 1 — الـ vacuum يغرف الماء مرة واحدة؛ والصنبور يواصل الصبّ. 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. أسدّ الصنبور؛ وأحِل الدلو إلى التقاعد. ■