ديف أوبس

أساسيات نظام Systemd في لينكس

أساسيات Systemd: العمل مع الخدمات، الوحدات Units، واليوميات Journal

في عالم أنظمة تشغيل لينكس الحديثة، أصبح نظام إدارة الخدمات Systemd أحد الركائز الأساسية التي تتحكم في بدء وتشغيل وإدارة خدمات النظام بشكل فعال ومنظم. نظام Systemd لم يقتصر فقط على استبدال النظام القديم init، بل قدم منظومة متكاملة لإدارة النظام والخدمات بشكل موحد ومتقدم، مما جعل عملية التحكم في الخدمات والعمليات والنظام أكثر مرونة وسهولة، مع تحسين كبير في الأداء والاعتمادية. في هذا المقال، سنتناول بشكل موسع أساسيات Systemd، مع التركيز على مكونات النظام المهمة مثل الخدمات (Services)، الوحدات (Units)، واليوميات (Journal).


مقدمة عن Systemd

Systemd هو نظام إدارة الخدمات والنظام في أنظمة لينكس الحديثة، صمم ليعمل كـ “PID 1” أو العملية الأولى التي تُشغل عند إقلاع النظام. هدف Systemd هو تبسيط وتعزيز عملية بدء النظام، إدارة الخدمات، ومراقبة أداء النظام، بالإضافة إلى تقديم آليات متقدمة لليومية (Logging) والتزامن بين العمليات.

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


مفهوم الوحدات Units في Systemd

في Systemd، يتم تمثيل كل عنصر من عناصر النظام أو الخدمة كوحدة تسمى Unit. الوحدة هي مفهوم شامل يعبر عن أي كائن يمكن إدارته بواسطة Systemd. تشمل الوحدات أنواعًا مختلفة بحسب طبيعة العنصر:

  • Service Units: تمثل خدمات النظام التي تعمل في الخلفية (daemons).

  • Socket Units: تدير مآخذ الشبكة التي تنتظر الاتصالات.

  • Target Units: تُستخدم لتجميع وحدات متعددة معًا في نقطة بداية مشتركة.

  • Device Units: تمثل أجهزة مادية أو وهمية متصلة بالنظام.

  • Mount Units: تمثل نقاط تركيب الملفات (mount points).

  • Automount Units: تدير نقاط تركيب تلقائية.

  • Timer Units: تُستخدم لتنفيذ مهام مجدولة بشكل متكرر أو عند وقت محدد.

  • Swap Units: تدير مساحة التبادل (swap space).

  • Path Units: تراقب تغييرات الملفات أو الدلائل وتطلق إجراءات معينة.

  • Slice Units: تُستخدم لتنظيم الموارد (cgroups) بين العمليات.

بنية ملف الوحدة (Unit File)

يتم تعريف كل وحدة في ملف نصي بصيغة معينة، ويحتوي هذا الملف على عدة أقسام رئيسية:

  • [Unit]: يحتوي على وصف الوحدة، المتطلبات، والتبعيات.

  • [Service]: خاص بوحدات الخدمات ويحدد كيفية تشغيل الخدمة.

  • [Install]: يحدد كيفية تمكين أو تعطيل الوحدة أثناء عملية الإقلاع.

مثال مبسط لوحدة خدمة:

ini
[Unit] Description=خدمة ويب بسيطة After=network.target [Service] Type=simple ExecStart=/usr/bin/my-web-service [Install] WantedBy=multi-user.target

إدارة الخدمات Service Management

الخدمات هي أهم أنواع الوحدات في Systemd، حيث تمثل البرامج التي تعمل في الخلفية، مثل خوادم الويب، قواعد البيانات، وخدمات النظام المختلفة.

تشغيل، إيقاف، وإعادة تحميل الخدمات

يمكن التحكم في الخدمات باستخدام الأمر systemctl، الذي هو أداة التحكم الأساسية في Systemd.

  • تشغيل الخدمة:

pgsql
systemctl start service-name.service
  • إيقاف الخدمة:

arduino
systemctl stop service-name.service
  • إعادة تشغيل الخدمة:

pgsql
systemctl restart service-name.service
  • إعادة تحميل إعدادات الخدمة دون إيقافها:

nginx
systemctl reload service-name.service
  • تمكين الخدمة عند الإقلاع:

pgsql
systemctl enable service-name.service
  • تعطيل الخدمة من الإقلاع التلقائي:

pgsql
systemctl disable service-name.service

حالة الخدمة ومراقبتها

لمعرفة حالة أي خدمة، يمكن استخدام الأمر:

lua
systemctl status service-name.service

سيعرض هذا الأمر معلومات تفصيلية تشمل حالة الخدمة، آخر الرسائل المسجلة، ومدة التشغيل.

أنواع خدمات Service Types

Systemd يدعم عدة أنواع للخدمات، وهي مهمة لفهم كيفية إدارة العملية داخل النظام:

  • simple: يُفترض أن العملية تبدأ فورًا ولا تحتاج إلى مزيد من التنسيق.

  • forking: يستخدم للخدمات التي تقوم بعمل fork (إنشاء عملية فرعية) عند التشغيل، وهو أسلوب تقليدي.

  • oneshot: خدمات تنفذ مهمة محددة ثم تنتهي، مثل مهام الإعداد أو التهيئة.

  • dbus: خدمات تعتمد على D-Bus لتشغيلها.

  • notify: الخدمات التي ترسل إشعارًا إلى Systemd عند الانتهاء من الإقلاع.

  • idle: يتم تشغيل الخدمة عندما يكون النظام خاملًا.


