أساسيات systemd: العمل مع الخدمات والوحدات والسجل

مقدمة

في السنوات الأخيرة، تحولت توزيعات Linux تدريجيًا من أنظمة التشغيل الأخرى إلى systemd. توفر مجموعة أدوات systemd نموذجًا سريعًا ومرنًا للتهيئة لإدارة الجهاز بأكمله منذ الإقلاع.

في هذا الدليل، سنقدم لك نظرة سريعة على الأوامر الأكثر أهمية التي سترغب في معرفتها لإدارة خادم يعمل بـ systemd. يجب أن تعمل هذه الأوامر على أي خادم ينفذ systemd (أي إصدار من نظام التشغيل في أوبونتو 15.04 أو أعلى، دبيان 8، سنتوس 7، فيدورا 15 أو أحدث). دعونا نبدأ.

إدارة الوحدات الأساسية

الكائن الأساسي الذي يديره ويتصرف فيه systemd هو “الوحدة”. يمكن أن تكون الوحدات من أنواع عديدة، ولكن النوع الأكثر شيوعًا هو “الخدمة” (المشار إليها بملف وحدة ينتهي بـ .service). لإدارة الخدمات على خادم يعمل بـ systemd، فإن الأداة الرئيسية لدينا هي أمر systemctl.

لدينا كل الأوامر العادية لنظام التشغيل الأساسي تتطابق مع أفعال مكافئة باستخدام أمر systemctl. سنستخدم وحدة الخدمة nginx.service كمثال (ستحتاج إلى تثبيت Nginx باستخدام مدير الحزم الخاص بك للحصول على هذا الملف الخدمي).

على سبيل المثال، يمكننا بدء الخدمة عن طريق كتابة:

  1. sudo systemctl start nginx.service

يمكننا إيقافه مرة أخرى عن طريق الكتابة:

  1. sudo systemctl stop nginx.service

لإعادة تشغيل الخدمة، يمكننا كتابة:

  1. sudo systemctl restart nginx.service

لمحاولة إعادة تحميل الخدمة دون التأثير على الوظائف العادية، يمكننا كتابة:

  1. sudo systemctl reload nginx.service

تمكين أو تعطيل الوحدات

بشكل افتراضي، لا تُبدأ معظم ملفات وحدة systemd تلقائيًا عند التمهيد. لتكوين هذه الوظيفة، تحتاج إلى “تمكين” الوحدة. يربط هذا الأمر الوحدة بـ “هدف” التمهيد معين، مما يتسبب في تنشيطه عند بدء تشغيل هذا الهدف.

لتمكين خدمة للبدء تلقائيًا عند التمهيد، اكتب:

  1. sudo systemctl enable nginx.service

إذا كنت ترغب في تعطيل الخدمة مرة أخرى، اكتب:

  1. sudo systemctl disable nginx.service

الحصول على نظرة عامة على حالة النظام

هناك الكثير من المعلومات التي يمكننا الحصول عليها من خادم systemd للحصول على نظرة عامة على حالة النظام.

على سبيل المثال، للحصول على جميع ملفات الوحدة التي قامت systemd بتسجيلها كـ “نشطة”، اكتب (يمكنك في الواقع ترك list-units لأن هذا سلوك systemctl الافتراضي):

  1. systemctl list-units

لإدراج جميع الوحدات التي قام systemd بتحميلها أو محاولة تحميلها في الذاكرة، بما في ذلك تلك التي ليست نشطة حاليًا، أضف التبديل --all:

  1. systemctl list-units --all

لعرض جميع الوحدات المثبتة في النظام، بما في ذلك تلك التي لم يحاول systemd تحميلها في الذاكرة، اكتب:

  1. systemctl list-unit-files

عرض المعلومات الأساسية للسجل

A systemd component called journald collects and manages journal entries from all parts of the system. This is basically log information from applications and the kernel.

لرؤية جميع سجلات الحدث، بدءًا من أقدم إدخال، اكتب:

  1. journalctl

بشكل افتراضي، سيُظهر لك هذا الإدخالات من التمهيد الحالي والسابق إذا تم تكوين journald لحفظ سجلات التمهيد السابق. تقوم بعض التوزيعات بتمكين هذا بشكل افتراضي، بينما تمنع البعض الآخر (لتمكين هذا، قم بتحرير ملف /etc/systemd/journald.conf وتعيين الخيار Storage= إلى “persistent”، أو قم بإنشاء الدليل الدائم عبر كتابة sudo mkdir -p /var/log/journal).

إذا كنت ترغب فقط في رؤية سجلات السجل من التمهيد الحالي، أضف علامة -b:

  1. journalctl -b

لرؤية فقط رسائل النواة، مثل تلك التي يتم تمثيلها عادة بواسطة dmesg، يمكنك استخدام علامة -k:

  1. journalctl -k

مرة أخرى، يمكنك تقييد هذا فقط للتمهيد الحالي عن طريق إلحاق العلامة -b:

  1. journalctl -k -b

استعلام وحدات الولايات والسجلات

على الرغم من أن الأوامر أعلاه أعطتك وصولًا إلى حالة النظام العامة، يمكنك أيضًا الحصول على معلومات حول حالة الوحدات الفردية.

لرؤية نظرة عامة على الحالة الحالية لوحدة ما، يمكنك استخدام الخيار status مع أمر systemctl. سيظهر لك هذا ما إذا كانت الوحدة نشطة، ومعلومات حول العملية، وآخر إدخالات السجل:

  1. systemctl status nginx.service

