| SYSTEMD.UNIT(5) | systemd.unit | SYSTEMD.UNIT(5) |
الاسم¶
systemd.unit - ضبط الوحدة
موجز¶
service.service، socket.socket، device.device، mount.mount، automount.automount، swap.swap، target.target، path.path، timer.timer، slice.slice، scope.scope
مسار بحث وحدات النظام¶
مسار بحث وحدات المستخدم¶
الوصف¶
ملف الوحدة هو ملف نصي بسيط بنمط ini يُرمِّز معلومات حول خدمة، أو مقبس، أو جهاز، أو نقطة وصل، أو نقطة وصل آلي، أو ملف أو قسم تبديل، أو هدف بدء التشغيل، أو مسار نظام ملفات مراقَب، أو مؤقت مُتحكَّم فيه ومُراقَب بواسطة systemd(1)، أو شريحة إدارة موارد، أو مجموعة من العمليات المنشأة خارجيًا. طالع systemd.syntax(7) للحصول على وصف عام للصيغة.
تُدرج صفحة الدليل هذه خيارات الضبط الشائعة لجميع أنواع الوحدات. يجب ضبط هذه الخيارات في قِسمي [Unit] أو [Install] من ملفات الوحدة.
بالإضافة إلى قسمي [Unit] و [Install] العامَّين الموصوفين هنا، قد تحتوي كل وحدة على قسم خاص بنوعها، على سبيل المثال [Service] لوحدة خدمة. طالع صفحات الدليل ذات الصلة لمزيد من المعلومات: systemd.service(5)، systemd.socket(5)، systemd.device(5)، systemd.mount(5)، systemd.automount(5)، systemd.swap(5)، systemd.target(5)، systemd.path(5)، systemd.timer(5)، systemd.slice(5)، systemd.scope(5).
تُحمَّل ملفات الوحدات من مجموعة مسارات مُحدَّدة أثناء التجميع، وموصوفة في القسم التالي.
تتكون أسماء الوحدات الصالحة من "بادئة اسم الوحدة"، ولاحقة تحدد نوع الوحدة تبدأ بنقطة. يجب أن تتكون "بادئة اسم الوحدة" من حرف واحد أو أكثر من الأحرف الصالحة (أحرف ASCII، أرقام، ":"، "-"، "_"، "."، و "\"). يجب ألا يتجاوز الطول الإجمالي لاسم الوحدة بما في ذلك اللاحقة 255 حرفًا. يجب أن تكون لاحقة نوع الوحدة واحدة من ".service"، ".socket"، ".device"، ".mount"، ".automount"، ".swap"، ".target"، ".path"، ".timer"، ".slice"، أو ".scope".
يمكن إعطاء معلمات لأسماء الوحدات بواسطة وسيط واحد يُسمى "اسم النسخة". بعد ذلك تُنشأ الوحدة بناءً على "ملف قالب" يعمل كتعريف لخدمات متعددة أو وحدات أخرى. يجب أن تحتوي وحدة القالب على "@" واحدة في نهاية بادئة اسم الوحدة (مباشرة قبل لاحقة النوع). يتشكل اسم الوحدة الكاملة عن طريق إدراج اسم النسخة بين "@" ولاحقة نوع الوحدة. في ملف الوحدة نفسه، قد يُشار إلى معلمة النسخة باستخدام "%i" ومحددات أخرى، طالع أدناه.
قد تحتوي ملفات الوحدات على خيارات إضافية علاوةً على تلك المُدرجة هنا. إذا واجه systemd خياراً غير معروف، فسيُكتب رسالة سجل تحذيرية ولكنه سيستمر في تحميل الوحدة. إذا سُبق اسم خيار أو قسم بالبادئة X-، فسيتم تجاهله تماماً بواسطة systemd. الخيارات داخل قسم مُتجاهل لا تحتاج إلى هذه البادئة. يمكن للتطبيقات استخدام هذا لتضمين معلومات إضافية في ملفات الوحدات. للوصول إلى تلك الخيارات، تحتاج التطبيقات إلى تحليل ملفات الوحدات بنفسها.
يمكن إعطاء الوحدات اسماً مستعاراً (امتلاك اسم بديل)، عن طريق إنشاء رابط رمزي (symlink) من الاسم الجديد إلى الاسم الحالي في أحد مسارات بحث الوحدات. على سبيل المثال، تمتلك systemd-networkd.service الاسم المستعار dbus-org.freedesktop.network1.service، الذي أُنشئ أثناء التثبيت كرابط رمزي، لذا عندما يُطلب من systemd عبر D-Bus تحميل dbus-org.freedesktop.network1.service، فسيُحمل systemd-networkd.service. كمثال آخر، default.target — هدف النظام المبدئي الذي يُبدأ عند الإقلاع — يُشار إليه عادةً باسم مستعار إما multi-user.target أو graphical.target لاختيار ما يُبدأ بشكل مبدئي. يمكن استخدام الأسماء المستعارة في أوامر مثل disable، وstart، وstop، وstatus، وما يشابهها، وفي جميع توجيهات اعتمادية الوحدات، بما في ذلك Wants=، وRequires=، وBefore=، وAfter=. لا يمكن استخدام الأسماء المستعارة مع الأمر preset.
تخضع الأسماء المستعارة للقيود التالية: لا يمكن منح اسم مستعار لوحدة من نوع معين (".service"، ".socket"، ...) إلا بواسطة اسم له نفس لاحقة النوع. الوحدة العادية (ليست قالباً أو مثيلاً)، لا يمكن منحها اسماً مستعاراً إلا بواسطة اسم عادي. مثيل القالب لا يمكن منح اسم مستعار له إلا بواسطة مثيل قالب آخر، ويجب أن يكون جزء المثيل متطابقاً. يمكن منح اسم مستعار للقالب بواسطة قالب آخر (وفي هذه الحالة ينطبق الاسم المستعار على جميع مثيلات القالب). كحالة خاصة، يمكن أن يكون مثيل القالب (مثل "alias@inst.service") رابطاً رمزياً لقالب مختلف (مثل "template@inst.service"). في تلك الحالة، يُمنح هذا المثيل المحدد فقط اسماً مستعاراً، بينما لا تُمنح المثيلات الأخرى للقالب (مثل "alias@foo.service"، "alias@bar.service") أسماء مستعارة. تحافظ تلك القواعد على المتطلب بأن المثيل (إن وُجد) مُعرَّف دائماً بشكل فريد لوحدة معينة وجميع أسمائها المستعارة. يجب أن يشير هدف الرابط الرمزي للاسم المستعار إلى موقع ملف وحدة صالح، أي يجب أن يطابق اسم هدف الرابط الرمزي اسم مصدر الرابط الرمزي كما وُصف، ويجب أن يكون مسار الوجهة في أحد مسارات بحث الوحدات، انظر قسم مسار تحميل ملف الوحدة أدناه لمزيد من التفاصيل. لاحظ أن الملف الهدف قد لا يكون موجوداً، أي قد يكون الرابط الرمزي معلقاً.
يمكن لملفات الوحدات تحديد أسماء مستعارة من خلال توجيه Alias= في القسم [Install]. عند تفعيل الوحدة، ستُنشأ روابط رمزية لتلك الأسماء، وتُزال عند تعطيل الوحدة. على سبيل المثال، تحدد reboot.target التوجيه Alias=ctrl-alt-del.target، لذا عند التفعيل، سيُنشأ الرابط الرمزي /etc/systemd/system/ctrl-alt-del.target المشير إلى ملف reboot.target، وعند استدعاء Ctrl+Alt+Del، سيبحث systemd عن ctrl-alt-del.target، ويتبع الرابط الرمزي إلى reboot.target، ويُنفذ reboot.service كجزء من ذلك الهدف. لا ينظر systemd إلى القسم [Install] إطلاقاً أثناء التشغيل العادي، لذا فإن أي توجيهات في ذلك القسم لها تأثير فقط من خلال الروابط الرمزية المُنشأة أثناء التفعيل.
إلى جانب ملف الوحدة foo.service، قد يوجد الدليل foo.service.wants/. وتُضاف جميع ملفات الوحدات المرتبطة ارتباطًا رمزيًا من هذا الدليل ضمناً كتبعيات من النوع Wants= إلى الوحدة. توجد وظيفة مماثلة لتبعيات النوع Requires= أيضًا، حيث تكون لاحقة الدليل هي .requires/ في هذه الحالة. هذه الوظيفة مفيدة لربط الوحدات ببدء تشغيل وحدات أخرى، دون الحاجة إلى تعديل ملفات الوحدات الخاصة بها. للحصول على تفاصيل حول دلالات Wants= و Requires=، انظر أدناه. الطريقة المفضلة لإنشاء روابط رمزية في الدلائل .wants/ أو .requires/ هي عن طريق تحديد التبعية في قسم [Install] للوحدة المستهدفة، وإنشاء الرابط الرمزي في نظام الملفات باستخدام أوامر enable أو preset لـ systemctl(1). يمكن أن يكون الهدف وحدة عادية (سواء عادية أو مثيل محدد لوحدة قالب). في حالة ما إذا كانت الوحدة المصدر هي قالب، يمكن أن يكون الهدف أيضًا قالبًا، وفي هذه الحالة سيتم ”نقل“ المثيل إلى الوحدة الهدف لتشكيل مثيل وحدة صالح . يجب أن يشير هدف الروابط الرمزية في .wants/ أو .requires/ إلى موقع ملف وحدة صالح، أي أن اسم هدف الرابط الرمزي يجب أن يفي بالمتطلبات الموضحة، ويجب أن يكون مسار الوجهة في أحد مسارات البحث عن الوحدات، انظر قسم مسار تحميل ملف الوحدة أدناه لمزيد من التفاصيل. لاحظ أن الملف الهدف قد لا يكون موجودًا، أي أن الرابط الرمزي قد يكون معلقًا.
جنباً إلى جنب مع ملف الوحدة foo.service، قد يوجد مجلد "إضافات" (drop-in) foo.service.d/. جميع الملفات ذات اللاحقة ".conf" من هذا المجلد سيتم دمجها بالترتيب الأبجدي الرقمي وتحليلها بعد تحليل ملف الوحدة الرئيسي نفسه. هذا مفيد لتغيير أو إضافة إعدادات تهيئة لوحدة ما، دون الحاجة إلى تعديل ملفات الوحدة. يجب أن يحتوي كل ملف إضافات على ترويسات أقسام مناسبة. بالنسبة للوحدات المُنشأة، ستبحث هذه المنطقية أولاً عن المجلد الفرعي للمثيل ".d/" (مثل "foo@bar.service.d/") وتقرأ ملفات ".conf" الخاصة به، متبوعة بالمجلد الفرعي للقالب ".d/" (مثل "foo@.service.d/") وملفات ".conf" الموجودة هناك. علاوة على ذلك، بالنسبة لأسماء الوحدات التي تحتوي على شرطات ("-")، يتم البحث أيضًا في مجموعة المجلدات المُنشأة عن طريق اقتطاع اسم الوحدة بشكل متكرر بعد كل شرطة. وتحديداً، لاسم الوحدة foo-bar-baz.service لا يتم البحث في مجلد الإضافات العادي foo-bar-baz.service.d/ فحسب، بل أيضًا في كلا المجلدين foo-bar-.service.d/ و foo-.service.d/. هذا مفيد لتعريف إضافات مشتركة لمجموعة من الوحدات ذات الصلة، التي تبدأ أسماؤها ببادئة مشتركة. هذا المخطط مفيد بشكل خاص لوحدات الوصل (mount)، والوصل التلقائي (automount)، والشريحة (slice)، التي بُنيت بنية تسميتها المنتظمة حول الشرطات كفواصل للمكونات. لاحظ أن ملفات الإضافات ذات الأسماء المتطابقة الموجودة في مستوى أدنى في تسلسل البادئة الهرمي تلغي تلك الموجودة في مستوى أعلى، أي أن foo-bar-.service.d/10-override.conf يلغي foo-.service.d/10-override.conf.
في حالات الأسماء المستعارة للوحدات (الموصوفة أعلاه)، تُحمل الإضافات للاسم المُستعار وجميع الأسماء المستعارة. في مثال default.target الذي يشير اسماً مستعاراً إلى graphical.target، ستُقرأ جميع المجلدات التالية: default.target.d/، وdefault.target.wants/، وdefault.target.requires/، وgraphical.target.d/، وgraphical.target.wants/، وgraphical.target.requires/. بالنسبة للقوالب، تُقرأ إضافات القالب، وأي أسماء مستعارة للقالب، ومثيل القالب، وجميع مثيلات الأسماء المستعارة. عندما يُمنح مثيل قالب محدد اسماً مستعاراً فقط، تُقرأ الإضافات للقالب الهدف، ومثيل القالب الهدف، ومثيل قالب الاسم المستعار.
بالإضافة إلى /etc/systemd/system، يمكن وضع مجلدات الإضافات ".d/" لخدمات النظام في المجلدات /usr/lib/systemd/system أو /run/systemd/system. ملفات الإضافات في /etc/ لها الأولوية على تلك الموجودة في /run/ والتي بدورها لها الأولوية على تلك الموجودة في /usr/lib/. ملفات الإضافات تحت أي من هذه المجلدات لها الأولوية على ملفات الوحدات أينما وُجدت. تُطبق ملفات الإضافات المتعددة ذات الأسماء المختلفة بالترتيب المعجمي، بغض النظر عن المجلد الذي توجد فيه.
تدعم الوحدات أيضًا إضافات ذات مستوى أعلى بـ type.d/، حيث يمكن أن يكون type مثلاً "service" أو "socket"، مما يسمح بتغيير أو إضافة إعدادات لجميع ملفات الوحدات المقابلة على النظام. تتبع تنسيقات وأولويات تطبيق إعدادات الإضافات ما هو مُعرَّف أعلاه. الملفات في type.d/ لها أولوية أقل مقارنة بالملفات في مجلدات التجاوز الخاصة باسم محدد. تطبق القواعد المعتادة: تُطبق ملفات الإضافات المتعددة ذات الأسماء المختلفة بالترتيب المعجمي، بغض النظر عن المجلد الذي توجد فيه، لذا لا ينطبق ملف في type.d/ على وحدة ما إلا إذا لم تكن هناك إضافات أو أقنعة (masks) بهذا الاسم في مجلدات ذات أولوية أعلى. انظر الأمثلة.
لاحظ أنه بينما يوفر systemd نظام اعتمادية مرناً بين الوحدات، يُنصح باستخدام هذه الوظيفة باعتدال فقط والاعتماد بدلاً من ذلك على تقنيات مثل التنشيط المستند إلى الناقل (bus-based) أو المستند إلى المقبس (socket-based) التي تجعل الاعتماديات ضمنية، مما يؤدي إلى نظام أبسط وأكثر مرونة.
كما ذُكر أعلاه، قد يتم إنشاء مثيل للوحدة من ملف قالب. هذا يسمح بإنشاء وحدات متعددة من ملف تهيئة واحد. إذا بحث systemd عن ملف تهيئة لوحدة ما، فسيقوم أولاً بالبحث عن اسم الوحدة الحرفي في نظام الملفات. إذا لم يؤد ذلك إلى نجاح وكان اسم الوحدة يحتوي على حرف "@"، فسيقوم systemd بالبحث عن قالب وحدة يشارك نفس الاسم ولكن مع إزالة سلسلة المثيل (أي الجزء الموجود بين حرف "@" واللاحقة). مثال: إذا طُلبت الخدمة getty@tty3.service ولم يُعثر على ملف بهذا الاسم، سيبحث systemd عن getty@.service ويُنشئ مثيل خدمة من ملف التهيئة ذلك إذا وُجد.
للإشارة إلى سلسلة المثيل من داخل ملف التهيئة، يمكنك استخدام المُحدِّد الخاص "%i" في العديد من خيارات التهيئة. انظر أدناه للحصول على التفاصيل.
إذا كان ملف الوحدة فارغاً (أي حجمه 0) أو كان مربوطاً رمزياً بـ /dev/null، فلن تُحمل تهيئته وسيظهر بحالة تحميل "مُقنَّع" (masked)، ولا يمكن تنشيطه. استخدم هذا كطريقة فعالة لتعطيل وحدة بالكامل، مما يجعل من المستحيل بدء تشغيلها حتى يدوياً.
الملفات (بما في ذلك المجلدات) ذات الأسماء التي تطابق أنماطاً معينة يتم تجاهلها بشكل عام. يشمل ذلك الأسماء التي تبدأ بـ "." أو تنتهي بـ ".ignore".
تنسيق ملف الوحدة مشمول ضمن وعد قابلية نقل واستقرار الواجهة[1].
هروب السلاسل النصية للإدراج في أسماء الوحدات¶
في بعض الأحيان يكون من المفيد تحويل سلاسل نصية عشوائية إلى أسماء وحدات. لتسهيل ذلك، تُستخدم طريقة هروب السلاسل النصية، لتعيين سلاسل تحتوي على قيم بايت عشوائية (باستثناء NUL) إلى أسماء وحدات صالحة ومجموعة محارفها المقيدة. حالة خاصة شائعة هي أسماء الوحدات التي تعكس مسارات إلى كائنات في تراتبية نظام الملفات. مثال: وحدة الجهاز dev-sda.device تشير إلى جهاز بعقدة جهاز /dev/sda في نظام الملفات.
تعمل خوارزمية الهروب كما يلي: بالنظر إلى سلسلة نصية، يتم استبدال أي حرف "/" بـ "-"، ويتم استبدال جميع المحارف الأخرى التي ليست محارف ASCII أبجدية رقمية، أو ":"، أو "_"، أو "." بـ هروب "\x2d" بنمط لغة C. بالإضافة إلى ذلك، يتم استبدال "." بهروب بنمط C مماثل عندما تظهر كأول محرف في السلسلة المُهربة.
عندما يُصنَّف المُدخل كمسار نظام ملفات مطلق، يتم توسيع هذه الخوارزمية قليلاً: يتم ترميز المسار إلى المجلد الجذر "/" كشرطة مفردة "-". بالإضافة إلى ذلك، تُزال أي محارف "/" بادئة أو لاحقة أو مكررة من السلسلة قبل التحويل. مثال: /foo//bar/baz/ تصبح "foo-bar-baz".
هذا الهروب قابل للعكس تماماً، طالما أنه من المعروف ما إذا كانت السلسلة المُهربة مساراً (نتائج عكس الهروب مختلفة للمسارات والسلاسل غير المسارات). يمكن استخدام الأمر systemd-escape(1) لتطبيق وعكس الهروب على سلاسل عشوائية. استخدم systemd-escape --path لهروب مسارات السلاسل، وsystemd-escape بدون --path في الحالات الأخرى.
اعتمادات آلية¶
التبعيات الضمنية¶
يتم تأسيس عدد من اعتماديات الوحدات ضمنياً، اعتماداً على نوع الوحدة وتهيئة الوحدة. هذه الاعتماديات الضمنية يمكن أن تجعل ملف تهيئة الوحدة أنظف. بالنسبة للاعتماديات الضمنية في كل نوع وحدة، يرجى الرجوع إلى قسم "الاعتماديات الضمنية" في صفحات دليل man المقابلة.
على سبيل المثال، وحدات الخدمة ذات Type=dbus تكتسب آلياً اعتماديات من نوع Requires= وAfter= على dbus.socket. انظر systemd.service(5) للحصول على التفاصيل.
الاعتمادات المبدئية¶
الاعتماديات المبدئية مشابهة للاعتماديات الضمنية، ولكن يمكن تشغيلها وإيقافها عن طريق ضبط DefaultDependencies= على yes (القيمة المبدئية) وno، بينما الاعتماديات الضمنية تكون سارية المفعول دائماً. انظر قسم "الاعتماديات المبدئية" في صفحات دليل man المقابلة لتأثير تفعيل DefaultDependencies= في كل أنواع الوحدات.
على سبيل المثال، ستُكمل وحدات الهدف جميع الاعتماديات المُهيأة من نوع Wants= أو Requires= باعتماديات من نوع After=. انظر systemd.target(5) للحصول على التفاصيل. لاحظ أنه يمكن إلغاء هذا السلوك عن طريق ضبط DefaultDependencies=no في الوحدات المحددة، أو يمكن تجاوزه بشكل انتقائي عبر اعتمادية Before= صريحة.
مسار تحميل ملف الوحدة¶
تُحمَّل ملفات الوحدات من مجموعة مسارات حُدِّدت أثناء التجميع، وموصوفة في الجدولين أدناه. ملفات الوحدات الموجودة في المجلدات المدرجة أولًا تتخطى الملفات التي تحمل نفس الاسم في المجلدات الأدنى في القائمة [2].
عند ضبط المتغير $SYSTEMD_UNIT_PATH، يتخطى محتوى هذا المتغير مسار تحميل الوحدات. إذا انتهى $SYSTEMD_UNIT_PATH بمكون فارغ (":")، فسيُلحَق مسار تحميل الوحدات المبدئي بمحتوى المتغير.
Table 1. مسار
التحميل
عند
التشغيل في
وضع النظام
(--system).
| المسار | الوصف |
| /etc/systemd/system.control | الإعدادات المستمرة والعابرة المنشأة باستخدام واجهة برمجة تطبيقات dbus |
| /run/systemd/system.control | |
| /run/systemd/transient | إعدادات ديناميكية للوحدات العابرة |
| /run/systemd/generator.early | وحدات مولَّدة ذات أولوية عالية (انظر early-dir في systemd.generator(7)) |
| /etc/systemd/system | وحدات النظام التي أنشأها المدير |
| /run/systemd/system | وحدات وقت التشغيل |
| /run/systemd/generator | وحدات مولَّدة ذات أولوية متوسطة (انظر normal-dir في systemd.generator(7)) |
| /usr/local/lib/systemd/system | وحدات النظام التي ثبَّتها المدير |
| /usr/lib/systemd/system | وحدات النظام التي ثبَّتها مدير حزم التوزيعة |
| /run/systemd/generator.late | وحدات مولَّدة ذات أولوية منخفضة (انظر late-dir في systemd.generator(7)) |
Table 2. مسار
التحميل
عند
التشغيل في
وضع
المستخدم
(--user).
| المسار | الوصف |
| $XDG_CONFIG_HOME/systemd/user.control or ~/.config/systemd/user.control | الإعدادات المستمرة والعابرة المنشأة باستخدام واجهة برمجة تطبيقات dbus (يُستخدم $XDG_CONFIG_HOME إذا ضُبِط، وإلا يُستخدم ~/.config) |
| $XDG_RUNTIME_DIR/systemd/user.control | |
| $XDG_RUNTIME_DIR/systemd/transient | إعدادات ديناميكية للوحدات العابرة |
| $XDG_RUNTIME_DIR/systemd/generator.early | وحدات مولَّدة ذات أولوية عالية (انظر early-dir في systemd.generator(7)) |
| $XDG_CONFIG_HOME/systemd/user or $HOME/.config/systemd/user | إعدادات المستخدم (يُستخدم $XDG_CONFIG_HOME إذا ضُبِط، وإلا يُستخدم ~/.config) |
| $XDG_CONFIG_DIRS/systemd/user or /etc/xdg/systemd/user | مجلدات الإعدادات الإضافية كما حددتها مواصفات مجلدات XDG الأساسية (يُستخدم $XDG_CONFIG_DIRS إذا ضُبِط، وإلا يُستخدم /etc/xdg) |
| /etc/systemd/user | وحدات المستخدم التي أنشأها المدير |
| $XDG_RUNTIME_DIR/systemd/user | وحدات وقت التشغيل (تُستخدم فقط عند ضبط $XDG_RUNTIME_DIR) |
| /run/systemd/user | وحدات وقت التشغيل |
| $XDG_RUNTIME_DIR/systemd/generator | وحدات مولَّدة ذات أولوية متوسطة (انظر normal-dir في systemd.generator(7)) |
| $XDG_DATA_HOME/systemd/user or $HOME/.local/share/systemd/user | وحدات الحزم التي ثُبِّتت في مجلد المنزل (يُستخدم $XDG_DATA_HOME إذا ضُبِط، وإلا يُستخدم ~/.local/share) |
| $XDG_DATA_DIRS/systemd/user or /usr/local/share/systemd/user and /usr/share/systemd/user | مجلدات البيانات الإضافية كما حددتها مواصفات مجلدات XDG الأساسية (يُستخدم $XDG_DATA_DIRS إذا ضُبِط، وإلا يُستخدم /usr/local/share و /usr/share) |
| $dir/systemd/user for each $dir in $XDG_DATA_DIRS | مواقع إضافية لوحدات المستخدم المثبتة، موقع واحد لكل إدخال في $XDG_DATA_DIRS |
| /usr/local/lib/systemd/user | وحدات المستخدم التي ثبَّتها المدير |
| /usr/lib/systemd/user | وحدات المستخدم التي ثبَّتها مدير حزم التوزيعة |
| $XDG_RUNTIME_DIR/systemd/generator.late | وحدات مولَّدة ذات أولوية منخفضة (انظر late-dir في systemd.generator(7)) |
قد تُعزَّز أو تُغيَّر مجموعة مسارات التحميل لنسخة مدير المستخدم باستخدام متغيرات بيئة مختلفة. ويمكن بدورها ضبط متغيرات البيئة باستخدام مولدات البيئة، انظر systemd.environment-generator(7). على وجه الخصوص، يمكن ضبط $XDG_DATA_HOME و $XDG_DATA_DIRS بسهولة باستخدام systemd-environment-d-generator(8). وبذلك، فإن المجلدات المدرجة هنا هي مجرد قيم مبدئية. لرؤية القائمة الفعلية التي ستُستخدم بناءً على خيارات التجميع والبيئة الحالية، استخدم
systemd-analyze --user unit-paths
علاوة على ذلك، قد تُحمَّل وحدات إضافية إلى systemd من مجلدات ليست في مسار تحميل الوحدات عن طريق إنشاء وصلة رمزية تشير إلى ملف وحدة في تلك المجلدات. يمكنك استخدام systemctl link لذلك؛ انظر systemctl(1). يجب أن يكون نظام الملفات حيث توجد ملفات الوحدات الموصولة قابلاً للوصول عند بدء systemd (على سبيل المثال، لا يُسمح بأي شيء تحت /home/ أو /var/، ما لم تكن تلك المجلدات تقع على نظام ملفات الجذر).
من المهم التمييز بين "ملفات الوحدات الموصولة" و"أسماء الوحدات المستعارة": أي وصلة رمزية حيث يكون target الوصلة الرمزية ضمن مسار تحميل الوحدات تصبح اسمًا مستعارًا: يجب أن يفي الاسم المصدر واسم الملف الهدف بقيود محددة مدرجة أعلاه في مناقشة الأسماء المستعارة، ولكن لا يجب أن يكون هدف الوصلة الرمزية موجودًا، وفي الواقع لا يُستخدم مسار هدف الوصلة الرمزية، باستثناء التحقق مما إذا كان الهدف ضمن مسار تحميل الوحدات. في المقابل، تشير الوصلة الرمزية التي تخرج عن مسار تحميل الوحدات إلى ملف وحدة موصول. تُتَّبع الوصلة الرمزية عند تحميل الملف، لكن اسم الوجهة لا يُستخدم بخلاف ذلك (وقد لا يكون حتى اسم ملف وحدة صالحاً). على سبيل المثال، الوصلات الرمزية /etc/systemd/system/alias1.service ← service1.service، و /etc/systemd/system/alias2.service ← /usr/lib/systemd/service1.service، و /etc/systemd/system/alias3.service ← /etc/systemd/system/service1.service هي كلها أسماء مستعارة صالحة وسيكون لـ service1.service أربعة أسماء، حتى لو كان ملف الوحدة يقع في /run/systemd/system/service1.service. على النقيض من ذلك، فإن الوصلة الرمزية /etc/systemd/system/link1.service ← ../link1_service_file تعني أن link1.service هي "وحدة موصولة" ومحتويات /etc/systemd/link1_service_file توفر إعداداتها.
تجميع مهملات الوحدات¶
يُحمِّل مدير النظام والخدمة إعدادات الوحدة آلياً عند الإشارة إلى وحدة لأول مرة. سيُفرغ إعدادات الوحدة وحالتها آلياً مرة أخرى عندما لا تعود الوحدة مطلوبة ("تجميع المهملات"). قد يُشار إلى الوحدة من خلال عدد من الآليات المختلفة:
يمكن تغيير منطق جمع القمامة بخيار CollectMode=، الذي يسمح بضبط ما إذا كان التفريغ الآلي للوحدات التي في حالة failed مسموحًا به، انظر أدناه.
لاحظ أنه عند تفريغ إعدادات وحالة الوحدة، تُفقد جميع نتائج التنفيذ، مثل رموز الخروج، إشارات الخروج، استهلاك الموارد والإحصائيات الأخرى، باستثناء ما هو مخزن في نظام السجلات الفرعي.
استخدم systemctl daemon-reload أو أمرًا مكافئًا لإعادة تحميل إعدادات الوحدة بينما الوحدة محملة بالفعل. في هذه الحالة، تُفرغ جميع إعدادات التشكيل وتُستبدل بالإعدادات الجديدة (التي قد لا تدخل حيز التنفيذ فورًا)، ومع ذلك تُحفظ/تُستعاد كل حالة وقت التشغيل.
خيارات القسم [UNIT]¶
قد يحتوي ملف الوحدة على قسم [Unit]، الذي يحمل معلومات عامة حول الوحدة لا تعتمد على نوع الوحدة:
Description=
أُضيف في الإصدارة 201.
Documentation=
أُضيف في الإصدارة 201.
Wants=
ستُبدأ الوحدات المدرجة في هذا الخيار إذا كانت الوحدة التي تضبطها ستبدأ. ومع ذلك، إذا فشلت الوحدات المدرجة في البدء أو لم يمكن إضافتها إلى العملية، فلا تأثير لذلك على صحة العملية ككل، وستظل هذه الوحدة تُبدأ. هذه هي الطريقة الموصى بها لربط بدء تشغيل وحدة ببدء تشغيل وحدة أخرى.
لاحظ أن متطلبات الاعتمادية لا تؤثر على الترتيب الذي تُبدأ أو تُوقف به الخدمات. يجب ضبط هذا بشكل مستقل بخياري After= أو Before=. إذا قامت الوحدة foo.service بجذب الوحدة bar.service كما هو مضبوط بـ Wants= ولم يُضبط أي ترتيب بـ After= أو Before=، فستُبدأ الوحدتان في وقت واحد وبدون أي تأخير بينهما إذا نُشطت foo.service.
أُضيف في الإصدارة 201.
Requires=
إذا نُشطت هذه الوحدة، ستُنشط الوحدات المدرجة أيضًا. إذا فشلت إحدى الوحدات الأخرى في النشاط، وضُبطت اعتمادية ترتيب After= على الوحدة الفاشلة، فلن تُبدأ هذه الوحدة. إلى جانب ذلك، مع أو بدون تحديد After=، ستُوقف (أو تُعاد تشغيل) هذه الوحدة إذا أُوقفت (أو أُعيد تشغيل) إحدى الوحدات الأخرى صراحةً.
غالبًا ما يكون استخدام Wants= خيارًا أفضل من Requires= لتحقيق نظام أكثر متانة عند التعامل مع الخدمات الفاشلة.
لاحظ أن نوع الاعتمادية هذا لا يعني أن الوحدة الأخرى يجب أن تكون دائمًا في حالة نشطة عندما تكون هذه الوحدة قيد التشغيل. تحديدًا: فحوصات الحالة الفاشلة (مثل ConditionPathExists=، ConditionPathIsSymbolicLink=، ... — انظر أدناه) لا تتسبب في فشل مهمة بدء وحدة لديها اعتمادية Requires= عليها. أيضًا، بعض أنواع الوحدات قد تتوقف عن النشاط من تلقاء نفسها (على سبيل المثال، قد تقرر عملية خدمة الخروج بشكل نظيف، أو قد يفصل المستخدم جهازًا)، وهو أمر لا يُنقل إلى الوحدات التي لديها اعتمادية Requires=. استخدم نوع الاعتمادية BindsTo= جنبًا إلى جنب مع After= لضمان ألا تكون الوحدة أبدًا في حالة نشطة دون أن تكون وحدة أخرى محددة في حالة نشطة أيضًا (انظر أدناه).
أُضيف في الإصدارة 201.
Requisite=
عند استخدام Requisite=b.service في a.service، ستظهر هذه الاعتمادية كـ RequisiteOf=a.service في قائمة خصائص b.service. لا يمكن تحديد اعتمادية RequisiteOf= مباشرةً.
أُضيف في الإصدارة 201.
BindsTo=
عند استخدامه بالاقتران مع After= في نفس الوحدة، يكون سلوك BindsTo= أقوى حتى. في هذه الحالة، يجب أن تكون الوحدة المرتبطة بها في حالة نشطة بصرامة لكي تكون هذه الوحدة في حالة نشطة أيضًا. هذا لا يعني فقط وحدة مرتبطة بوحدة أخرى تدخل فجأة في حالة غير نشطة، بل يعني أيضًا أن الوحدة المرتبطة بوحدة أخرى يتم تخطيها بسبب فحص حالة غير مستوفى (مثل ConditionPathExists=، ConditionPathIsSymbolicLink=، ... — انظر أدناه) ستُوقف، إذا كانت قيد التشغيل. ومن ثم، في حالات كثيرة يكون من الأفضل دمج BindsTo= مع After=.
عند استخدام BindsTo=b.service في a.service، ستظهر هذه الاعتمادية كـ BoundBy=a.service في قائمة خصائص b.service. لا يمكن تحديد اعتمادية BoundBy= مباشرةً.
أُضيف في الإصدارة 201.
PartOf=
عند استخدام PartOf=b.service في a.service، ستظهر هذه الاعتمادية كـ ConsistsOf=a.service في قائمة خصائص b.service. لا يمكن تحديد اعتمادية ConsistsOf= مباشرةً.
أُضيف في الإصدارة 201.
Upholds=
عند استخدام Upholds=b.service في a.service، ستظهر هذه الاعتمادية كـ UpheldBy=a.service في قائمة خصائص b.service.
أُضيف في الإصدار 249.
Conflicts=
لاحظ أن هذا الإعداد لا يعني اعتمادية ترتيب، على غرار اعتماديات Wants= و Requires= الموصوفة أعلاه. هذا يعني أنه لضمان إيقاف الوحدة المتعارضة قبل بدء الوحدة الأخرى، يجب إعلان اعتمادية After= أو Before=. لا يهم أي من اعتماديتي الترتيب تُستخدم، لأن مهام الإيقاف تُرتب دائمًا قبل مهام البدء، انظر النقاش في Before=/After= أدناه.
إذا جُدولت الوحدة A التي تتعارض مع الوحدة B للبدء في نفس وقت B، فإما أن تفشل العملية (في حال كان كلاهما جزأين مطلوبين من العملية) أو تُعدل لتُصلح (في حال لم تكن واحدة أو كلتا المهمتين جزءًا مطلوبًا من العملية). في الحالة الأخيرة، ستُحذف المهمة غير المطلوبة، أو في حال لم يكن كلاهما مطلوبًا، ستُبدأ الوحدة التي تتعارض وتُوقف الوحدة التي يقع عليها التعارض.
أُضيف في الإصدارة 201.
Before=, After=
يضبط هذان الإعدادان اعتماديات الترتيب بين الوحدات. إذا احتوت الوحدة foo.service على الإعداد Before=bar.service وبدأ تشغيل كلتا الوحدتين، يُؤخر بدء تشغيل bar.service حتى ينتهي بدء تشغيل foo.service. After= هو عكس Before=، أي بينما يضمن Before= بدء الوحدة المضبوطة قبل أن تبدأ الوحدة المدرجة في بدء التشغيل، يضمن After= العكس، أن الوحدة المدرجة قد بدأت بالكامل قبل بدء الوحدة المضبوطة.
عند إيقاف تشغيل وحدتين بينهما اعتمادية ترتيب، يُطبق عكس ترتيب بدء التشغيل. أي إذا ضُبطت وحدة بـ After= على وحدة أخرى، تُوقف الأولى قبل الأخيرة إذا أُوقف تشغيل كلتيهما. بالنظر إلى وحدتين بينهما أي اعتمادية ترتيب، إذا أُوقف تشغيل وحدة وبدء تشغيل الأخرى، يُرتب الإيقاف قبل بدء التشغيل. لا يهم إذا كانت اعتمادية الترتيب After= أو Before=، في هذه الحالة. كما لا يهم أي من الاثنتين تُوقف، طالما أن واحدة أُوقف تشغيلها والأخرى بدء تشغيلها؛ يُرتب الإيقاف قبل بدء التشغيل في جميع الحالات. إذا لم تكن بين وحدتين أي اعتماديات ترتيب، فإنهما تُوقفان أو تُبدآن في وقت واحد، ولا يحدث أي ترتيب. يعتمد الأمر على نوع الوحدة متى تنتهي الوحدة بدقة من بدء التشغيل. والأهم من ذلك، بالنسبة لوحدات الخدمة، يُعتبر بدء التشغيل مكتملاً لغرض Before=/After= عندما تُستدعى جميع أوامر بدء التشغيل المضبوطة لها وإما أن تفشل أو تبلغ عن نجاح بدء التشغيل. لاحظ أن هذا يشمل ExecStartPost= (أو ExecStopPost= لحالة إيقاف التشغيل).
لاحظ أن هذه الإعدادات مستقلة ومتعامدة مع متطلبات الاعتمادية كما هي مضبوطة بـ Requires= أو Wants= أو Requisite= أو BindsTo=. من الشائع تضمين اسم وحدة في خياري After= و Wants= معًا، وفي هذه الحالة ستبدأ الوحدة المدرجة قبل الوحدة التي ضُبطت بهذه الخيارات.
لاحظ أن اعتماديات Before= على وحدات الأجهزة ليس لها أي تأثير وغير مدعومة. تصبح الأجهزة عادةً متاحة نتيجة لحدث توصيل خارجي، وينشئ systemd وحدة الجهاز المقابلة دون تأخير.
أُضيف في الإصدارة 201.
OnFailure=
أُضيف في الإصدارة 201.
OnSuccess=
أُضيف في الإصدار 249.
PropagatesReloadTo=, ReloadPropagatedFrom=
أُضيف في الإصدارة 201.
PropagatesStopTo=, StopPropagatedFrom=
أُضيف في الإصدار 249.
JoinsNamespaceOf=
أُضيف في الإصدارة 209.
RequiresMountsFor=
نقاط الوصل المميّزة بـ noauto لا تُوصل آلياً من خلال local-fs.target، لكنها لا تزال مُعتبرة لأغراض هذا الخيار، أي أنها ستُجلب بواسطة هذه الوحدة.
أُضيف في الإصدارة 201.
WantsMountsFor=
أُضيف في الإصدار 256.
OnSuccessJobMode=, OnFailureJobMode=
أُضيف في الإصدارة 209.
IgnoreOnIsolate=
أُضيف في الإصدارة 201.
StopWhenUnneeded=
أُضيف في الإصدارة 201.
RefuseManualStart=, RefuseManualStop=
أُضيف في الإصدارة 201.
AllowIsolate=
أُضيف في الإصدارة 201.
DefaultDependencies=
أُضيف في الإصدارة 201.
SurviveFinalKillSignal=
أُضيف في الإصدار 255.
CollectMode=
أُضيف في الإصدارة 236.
FailureAction=, SuccessAction=
إذا ضُبط على none، فلن يُحفَّز أي إجراء. تسبب reboot إعادة تشغيل متبعةً إجراء الإغلاق العادي (أي تعادل systemctl reboot). تسبب reboot-force إعادة تشغيل قسرية ستنهي جميع العمليات قسراً ولكن لا ينبغي أن تسبب ملفات نظام تالفة عند إعادة التشغيل (أي تعادل systemctl reboot -f)، وتسبب reboot-immediate تنفيذًا فوريًا لنداء النظام reboot(2)، مما قد يؤدي إلى فقدان البيانات (أي تعادل systemctl reboot -ff). وبالمثل، poweroff، وpoweroff-force، وpoweroff-immediate، وkexec، وkexec-force، وhalt، وhalt-force، وhalt-immediate لها تأثير إيقاف تشغيل النظام، أو تنفيذ kexec، أو إيقاف النظام على التوالي بدلالات مماثلة. تسبب exit خروج المدير متبعًا إجراء الإغلاق العادي، وتسبب exit-force إنهاءه دون إغلاق الخدمات. عند استخدام exit أو exit-force افتراضياً، يُعاد وضع خروج العملية الرئيسية للوحدة (إذا انطبق هذا) من مدير الخدمة. ومع ذلك، يمكن تجاوز هذا بـ FailureActionExitStatus=/SuccessActionExitStatus=، طالع أدناه. ستُحفِّز soft-reboot عملية إعادة تشغيل في مساحة المستخدم. soft-reboot-force تفعل ذلك أيضًا، ولكن لا تمر عبر معاملة الإغلاق مسبقًا.
أُضيف في الإصدارة 236.
FailureActionExitStatus=, SuccessActionExitStatus=
أُضيف في الإصدار 240.
JobTimeoutSec=, JobRunningTimeoutSec=
كلا الإعدادين يأخذان فترة زمنية بالوحدة المبدئية وهي الثواني، ولكن يمكن تحديد وحدات أخرى، طالع systemd.time(7). القيمة المبدئية هي "infinity" (مهل الوظائف مُعطَّلة)، باستثناء وحدات الجهاز حيث الإعداد المبدئي لـ JobRunningTimeoutSec= هو DefaultDeviceTimeoutSec=.
ملاحظة: هذه المهل الزمنية مستقلة عن أي مهل زمنية خاصة بالوحدة (على سبيل المثال، المهلة المضبوطة بـ TimeoutStartSec= في وحدات الخدمة). مهلة الوظيفة ليس لها تأثير على الوحدة نفسها. أو بعبارة أخرى: المهل الزمنية الخاصة بالوحدة مفيدة لإلغاء تغييرات حالة الوحدة، والتراجع عنها. ومع ذلك، مهلة الوظيفة المضبوطة بهذا الخيار مفيدة لإلغاء الوظيفة التي تنتظر فقط تغيير حالة الوحدة.
أُضيف في الإصدارة 201.
JobTimeoutAction=, JobTimeoutRebootArgument=
يُهيئ JobTimeoutRebootArgument= سلسلة إعادة تشغيل اختيارية لتمريرها إلى نداء النظام reboot(2).
أُضيف في الإصدار 240.
StartLimitIntervalSec=interval, StartLimitBurst=burst
interval عبارة عن فترة زمنية بوحدة مبدئية هي الثواني، ولكن يمكن تحديد وحدات أخرى، طالع systemd.time(7). يمكن استخدام القيمة الخاصة "infinity" لتحديد العدد الإجمالي لمحاولات البدء، حتى لو حدثت في فواصل زمنية كبيرة. القيمة المبدئية هي DefaultStartLimitIntervalSec= في ملف تهيئة المدير، ويمكن ضبطها على 0 لتعطيل أي نوع من تحديد المعدل. burst هو رقم والإعداد المبدئي له هو DefaultStartLimitBurst= في ملف تهيئة المدير.
خيارات التهيئة هذه مفيدة بشكل خاص بالاقتران مع إعداد الخدمة Restart= (طالع systemd.service(5))؛ ومع ذلك، فهي تنطبق على جميع أنواع البدء (بما في ذلك البدء اليدوي)، وليس فقط تلك التي يُحفِّزها منطق Restart=.
لاحظ أن الوحدات المُهيأة لـ Restart=، والتي تصل إلى حد البدء لا يُحاوَل إعادة تشغيلها بعد الآن؛ ومع ذلك، لا يزال يمكن إعادة تشغيلها يدوياً أو من مؤقت أو مقبس في وقت لاحق، بعد انقضاء interval. من تلك النقطة فصاعداً، يُنشَّط منطق إعادة التشغيل مرة أخرى. سيؤدي systemctl reset-failed إلى إفراغ عداد معدل إعادة التشغيل لخدمة ما، وهو أمر مفيد إذا أراد المدير بدء وحدة يدوياً وكان حد البدء يتداخل مع ذلك. يُفرض تحديد المعدل بعد تنفيذ أي فحوصات شرط الوحدة، وبالتالي فإن تنشيطات الوحدة ذات الشروط الفاشلة لا تُحسَب ضمن حد المعدل.
عندما تُفرَّغ وحدة بسبب منطق جمع القمامة (طالع أعلاه)، تُفرَّغ أيضًا عدادات تحديد المعدل الخاصة بها. هذا يعني أن ضبط تحديد معدل البدء لوحدة لا يُشار إليها باستمرار ليس له تأثير.
لا ينطبق هذا الإعداد على وحدات الشريحة، والهدف، والجهاز، والنطاق، لأنها أنواع وحدات قد لا تفشل فعاليتها أبداً، أو قد تنجح مرة واحدة فقط.
أُضيف في الإصدارة 229.
StartLimitAction=
أُضيف في الإصدارة 229.
RebootArgument=
أُضيف في الإصدارة 229.
SourcePath=
أُضيف في الإصدارة 201.
الشروط والتوكيدات¶
قد تتضمن ملفات الوحدات أيضًا عدداً من إعدادات Condition...= وAssert...=. قبل بدء الوحدة، سيتحقق systemd من أن الشروط والتوكيدات المحدّدة صحيحة. إذا لم تكن كذلك، فسيُتخطَّى بدء الوحدة (بشكل صامت في الغالب) (في حالة الشروط)، أو يُجهَض مع رسالة خطأ (في حالة التوكيدات). الشروط أو التوكيدات الفاشلة لن تؤدي إلى نقل الوحدة إلى حالة "failed" (فشل). تُفحَص الشروط والتوكيدات في الوقت الذي ستُنفَّذ فيه وظيفة البدء الموضعة في قائمة الانتظار. لا تزال تبعيات الترتيب مُحترمة، لذا لا تزال الوحدات الأخرى تُجلب وتُرتب كما لو أن هذه الوحدة نُشِّطت بنجاح، وتُنفَّذ الشروط والتوكيدات في اللحظة الدقيقة التي ستبدأ فيها الوحدة عادةً وبالتالي يمكنها التحقق من حالة النظام بعد اكتمال تهيئة الوحدات المرتبة قبلها. استخدم تعبيرات الشروط لتخطي الوحدات التي لا تنطبق على النظام المحلي، على سبيل المثال لأن النواة أو بيئة التشغيل لا تتطلب وظائفها.
إذا حُدِّدت شروط متعددة، فستُنفَّذ الوحدة إذا انطبقت جميعها (أي يُطبق منطق AND). يمكن لفحوصات الشروط استخدام رمز الأنبوب ("|") بعد علامة يساوي ("Condition...=|...")، مما يجعل الشرط يصبح شرطاً triggering (مُحفِّزاً). إذا عُرِّف شرط مُحفِّز واحد على الأقل لوحدة ما، فستبدأ الوحدة إذا انطبق واحد على الأقل من الشروط المُحفِّزة للوحدة وانطبقت جميع الشروط العادية (أي غير المُحفِّزة). إذا بادأتَ معاملًا برمز الأنبوب وعلامة تعجب، فيجب تمرير رمز الأنبوب أولاً، وعلامة التعجب ثانياً. إذا أُسندت سلسلة نصية فارغة لأي من هذه الخيارات، فستُعاد تهيئة قائمة الشروط بالكامل، ولن يكون لأي إعدادات شروط سابقة (من أي نوع) أي تأثير.
خيارات AssertArchitecture=، وAssertVirtualization=، ... متشابهة مع الشروط ولكنها تسبب فشل وظيفة البدء (بدلاً من تخطيها). يُسجَّل الفحص الفاشل. الوحدات ذات الشروط غير المستوفاة تُعتبر في حالة نظيفة وستُجمع كقمامة إذا لم يُشر إليها. هذا يعني أنه عند الاستعلام، قد يظهر فشل الشرط أو قد لا يظهر في حالة الوحدة.
لاحظ أن تعبيرات التأكيد والشرط لا تؤدي إلى تغييرات في حالة الوحدة. لاحظ أيضًا أن كلاهما يُفحصان في وقت تنفيذ المهمة، أي بعد فترة طويلة من وضع المهام المعتمدة والوحدة نفسها في قائمة الانتظار. وبناءً عليه، فإن تعبيرات الشرط والتأكيد غير مناسبة لجعل اعتماديات الوحدة مشروطة.
يمكن استخدام الفعل condition الخاص بـ systemd-analyze(1) لاختبار تعبيرات الشرط والتأكيد.
باستثناء ConditionPathIsSymbolicLink=، تتبع جميع فحوصات المسارات الوصلات الرمزية.
ConditionArchitecture=
استخدم systemd-analyze(1) للحصول على القائمة الكاملة للمعماريات المعروفة.
تُحدد المعمارية من المعلومات التي يعيدها uname(2) وبالتالي فهي تخضع لـ personality(2). لاحظ أن إعداد Personality= في ملف الوحدة نفسه ليس له أي تأثير على هذا الشرط. يُعيَّن اسم المعمارية الخاص "native" إلى المعمارية التي صُرف مدير النظام نفسه من أجلها. يمكن نفي الاختبار بإضافة علامة تعجب في بدايته.
أُضيف في الإصدارة 201.
ConditionFirmware=
أُضيف في الإصدار 249.
ConditionVirtualization=
أُضيف في الإصدارة 244.
ConditionHost=
أُضيف في الإصدارة 244.
ConditionKernelCommandLine=
أُضيف في الإصدارة 244.
ConditionKernelVersion=
لاحظ أن استخدام سلسلة نسخة النواة طريقة غير موثوقة لتحديد الميزات المدعومة من قبل النواة، بسبب الممارسة الواسعة النطاق لنقل التعريفات والميزات والإصلاحات خلفياً (backporting) من أنوية المنبع الأحدث إلى نسخ أقدم توفرها التوزيعات. وبالتالي، هذا التحقق غير قابل للنقل بطبيعته ولا ينبغي استخدامه للوحدات التي قد تُستخدم في توزيعات مختلفة.
أُضيف في الإصدارة 244.
ConditionVersion=
أُضيف في الإصدار 258.
ConditionCredential=
أُضيف في الإصدار 252.
ConditionEnvironment=
أُضيف في الإصدار 246.
ConditionSecurity=
جدول 3. تقنيات
الأمن
المُعترف
بها
| القيمة | الوصف |
| selinux | SELinux MAC |
| apparmor | AppArmor MAC |
| tomoyo | Tomoyo MAC |
| smack | SMACK MAC |
| ima | بنية قياس النزاهة (IMA) |
| audit | إطار عمل تدقيق Linux |
| uefi-secureboot | الإقلاع الآمن لـ UEFI |
| tpm2 | وحدة المنصة الموثوقة 2.0 (TPM2) (مع دعم UEFI الكامل، بما في ذلك تشكيلة برمجيات منصة عميل TCG PC) |
| cvm | آلة افتراضية سرية (SEV/TDX) |
| measured-uki | صورة النواة الموحدة مع قياسات PCR 11، وفقاً لـ systemd-stub(7). أُضيفت في الإصدار 255. |
يمكن نفي الاختبار بوضع علامة تعجب قبله.
أُضيف في الإصدارة 244.
ConditionCapability=
أُضيف في الإصدارة 244.
ConditionACPower=
أُضيف في الإصدارة 244.
ConditionNeedsUpdate=
إذا حُدد الخيار systemd.condition_needs_update= في سطر أوامر النواة (يأخذ قيمة منطقية)، فإنه سيتجاوز نتيجة فحص هذا الشرط، وله الأولوية على أي فحوصات لوقت تعديل الملف. إذا استُخدم خيار سطر أوامر النواة، فلن يكون لـ systemd-update-done.service تأثير فوري على أي فحوصات ConditionNeedsUpdate= لاحقة، حتى يُعاد إقلاع النظام بدون تحديد خيار سطر أوامر النواة هذا.
لاحظ أنه لجعل هذا المخطط فعالًا، يجب تحديث الطابع الزمني لـ /usr/ صراحةً بعد تعديل محتوياته. ستُحدّث النواة الطابع الزمني للتعديل على دليل ما آليًا فقط عند تعديل الأبناء المباشرين للدليل؛ أما تعديل الملفات المتداخلة فلن يؤدي آليًا إلى تحديث mtime لـ /usr/.
لاحظ أيضًا أنه إذا كانت طريقة التحديث تتضمن استدعاءً لتنفيذ خطوات ما بعد التحديث المناسبة بذاتها، فلا ينبغي أن تلمس الطابع الزمني لـ /usr/. في مخطط حزم التوزيع النموذجي، ستنفذ الحزم أي خطوات تحديث مطلوبة كجزء من التثبيت أو الترقية، لجعل محتويات الحزمة قابلة للاستخدام فورًا. يجب استخدام ConditionNeedsUpdate= مع آليات تحديث أخرى حيث لا يحدث مثل هذا التحديث الفوري.
أُضيف في الإصدارة 244.
ConditionFirstBoot=
يمكن استخدام هذا الشرط لملء /etc/ عند الإقلاع الأول بعد إعادة ضبط المصنع، أو عند إقلاع نسخة نظام جديدة لأول مرة.
لاحظ أن مدير الخدمة نفسه سينفذ خطوات الإعداد أثناء الإقلاع الأول: سيهيئ machine-id(5) ويضبط مسبقًا جميع الوحدات، مُمكّنًا أو مُعطّلًا لها وفقًا لإعدادات systemd.preset(5). يمكن تنفيذ إعداد إضافي عبر وحدات تحتوي على ConditionFirstBoot=yes.
للمتانة، يجب أن ترتب الوحدات التي تحتوي على ConditionFirstBoot=yes نفسها قبل first-boot-complete.target وتستدعي هذا الهدف الخامل باستخدام Wants=. يضمن هذا أنه في حالة إجهاض الإقلاع الأول، ستُعاد عملية تشغيل هذه الوحدات أثناء إقلاع النظام التالي.
إذا حُدّد الخيار systemd.condition_first_boot= في سطر أوامر النواة (بأخذ قيمة منطقية)، فسيتجاوز نتيجة فحص هذا الشرط، ويكون له الأسبقية على فحوصات وجود /etc/machine-id.
أُضيف في الإصدارة 244.
ConditionPathExists=
أُضيف في الإصدارة 244.
ConditionPathExistsGlob=
أُضيف في الإصدارة 244.
ConditionPathIsDirectory=
أُضيف في الإصدارة 244.
ConditionPathIsSymbolicLink=
أُضيف في الإصدارة 244.
ConditionPathIsMountPoint=
أُضيف في الإصدارة 244.
ConditionPathIsReadWrite=
أُضيف في الإصدارة 244.
ConditionPathIsEncrypted=
أُضيف في الإصدار 246.
ConditionPathIsSocket=
أُضيف في الإصدار 260.
ConditionDirectoryNotEmpty=
أُضيف في الإصدارة 244.
ConditionFileNotEmpty=
أُضيف في الإصدارة 244.
ConditionFileIsExecutable=
أُضيف في الإصدارة 244.
ConditionUser=
أُضيف في الإصدارة 244.
ConditionGroup=
أُضيف في الإصدارة 244.
ConditionControlGroupController=
يمكن تمرير متحكمات متعددة مع فصلها بمسافة؛ في هذه الحالة، سينجح الشرط فقط إذا كانت جميع المتحكمات المدرجة متاحة للاستخدام. المتحكمات غير المعروفة لـ systemd تُتجاهل. المتحكمات الصالحة هي "cpu"، و "io"، و "memory"، و "pids". حتى لو كانت متاحة في النواة، قد لا يكون متحكم معين متاحاً إذا عُطل في سطر أوامر النواة باستخدام cgroup_disable=controller.
بدلاً من ذلك، يمكن تحديد سلسلتين خاصتين هما "v1" و "v2" (بدون أي أسماء متحكمات). سينجح "v2" إذا كان تسلسل cgroup الهرمي v2 الموحد مستخدماً، وسينجح "v1" إذا كان تسلسل v1 الهرمي القديم أو التسلسل الهجين مستخدماً. لاحظ أن التسلسلات الهرمية القديمة أو الهجينة أصبحت مهملة. راجع systemd(1) لمزيد من المعلومات.
أُضيف في الإصدارة 244.
ConditionMemory=
أُضيف في الإصدارة 244.
ConditionCPUs=
أُضيف في الإصدارة 244.
ConditionCPUFeature=
أُضيف في الإصدار 248.
ConditionOSRelease=
بخلاف مطابقة السلاسل النصية الدقيقة (باستخدام "=" و "!=")، تُدعم المقارنات النسبية للمعاملات ذات الإصدارات (مثل "VERSION_ID"؛ باستخدام "<"، أو "<="، أو "=="، أو "<>"، أو ">="، أو ">")، وتُدعم مقارنات المحارف البديلة بأسلوب الصدفة ("*"، "?"، "[]") باستخدام "$=" (للمطابقة) و "!$=" (لعدم المطابقة).
إذا لم يُعثر على المفتاح المعطى في الملف، تُنفذ المطابقة مقابل قيمة فارغة.
أُضيف في الإصدار 249.
ConditionMemoryPressure=, ConditionCPUPressure=, ConditionIOPressure=
اختيارياً، يمكن أن تُسبق قيمة العتبة بوحدة الشريحة (slice unit) التي سيُفحص الضغط تحتها، متبوعة بـ ":". إذا لم تُحدد وحدة الشريحة، فسيُقاس ضغط النظام الكلي، بدلاً من ضغط cgroup معين.
أُضيف في الإصدار 250.
ConditionKernelModuleLoaded=
أُضيف في الإصدار 258.
AssertArchitecture=, AssertVirtualization=, AssertHost=, AssertKernelCommandLine=, AssertKernelVersion=, AssertVersion=, AssertCredential=, AssertEnvironment=, AssertSecurity=, AssertCapability=, AssertACPower=, AssertNeedsUpdate=, AssertFirstBoot=, AssertPathExists=, AssertPathExistsGlob=, AssertPathIsDirectory=, AssertPathIsSymbolicLink=, AssertPathIsMountPoint=, AssertPathIsReadWrite=, AssertPathIsEncrypted=, AssertPathIsSocket=, AssertDirectoryNotEmpty=, AssertFileNotEmpty=, AssertFileIsExecutable=, AssertUser=, AssertGroup=, AssertControlGroupController=, AssertMemory=, AssertCPUs=, AssertCPUFeature=, AssertOSRelease=, AssertMemoryPressure=, AssertCPUPressure=, AssertIOPressure=, AssertKernelModuleLoaded=
أُضيف في الإصدارة 218.
تعيين خصائص الوحدة إلى معكوساتها¶
إعدادات الوحدة التي تنشئ علاقة مع وحدة ثانية تظهر عادة في خصائص كلتا الوحدتين، على سبيل المثال في مخرجات systemctl show. في بعض الحالات يكون اسم الخاصية هو نفسه اسم إعداد التكوين، ولكن ليس دائماً. يسرد هذا الجدول الخصائص التي تظهر في وحدتين متصلتين من خلال تبعية ما، ويوضح أي خاصية في وحدة "المصدر" تقابل أي خاصية في وحدة "الهدف".
جدول 4.
خصائص
الوحدة
الأمامية
والعكسية
| خاصية "أمامية" | خاصية "عكسية" | مكان الاستخدام | |
| Before= | After= | قسم [Unit] | |
| After= | Before= | ||
| Requires= | RequiredBy= | قسم [Unit] | قسم [Install] |
| Wants= | WantedBy= | قسم [Unit] | قسم [Install] |
| Upholds= | UpheldBy= | قسم [Unit] | قسم [Install] |
| PartOf= | ConsistsOf= | قسم [Unit] | خاصية آلية |
| BindsTo= | BoundBy= | قسم [Unit] | خاصية آلية |
| Requisite= | RequisiteOf= | قسم [Unit] | خاصية آلية |
| Conflicts= | ConflictedBy= | قسم [Unit] | خاصية آلية |
| Triggers= | TriggeredBy= | خصائص آلية، انظر الملاحظات أدناه | |
| PropagatesReloadTo= | ReloadPropagatedFrom= | قسم [Unit] | |
| ReloadPropagatedFrom= | PropagatesReloadTo= | ||
| PropagatesStopTo= | StopPropagatedFrom= | قسم [Unit] | |
| StopPropagatedFrom= | PropagatesStopTo= | ||
| Following= | n/a | خاصية آلية | |
ملاحظة: تُستخدم WantedBy=، وRequiredBy=، وUpheldBy= في قسم [Install] لإنشاء روابط رمزية في أدلة .wants/، و.requires/، و.upholds/. لا يمكن استخدامها مباشرة كإعداد لتهيئة الوحدة.
ملاحظة: تُنشأ ConsistsOf=، وBoundBy=، وRequisiteOf=، وConflictedBy= ضمنياً إلى جانب عكسياتها ولا يمكن تحديدها مباشرة.
ملاحظة: تُنشأ Triggers= ضمنياً بين مقبس، أو وحدة مسار، أو وحدة وصل آلي، والوحدة التي تُنشطها. مبدئياً، تُنشط وحدة بنفس الاسم، ولكن يمكن تجاوز ذلك باستخدام إعدادات Sockets=، وService=، وUnit=. راجع systemd.service(5)، وsystemd.socket(5)، وsystemd.path(5)، وsystemd.automount(5) للتفاصيل. تُنشأ TriggeredBy= ضمنياً على الوحدة المُنشطة.
ملاحظة: تُستخدم Following= لتجميع أسماء الأجهزة المستعارة وتُشير إلى وحدة الجهاز "الرئيسة" التي يستخدمها systemd لتتبع حالة الجهاز، وعادة ما توافق مسار sysfs. لا تظهر في وحدة "الهدف".
خيارات قسم [INSTALL]¶
قد تتضمن ملفات الوحدات قسماً للـ [Install]، والذي يحمل معلومات تثبيت الوحدة. لا يُفسر هذا القسم بواسطة systemd(1) أثناء وقت التشغيل؛ بل يُستخدم بواسطة أوامر enable وdisable في أداة systemctl(1) أثناء تثبيت الوحدة.
Alias=
أُضيف في الإصدارة 201.
WantedBy=, RequiredBy=, UpheldBy=
في حالة وحدات القوالب التي تدرج وحدات ليست قوالب، يجب أن يكون للوحدة المُدرِجة إعداد DefaultInstance=، أو يجب استدعاء systemctl enable باسم حالة. ستُضاف الحالة (المبدئية أو المحددة) إلى قائمة .wants/، أو .requires/، أو .upholds/ للوحدة المدرجة. على سبيل المثال، WantedBy=getty.target في خدمة getty@.service سيؤدي إلى إنشاء systemctl enable getty@tty2.service لرابط getty.target.wants/getty@tty2.service إلى getty@.service. ينطبق هذا أيضًا على إدراج حالات محددة من وحدات القوالب: ستكتسب هذه الحالة المحددة الاعتمادية. قد تُدرج وحدة القالب أيضًا وحدة قالب، وفي هذه الحالة ستُضاف اعتمادية عامة حيث سيكون لكل حالة من الوحدة المُدرِجة اعتمادية على حالة من القالب المدرج بنفس قيمة الحالة. على سبيل المثال، WantedBy=container@.target في خدمة monitor@.service سيؤدي إلى إنشاء systemctl enable monitor@.service لرابط container@.target.wants/monitor@.service إلى monitor@.service، وهو ما ينطبق على جميع حالات container@.target.
أُضيف في الإصدارة 201.
Also=
يمكن استخدام هذا الخيار أكثر من مرة، أو يمكن إعطاء قائمة مفصولة بمسافات بأسماء الوحدات.
أُضيف في الإصدارة 201.
DefaultInstance=
أُضيف في الإصدارة 215.
يتم تفسير المحددات التالية في قسم Install: %a، و%b، و%B، و%g، و%G، و%H، و%i، و%j، و%l، و%m، و%n، و%N، و%o، و%p، و%u، و%U، و%v، و%w، و%W، و%%. لمعانيها راجع القسم التالي.
المحددات¶
تحل العديد من الإعدادات محددات يمكن استخدامها لكتابة ملفات وحدات عامة تشير إلى وقت التشغيل أو بارامترات الوحدة التي يتم استبدالها عند تحميل ملفات الوحدات. يجب أن تكون المحددات معروفة وقابلة للحل لكي يكون الإعداد صحيحاً. المحددات التالية مفهومة:
جدول 5. المحددات
المتاحة في
ملفات
الوحدات
| المحدد | المعنى | التفاصيل |
| "%a" | المعمارية | سلسلة قصيرة تحدد معمارية النظام المحلي. سلسلة مثل x86، أو x86-64، أو arm64. راجع المعماريات المحددة لـ ConditionArchitecture= أعلاه للحصول على قائمة كاملة. |
| "%A" | إصدار صورة نظام التشغيل | معرف إصدار صورة نظام التشغيل للنظام المشغل، كما يُقرأ من حقل IMAGE_VERSION= في /etc/os-release. إذا لم يُضبط، يُحل إلى سلسلة فارغة. انظر os-release(5) لمزيد من المعلومات. |
| "%b" | معرف الإقلاع | معرف الإقلاع للنظام المشغل، منسق كسلسلة نصية. انظر random(4) لمزيد من المعلومات. |
| "%B" | معرف بناء نظام التشغيل | معرف بناء نظام التشغيل للنظام المشغل، كما يُقرأ من حقل BUILD_ID= في /etc/os-release. إذا لم يُضبط، يُحل إلى سلسلة فارغة. انظر os-release(5) لمزيد من المعلومات. |
| "%C" | جذر دليل الخبيئة | هذا إما /var/cache (لمدير النظام) أو المسار الذي يحل إليه "$XDG_CACHE_HOME" (لمديري المستخدمين). |
| "%d" | دليل الاستيثاق | هذه هي قيمة متغير البيئة "$CREDENTIALS_DIRECTORY" إن توفر. راجع قسم "Credentials" في systemd.exec(5) لمزيد من المعلومات. |
| "%D" | دليل البيانات المشتركة | هذا إما /usr/share/ (لمدير النظام) أو المسار الذي يحل إليه "$XDG_DATA_HOME" (لمديري المستخدمين). |
| "%E" | جذر دليل التهيئة | هذا إما /etc/ (لمدير النظام) أو المسار الذي يحل إليه "$XDG_CONFIG_HOME" (لمديري المستخدمين). |
| "%f" | اسم الملف غير المُرمّز | هذا إما اسم الحالة غير المُرمّز (إن انطبق) مع إضافة / في البداية (إن انطبق)، أو اسم البادئة غير المُرمّز مع إضافة / في البداية. يُنفذ هذا إلغاء الترميز وفقاً لقواعد ترميز مسارات نظام الملفات المطلقة التي نوقشت أعلاه. |
| "%g" | مجموعة المستخدم | هذا هو اسم المجموعة التي تُشغِّل مثيل مدير الخدمة. في حالة مدير النظام، يُحل هذا إلى "root". |
| "%G" | معرف المجموعة (GID) للمستخدم | هذا هو مُعرِّف المجموعة (GID) الرقمي للمستخدم الذي يُشغِّل مثيل مدير الخدمة. في حالة مدير النظام، يُحل هذا إلى "0". |
| "%h" | دليل منزل المستخدم | هذا هو دليل المنزل لـ المستخدم الذي يُشغِّل مثيل مدير الخدمة. في حالة مدير النظام، يُحل هذا إلى "/root". لاحظ أن هذا الإعداد لا يتأثر بإعداد User= القابل للضبط في قسم [Service] لوحدة الخدمة. |
| "%H" | اسم المضيف | اسم المضيف للنظام المُشغَّل في لحظة تحميل إعدادات الوحدة. |
| "%i" | اسم المثيل | بالنسبة للوحدات المُستنسخة، هذا هو السلسلة النصية بين أول محرف "@" ولاحقة النوع. فارغ للوحدات غير المُستنسخة. |
| "%I" | اسم المثيل غير المُهَرَّب | مثل "%i"، ولكن مع إزالة الهروب. |
| "%j" | المكوِّن الأخير للبادئة | هذه هي السلسلة النصية بين آخر "-" ونهاية اسم البادئة. إذا لم يوجد "-"، فهذا يطابق "%p". |
| "%J" | المكوِّن الأخير للبادئة غير المُهَرَّب | مثل "%j"، ولكن مع إزالة الهروب. |
| "%l" | اسم المضيف القصير | اسم المضيف للنظام المُشغَّل في لحظة تحميل إعدادات الوحدة، مُقتطَع عند أول نقطة لإزالة أي مكوِّن نطاق. |
| "%L" | جذر دليل السجل | هذا هو إما /var/log (لمدير النظام) أو المسار الذي يُحَل إليه $XDG_STATE_HOME مع إضافة /log إليه (لمديري المستخدم). |
| "%m" | معرف الآلة | معرف الجهاز للنظام المشغل، منسق كسلسلة نصية. انظر machine-id(5) لمزيد من المعلومات. |
| "%M" | معرف صورة نظام التشغيل | معرف صورة نظام التشغيل للنظام المشغل، كما يُقرأ من حقل IMAGE_ID= في /etc/os-release. إذا لم يُضبط، يُحل إلى سلسلة فارغة. انظر os-release(5) لمزيد من المعلومات. |
| "%n" | اسم الوحدة الكامل | |
| "%N" | اسم الوحدة الكامل | مثل "%n"، ولكن مع إزالة لاحقة النوع. |
| "%o" | معرف نظام التشغيل | معرف نظام التشغيل للنظام المشغل، كما يُقرأ من حقل ID= في /etc/os-release. انظر os-release(5) لمزيد من المعلومات. |
| "%p" | اسم البادئة | بالنسبة للوحدات المُستنسخة، يشير هذا إلى السلسلة النصية قبل أول محرف "@" في اسم الوحدة. للوحدات غير المُستنسخة، يطابق "%N". |
| "%P" | اسم البادئة غير المُهَرَّب | مثل "%p"، ولكن مع إزالة الهروب. |
| "%q" | اسم المضيف الجميل | اسم المضيف الجميل للنظام المُشغَّل في لحظة تحميل إعدادات الوحدة، كما قُرئ من حقل PRETTY_HOSTNAME= في /etc/machine-info. إذا لم يُضبط، يُحل إلى اسم المضيف القصير. انظر machine-info(5) للمزيد من المعلومات. |
| "%s" | صدفة المستخدم | هذه هي صدفة المستخدم الذي يُشغِّل مثيل مدير الخدمة. |
| "%S" | جذر دليل الحالة | هذا هو إما /var/lib (لمدير النظام) أو المسار الذي يُحَل إليه $XDG_STATE_HOME (لمديري المستخدم). |
| "%t" | جذر دليل وقت التشغيل | هذا هو إما /run/ (لمدير النظام) أو المسار الذي يُحَل إليه "$XDG_RUNTIME_DIR" (لمديري المستخدم). |
| "%T" | مجلد للملفات المؤقتة | هذا إما /tmp أو المسار الذي ضُبطت إليه "$TMPDIR" أو "$TEMP" أو "$TMP". (لاحظ أن الدليل قد يُحدد بدون شرطة مائلة لاحقة.) |
| "%u" | اسم المستخدم | هذا هو اسم المستخدم الذي يُشغِّل مثيل مدير الخدمة. في حالة مدير النظام، يُحل هذا إلى "root". لاحظ أن هذا الإعداد لا يتأثر بإعداد User= القابل للضبط في قسم [Service] لوحدة الخدمة. |
| "%U" | معرف المستخدم (UID) | هذا هو مُعرِّف المستخدم (UID) الرقمي لـ المستخدم الذي يُشغِّل مثيل مدير الخدمة. في حالة مدير النظام، يُحل هذا إلى "0". لاحظ أن هذا الإعداد لا يتأثر بإعداد User= القابل للضبط في قسم [Service] لوحدة الخدمة. |
| "%v" | إصدار النواة | مطابق لمخرجات uname -r. |
| "%V" | مجلد للملفات المؤقتة الأكبر حجمًا والمستمرة | هذا إما /var/tmp أو المسار الذي ضُبطت إليه "$TMPDIR" أو "$TEMP" أو "$TMP". (لاحظ أن الدليل قد يُحدد بدون شرطة مائلة لاحقة.) |
| "%w" | معرف إصدار نظام التشغيل | معرف إصدار نظام التشغيل للنظام المشغل، كما يُقرأ من حقل VERSION_ID= في /etc/os-release. إذا لم يُضبط، يُحل إلى سلسلة فارغة. انظر os-release(5) لمزيد من المعلومات. |
| "%W" | معرف نوع نظام التشغيل | معرف تنويعة نظام التشغيل للنظام المشغل، كما يُقرأ من حقل VARIANT_ID= في /etc/os-release. إذا لم يُضبط، يُحل إلى سلسلة فارغة. انظر os-release(5) لمزيد من المعلومات. |
| "%y" | المسار إلى القطعة | هذا هو المسار حيث يقع الجزء الرئيس من ملف الوحدة. بالنسبة لملفات الوحدات المرتبطة، يُستخدم المسار الحقيقي خارج أدلة بحث الوحدات. بالنسبة للوحدات التي لا تملك ملف قطعة، سيُثير هذا المحدِّد خطأً. |
| "%Y" | دليل القطعة | هذا هو جزء الدليل من "%y". |
| "%%" | علامة مئوية مفردة | استخدم "%%" بدلاً من "%" لتحديد علامة مئوية مفردة. |
أمثلة¶
مثال 1. السماح بتمكين الوحدات
القُصاصة التالية (المُظللة) تسمح بتمكين وحدة (على سبيل المثال. foo.service) عبر systemctl enable:
[Unit] Description=Foo [Service] ExecStart=/usr/sbin/foo-daemon [Install] WantedBy=multi-user.target
بعد تشغيل systemctl enable، سَيُنشأ رابط رمزي /etc/systemd/system/multi-user.target.wants/foo.service يشير إلى الوحدة الفعلية. يخبر هذا systemd بسحب الوحدة عند بدء تشغيل multi-user.target. أما الأمر العكسي systemctl disable فسيحذف ذلك الرابط الرمزي مجدّدًا.
مثال 2. تجاوز إعدادات المورّد
توجد طريقتان لتجاوز إعدادات المورّد في ملفات الوحدات: نسخ ملف الوحدة من /usr/lib/systemd/system إلى /etc/systemd/system وتعديل الإعدادات المختارة. بدلاً من ذلك، يمكن إنشاء دليل باسم unit.d/ داخل /etc/systemd/system ووضع ملف إلحاق name.conf هناك يغيّر فقط الإعدادات المحددة المرغوبة. لاحظ أن ملفات الإلحاق المتعددة تُقرأ إذا وُجدت، وتُعالج بالترتيب المعجمي لأسماء ملفاتها.
ميزة الطريقة الأولى هي سهولة تجاوز الوحدة بالكامل، إذ لا يُحلَّل ملف وحدة المورّد على الإطلاق. ولها عيب يتمثل في أن التحسينات التي يجريها المورّد على ملف الوحدة لا تُدمج آليًّا عند التحديثات.
ميزة الطريقة الثانية هي تجاوز الإعدادات المرغوبة فقط، حيث تُطبَّق تحديثات الوحدة من المورّد آليًّا. ولها عيب يتمثل في أن بعض التحديثات المستقبلية من المورّد قد لا تتوافق مع التغييرات المحلية.
ينطبق هذا أيضًا على نسخ systemd الخاصة بالمستخدم، ولكن مع مواقع مختلفة لملفات الوحدات. راجع القسم الخاص بمسارات تحميل الوحدات لمزيد من التفاصيل.
لنفترض وجود وحدة مقدَّمة من المورّد /usr/lib/systemd/system/httpd.service بالمحتويات التالية:
[Unit] Description=Some HTTP Server After=remote-fs.target sqldb.service Requires=sqldb.service AssertPathExists=/srv/webserver [Service] Type=notify ExecStart=/usr/sbin/some-fancy-httpd-server Nice=5 [Install] WantedBy=multi-user.target
الآن، يريد المدير تغيير بعض الإعدادات: أولاً، في الإعداد المحلي، قد لا يكون /srv/webserver موجودًا، لأن خادوم HTTP مضبوط لاستخدام /srv/www بدلاً منه. ثانيًا، يجعل الإعداد المحلي خادوم HTTP يعتمد أيضًا على خدمة خبيئة ذاكرة memcached.service، التي يجب سحبها (Requires=) وترتيبها بشكل مناسب (After=). ثالثًا، من أجل زيادة تحصين الخدمة، يرغب المدير في ضبط إعداد PrivateTmp= (راجع systemd.exec(5) للتفاصيل). وأخيرًا، يرغب المدير في إعادة ضبط أولوية التنفيذ (niceness) للخدمة إلى قيمتها المبدئية 0.
الاحتمال الأول هو نسخ ملف الوحدة إلى /etc/systemd/system/httpd.service وتغيير الإعدادات المختارة:
[Unit] Description=Some HTTP Server After=remote-fs.target sqldb.service memcached.service Requires=sqldb.service memcached.service AssertPathExists=/srv/www [Service] Type=notify ExecStart=/usr/sbin/some-fancy-httpd-server Nice=0 PrivateTmp=yes [Install] WantedBy=multi-user.target
بدلاً من ذلك، يمكن للمدير إنشاء ملف إلحاق /etc/systemd/system/httpd.service.d/local.conf بالمحتويات التالية:
[Unit] After=memcached.service Requires=memcached.service # Reset all assertions and then re-add the condition we want AssertPathExists= AssertPathExists=/srv/www [Service] Nice=0 PrivateTmp=yes
لاحظ أنه بالنسبة لملفات الإلحاق، إذا أراد المرء إزالة إدخالات من إعداد يُحلَّل كقائمة (وليس اعتمادية)، مثل AssertPathExists= (أو على سبيل المثال ExecStart= في وحدات الخدمة)، يجب أولاً مسح القائمة قبل إعادة إضافة جميع الإدخالات باستثناء تلك المُراد إزالتها. الاعتماديات (After=، إلخ) لا يمكن إعادة ضبطها إلى قائمة فارغة، لذا لا يمكن إضافة الاعتماديات إلا في ملفات الإلحاق. إذا كنت تريد إزالة اعتماديات، فيجب عليك تجاوز الوحدة بالكامل.
مثال 3. ملفات إلحاق على المستوى الأعلى مع وحدات القوالب
يمكن استخدام ملفات الإلحاق على المستوى الأعلى لكل نوع لتغيير جانب معيّن من جميع وحدات نوع محدّد. على سبيل المثال، بإنشاء الدليل /etc/systemd/system/service.d/ مع ملف إلحاق، يمكن تطبيق محتويات ملف الإلحاق على جميع وحدات الخدمة. يمكننا المضي قدمًا بجعل ملف الإلحاق على المستوى الأعلى ينسخ وحدة مساعدة ثانوية. لننظر على سبيل المثال إلى مجموعة الوحدات وملفات الإلحاق التالية حيث نُثبِّت اعتمادية OnFailure= لجميع وحدات الخدمة.
/etc/systemd/system/failure-handler@.service:
[Unit] Description=My Failure Handler For %i [Service] Type=oneshot # Perform some special action for when %i exits unexpectedly. ExecStart=/usr/sbin/myfailurehandler %i
يمكننا حينئذٍ إضافة نسخة من failure-handler@.service كاعتمادية OnFailure= لجميع وحدات الخدمة.
/etc/systemd/system/service.d/10-all.conf:
[Unit] OnFailure=failure-handler@%N.service
الآن، بعد تشغيل systemctl daemon-reload ستكتسب جميع الخدمات اعتمادية OnFailure= على failure-handler@%N.service. ستكتسب وحدات نسخ القوالب أيضًا الاعتمادية مما يؤدي إلى إنشاء سلسلة اعتمادية متكررة. سيحاول systemd اكتشاف سلاسل الاعتمادية المتكررة هذه حيث تعتمد وحدة القالب بشكل مباشر ومتكرر على نفسها، وسيزيل هذه الاعتماديات آليًّا إذا وجدها. إذا لم يكتشف systemd سلسلة الاعتمادية المتكررة، يمكننا كسر السلسلة بأنفسنا عن طريق تعطيل ملف الإلحاق لوحدات نسخ القوالب عبر رابط رمزي إلى /dev/null:
mkdir /etc/systemd/system/failure-handler@.service.d/ ln -s /dev/null /etc/systemd/system/failure-handler@.service.d/10-all.conf systemctl daemon-reload
يضمن هذا أنه إذا فشلت نسخة failure-handler@.service، فلن تُشغِّل نسخة باسم failure-handler@failure-handler.service.
انظر أيضًا¶
systemd(1), systemctl(1), systemd-system.conf(5), systemd.special(7), systemd.service(5), systemd.socket(5), systemd.device(5), systemd.mount(5), systemd.automount(5), systemd.swap(5), systemd.target(5), systemd.path(5), systemd.timer(5), systemd.scope(5), systemd.slice(5), systemd.time(7), systemd-analyze(1), capabilities(7), systemd.directives(7), uname(1)
ملاحظات¶
- 1.
- وعد استقرار وقابلية نقل الواجهة
- 2.
- 💣💥🧨💥💥💣 يرجى ملاحظة أن ملفات الضبط تلك يجب أن تكون متوفرة في جميع الأوقات. إذا كان /usr/local/ قسماً منفصلاً، فقد لا يكون متوفراً أثناء بدء التشغيل المبكر، ويجب عدم استخدامه للضبط.
- 3.
- systemd وعفاريت التخزين لنظام ملفات الجذر
- 4.
- بيانات اعتماد النظام والخدمة
- 5.
- PSI (معلومات توقف الضغط)
ترجمة¶
تُرجمت هذه الصفحة من الدليل بواسطة زايد السعيدي <zayed.alsaidi@gmail.com>
هذه الترجمة هي وثيقة مجانية؛ راجع رخصة جنو العامة الإصدار 3 أو ما بعده للاطلاع على شروط حقوق النشر. لا توجد أي ضمانات.
إذا وجدت أي أخطاء في ترجمة صفحة الدليل هذه، يرجى إرسال بريد إلكتروني إلى قائمة بريد المترجمين: kde-l10n-ar@kde.org.
| systemd 260.1 |