نظام اليوميات Journal

من الميزات القوية التي يقدمها Systemd هي نظام اليوميات المدمج المعروف بـ journal، والذي يعتبر بديلاً متطورًا عن نظام التسجيل التقليدي syslog.

مميزات Journal

  • تخزين مركزي: يجمع كافة سجلات النظام والخدمات في مكان واحد.

  • هيكلية البيانات: يتم تسجيل البيانات بطريقة منظمة تسمح بالبحث والفهرسة حسب الوقت، الخدمة، المعرفات، وغيرها.

  • تكامل كامل مع Systemd: حيث يتم تسجيل كل نشاط ووظيفة في النظام بدقة.

  • دعم تنسيقات متعددة: يمكن عرض السجلات بصيغ متعددة مع إمكانية تصديرها.

  • التخزين في الذاكرة أو القرص: يمكن تخزين السجلات مؤقتًا في الذاكرة أو بشكل دائم على القرص.

عرض السجلات باستخدام journalctl

الأداة الأساسية للوصول إلى اليوميات هي journalctl، التي تسمح بعرض وتصفية السجلات بمرونة عالية.

  • عرض كامل السجلات:

nginx
journalctl
  • عرض سجلات خدمة محددة:

nginx
journalctl -u service-name.service
  • عرض السجلات الجديدة في الوقت الحقيقي:

nginx
journalctl -f
  • عرض السجلات حسب وقت محدد:

bash
journalctl --since "2025-05-01 10:00:00" --until "2025-05-01 12:00:00"
  • عرض السجلات مع مستوى خطورة معين:

css
journalctl -p err

ضبط حجم وسلوك Journal

يمكن تعديل إعدادات Journal في ملف /etc/systemd/journald.conf لتحديد حجم السجلات، مكان التخزين، وأسلوب الضغط. يمكن مثلاً تحديد حجم التخزين المؤقت أو تفعيل الضغط لتوفير المساحة.


تنظيم التبعية Dependency Management

واحدة من أهم خصائص Systemd هي إدارة التبعية بين الوحدات، والتي تسمح بتسلسل بدء الخدمات بشكل دقيق ومرن. يمكن تحديد أن وحدة ما يجب أن تبدأ فقط بعد وحدة أخرى، أو أن وحدتين مرتبطتان بشكل متزامن.

أنواع التبعيات الشائعة في ملفات الوحدات:

  • Requires=: الوحدة تعتمد على وحدة أخرى، وإذا لم تكن هذه الوحدة متاحة، لن تعمل.

  • Wants=: الوحدة تفضل أن تكون الوحدة الأخرى متاحة، لكنها ليست ضرورية.

  • Before= و After=: ترتيب بدء الوحدات، حيث يمكن تحديد أن وحدة تبدأ قبل أو بعد وحدة أخرى.

  • Conflicts=: تعارض بين وحدتين، بحيث لا يمكن تشغيلهما معًا.


التحكم في الإقلاع Boot Control

يتيح Systemd التحكم الدقيق في مراحل إقلاع النظام عن طريق استخدام وحدات من نوع Target، التي تمثل مجموعة من الخدمات التي يجب أن تعمل في مرحلة معينة.

أمثلة على Target Units:

  • basic.target: مرحلة التهيئة الأساسية.

  • multi-user.target: المرحلة التي توفر بيئة متعددة المستخدمين بدون واجهة رسومية.

  • graphical.target: المرحلة التي تبدأ فيها واجهة المستخدم الرسومية.

  • default.target: الوحدة الافتراضية التي يحددها النظام للإقلاع إليها.

يمكن استخدام الأمر:

arduino
systemctl get-default

لمعرفة الوحدة الافتراضية للإقلاع، ويمكن تغييرها باستخدام:

cpp
systemctl set-default graphical.target

جدولة المهام Timer Units

تعتبر Timer Units بديلًا متقدمًا عن Cron، حيث يمكن من خلالها جدولة تنفيذ المهام بشكل دقيق ومتكامل مع نظام Systemd.

مثال على ملف Timer

ini
[Unit] Description=تشغيل مهمة كل 15 دقيقة [Timer] OnBootSec=10min OnUnitActiveSec=15min Unit=my-task.service [Install] WantedBy=timers.target

الجدول التالي يوضح مقارنة بين بعض المفاهيم والخصائص في Systemd و init التقليدي:

الخاصية Systemd init التقليدي (SysVinit)
إدارة الخدمات تعتمد على ملفات وحدات (Unit files) تعتمد على سكريبتات shell
التبعية إدارة تبعيات معقدة (Requires, Wants) بسيطة وغير ديناميكية
تسجيل السجلات نظام journal متكامل ومتقدم تعتمد على syslog منفصل
الأداء أسرع بفضل بدء متوازي وخاصيات ذكية أبطأ لبدء الخدمات بشكل متسلسل
الجدولة Timer units متكامل Cron منفصل
مرونة التحكم دعم واسع لأنواع متعددة من الوحدات محدود على الخدمات فقط

خلاصة

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


مصادر ومراجع


هذا المقال يغطي بشكل شامل أساسيات نظام Systemd في بيئة لينكس الحديثة، ويوفر قاعدة معرفية قوية للتعامل مع الخدمات، الوحدات، واليوميات بطريقة احترافية وفعالة.