لرؤية جميع إدخالات السجل للوحدة المعنية، قم بإعطاء الخيار -u مع اسم الوحدة إلى أمر journalctl:

  1. journalctl -u nginx.service

كما هو الحال دائمًا، يمكنك تحديد الإدخالات لتشغيل النظام الحالي عن طريق إضافة العلامة -b:

  1. journalctl -b -u nginx.service

فحص الوحدات وملفات الوحدات

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

A unit file contains the parameters that systemd uses to manage and run a unit. To see the full contents of a unit file, type:

  1. systemctl cat nginx.service

لرؤية شجرة الاعتماد لوحدة (التي ستحاول systemd تنشيطها عند بدء تشغيل الوحدة)، اكتب:

  1. systemctl list-dependencies nginx.service

سيُظهر هذا الوحدات التابعة، مع وحدات target موسعة بشكل تكراري. لتوسيع جميع الوحدات التابعة بشكل تكراري، قم بتمرير العلم --all:

  1. systemctl list-dependencies --all nginx.service

وأخيرًا، لرؤية التفاصيل على مستوى منخفض من إعدادات الوحدة على النظام، يمكنك استخدام الخيار show:

  1. systemctl show nginx.service

سيمنحك هذا قيمة كل معلمة يتم إدارتها بواسطة systemd.

تعديل ملفات الوحدة

إذا كنت بحاجة إلى إجراء تعديل على ملف وحدة، يسمح لك systemd بإجراء التغييرات من خلال أمر systemctl نفسه بحيث لا يتعين عليك الانتقال إلى الموقع الفعلي على القرص.

لإضافة مقطع ملف وحدة، الذي يمكن استخدامه لإضافة أو تجاوز الإعدادات في ملف الوحدة الافتراضي، قم ببساطة بالاستدعاء edit على الوحدة:

  1. sudo systemctl edit nginx.service

إذا كنت تفضل تعديل محتوى كامل ملف الوحدة بدلاً من إنشاء مقطع، قم بتمرير العلم --full:

  1. sudo systemctl edit --full nginx.service

بعد تعديل ملف الوحدة، يجب إعادة تحميل عملية systemd ذاتيًا لالتقاط التغييرات:

  1. sudo systemctl daemon-reload

استخدام الأهداف (مستويات التشغيل)

وظيفة أخرى لنظام التهيئة الأولية هي تحويل الخادم نفسه بين حالات مختلفة. يُشير أنظمة التهيئة الأولية التقليدية عادةً إلى هذه باسم “مستويات التشغيل”، مما يسمح للنظام بأن يكون في مستوى تشغيل واحد فقط في أي وقت.

في systemd، تُستخدم “الأهداف” بدلاً من ذلك. الأهداف هي نقاط تزامن بشكل أساسي يمكن للخادم استخدامها لجلب الخادم إلى حالة محددة. يمكن ربط ملفات الخدمة والوحدات الأخرى بالهدف، ويمكن أن تكون العديد من الأهداف نشطة في نفس الوقت.

لعرض جميع الأهداف المتاحة على النظام الخاص بك، اكتب:

  1. systemctl list-unit-files --type=target

لعرض الهدف الافتراضي الذي يحاول systemd الوصول إليه عند التمهيد (الذي بدوره يبدأ جميع ملفات الوحدات التي تشكل شجرة الاعتمادات لتلك الهدف)، اكتب:

  1. systemctl get-default

يمكنك تغيير الهدف الافتراضي الذي سيتم استخدامه عند التمهيد باستخدام الخيار set-default:

  1. sudo systemctl set-default multi-user.target

لرؤية الوحدات المرتبطة بالهدف، يمكنك كتابة:

  1. systemctl list-dependencies multi-user.target

يمكنك تعديل حالة النظام للانتقال بين الأهداف باستخدام الخيار isolate. سيتم ذلك بإيقاف أي وحدات غير مرتبطة بالهدف المحدد. تأكد من أن الهدف الذي تقوم بعزله لا يتوقف عن أي خدمات أساسية:

  1. sudo systemctl isolate multi-user.target

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

لبعض الحالات الرئيسية التي يمكن للنظام الانتقال إليها، تتوفر اختصارات. على سبيل المثال، لإيقاف تشغيل الخادم، يمكنك كتابة:

  1. sudo systemctl poweroff

إذا كنت ترغب في إعادة تشغيل النظام بدلاً من ذلك، يمكن القيام بذلك عن طريق كتابة:

  1. sudo systemctl reboot

يمكنك الإقلاع في وضع الإنقاذ عن طريق كتابة:

  1. sudo systemctl rescue

يرجى ملاحظة أن معظم أنظمة التشغيل تتضمن اختصارات تقليدية لهذه العمليات بحيث يمكنك ببساطة كتابة sudo poweroff أو sudo reboot دون استخدام systemctl. ومع ذلك، لا يمكن ضمان إعداد هذا على جميع الأنظمة.

الخطوات التالية

حتى الآن، يجب أن تكون تعرف الأساسيات حول كيفية إدارة خادم يستخدم systemd. ومع ذلك، هناك المزيد لتعلمه كلما احتاجت احتياجاتك للتوسع. فيما يلي روابط لدليل معلومات أعمق حول بعض المكونات التي ناقشناها في هذا الدليل:

من خلال تعلم كيفية استغلال مزايا نظام البدء الخاص بك، يمكنك التحكم في حالة أجهزتك وإدارة خدماتك وعملياتك بسهولة أكبر.

Source:
https://www.digitalocean.com/community/tutorials/systemd-essentials-working-with-services-units-and-the-journal