دليل البدء في Systemd: الجزء العملي
دليل المبتدئين في Systemd: قسم الأوامر أولاً، المصدر ثانياً، نظرة عامة على Systemd ثالثاً، إدارة النظام 3.1 systemctl 3.2 systemd-analyze 3.3 hostnamectl 3.4 localectl 3.5 timedatectl 3.6 loginctl وحدة 4.1 المعنى 4.2 حالة الوحدة 4.3 إدارة الوحدة 4.4 العلاقات الاعتمادية خمسة، ملف إعداد الوحدة 5.1 نظرة عامة 5.2 حالة ملف التكوين 5.3 تنسيق ملف التكوين 5.4 كتل ملف التكوين الهدف ٧. إدارة السجلات معلومات الوثيقة
المؤلف: رون ييفنغ
التاريخ: 7 مارس 2016
Systemd هو أداة نظام لينوكس تستخدم لبدء التشغيل. عملية الحراسة أصبح تكوينًا قياسيًا لمعظم التوزيعات.
تقدم هذه المقالة الاستخدامات الأساسية له، مقسمة إلى جزئين. اليوم سنقدم الأوامر الرئيسية له، المقالة التالية تقديم كيفية استخدامها في الممارسة العملية.
في التاريخ،
إقلاع لينكس
استمر في استخدام
init
عملية.
تستخدم الأوامر أدناه لبدء الخدمة.
xxxxxxxxxx
$ sudo /etc/init.d/apache2 start
أو
$ service apache2 start
هذه الطريقة لها عيبان.
أولاً، وقت التشغيل طويل.
init
تبدأ العمليات بشكل تسلسلي، حيث لا يبدأ العملية التالية إلا بعد الانتهاء من العملية السابقة.
ثانياً، بدء تشغيل البرنامج النصي معقد.
init
العملية تقوم فقط بتنفيذ سكربت الإطلاق، دون الانشغال بأي أمور أخرى. يحتاج السكربت إلى معالجة مختلف الحالات بنفسه، مما يجعل السكربت غالبًا طويلاً.
تم إنشاء Systemd لحل هذه المشكلات. هدف تصميمه هو تقديم مجموعة كاملة من الحلول لبدء النظام وإدارته.
وفقًا لعادات لينكس، الحروف
d
هو اختصار لعملية الحراسة (daemon). معنى اسم Systemd هو أنه يهدف إلى حماية النظام بأكمله.
( الصورة أعلاه لمؤلف Systemd ) Lennart Poettering )
استخدام Systemd يعني أنه لم يعد هناك حاجة لاستخدام
init
تم استبدال Systemd بـ
initd
، ليصبح أول عملية في النظام (معرّف العملية يساوي 1)، بينما تكون العمليات الأخرى عمليات تابعة له.
xxxxxxxxxx
$ systemctl --version
الأمر أعلاه يعرض إصدار Systemd.
Systemd 的优点是功能强大,使用方便,缺点是体系庞大,非常复杂。事实上,现在还有很多人反对使用 Systemd,理由就是它过于复杂,与操作系统的其他部分强耦合,违反"keep simple, keep stupid"的 فلسفة يونكس
(الصورة أعلاه هي مخطط هيكل Systemd)
Systemd ليس أمرًا واحدًا، بل هو مجموعة من الأوامر التي تتعلق بجميع جوانب إدارة النظام.
systemctl
هو الأمر الرئيسي لـ Systemd، والذي يُستخدم لإدارة النظام.
xxxxxxxxxx
# إعادة تشغيل النظام
$ sudo systemctl reboot
# إيقاف تشغيل النظام، قطع الطاقة
$ sudo systemctl poweroff
# توقف المعالج عن العمل
$ sudo systemctl halt
# تعليق النظام
$ sudo systemctl suspend
# جعل النظام يدخل حالة السبات الشتوي
$ sudo systemctl hibernate
# جعل النظام يدخل حالة السكون التفاعلية
$ sudo systemctl hybrid-sleep
# بدء الدخول في حالة الإنقاذ (حالة المستخدم الفردي)
$ sudo systemctl rescue
systemd-analyze
الأمر المستخدم لعرض وقت بدء التشغيل.
xxxxxxxxxx
# عرض زمن بدء التشغيل
$ systemd-analyze
# عرض زمن بدء كل خدمة
$ systemd-analyze blame
# عرض عملية بدء التشغيل بشكل شلال
$ systemd-analyze critical-chain
# عرض تدفق بدء الخدمة المحددة
$ systemd-analyze critical-chain atd.service
hostnamectl
الأمر يُستخدم لعرض معلومات المضيف الحالي.
xxxxxxxxxx
# عرض معلومات المضيف الحالي
$ hostnamectl
# تعيين اسم المضيف.
$ sudo hostnamectl set-hostname rhel7
localectl
الأمر المستخدم لعرض إعدادات التوطين.
xxxxxxxxxx
# عرض إعدادات التوطين
$ localectl
# تعيين معلمات التوطين.
$ sudo localectl set-locale LANG=en_GB.utf8
$ sudo localectl set-keymap en_GB
timedatectl
الأمر المستخدم لعرض إعدادات المنطقة الزمنية الحالية.
# عرض إعدادات المنطقة الزمنية الحالية
$ timedatectl
# عرض جميع المناطق الزمنية المتاحة
$ timedatectl list-timezones
# تعيين المنطقة الزمنية الحالية
$ sudo timedatectl set-timezone America/New_York
$ sudo timedatectl set-time YYYY-MM-DD
$ sudo timedatectl set-time HH:MM:SS
loginctl
الأمر يُستخدم لعرض المستخدمين الحاليين المسجلين الدخول.
xxxxxxxxxx
# قائمة الجلسات الحالية
$ loginctl list-sessions
# قائمة المستخدمين المسجلين حاليًا
$ loginctl list-users
# عرض معلومات المستخدم المحدد
$ loginctl show-user ruanyf
يمكن لـ Systemd إدارة جميع موارد النظام. تُعرف الموارد المختلفة باسم وحدة (Unit).
الوحدة تنقسم إلى 12 نوعًا.
systemctl list-units
يمكنك استخدام الأمر لعرض جميع الوحدات الحالية في النظام.
xxxxxxxxxx
# قائمة الوحدات الجارية
$ systemctl list-units
# قم بإدراج جميع الوحدات، بما في ذلك تلك التي لم يتم العثور على ملفات التكوين الخاصة بها أو التي فشلت في الإقلاع.
$ systemctl list-units --all
# قم بإدراج جميع الوحدات التي لم يتم تشغيلها
$ systemctl list-units --all --state=inactive
# قائمة بجميع الوحدات التي فشلت في التحميل
$ systemctl list-units --failed
# قائمة بجميع الوحدات من نوع الخدمة التي تعمل حالياً
$ systemctl list-units --type=service
systemctl status
الأمر يستخدم لعرض حالة النظام وحالة وحدة واحدة.
xxxxxxxxxx
# عرض حالة النظام
$ systemctl status
# عرض حالة وحدة واحدة
$ sysystemctl status bluetooth.service
# عرض حالة وحدة معينة على المضيف البعيد
$ systemctl -H root@rhel7.example.com status httpd.service
باستثناء
status
أمر،
systemctl
كما تم توفير ثلاث طرق بسيطة للتحقق من الحالة، والتي تستخدم بشكل أساسي في جمل التحقق داخل السكربت.
xxxxxxxxxx
# عرض ما إذا كانت وحدة معينة قيد التشغيل
$ systemctl is-active application.service
# عرض ما إذا كانت وحدة معينة في حالة فشل في البدء
$ systemctl is-failed application.service
# عرض ما إذا كانت خدمة وحدة معينة قد أنشأت رابط بدء التشغيل
$ systemctl is-enabled application.service
بالنسبة للمستخدمين، الأوامر الأكثر استخدامًا هي تلك أدناه، والتي تُستخدم لبدء وإيقاف الوحدات (التي تركز بشكل أساسي على الخدمة).
xxxxxxxxxx
# ابدأ خدمة على الفور
$ sudo systemctl start apache.service
# إيقاف خدمة على الفور
$ sudo systemctl stop apache.service
إعادة تشغيل خدمة
$ sudo systemctl restart apache.service
# قتل جميع العمليات الفرعية لخدمة معينة
$ sudo systemctl kill apache.service
# إعادة تحميل ملف تكوين خدمة
$ sudo systemctl reload apache.service
# إعادة تحميل جميع ملفات التكوين المعدلة
$ sudo systemctl daemon-reload
# عرض جميع المعلمات الأساسية لوحدة معينة
$ systemctl show httpd.service
# عرض قيمة خاصية معينة لوحدة معينة
$ systemctl show -p CPUShares httpd.service
# تعيين خاصية معينة لوحدة معينة
$ sudo systemctl set-property httpd.service CPUShares=500
توجد علاقة اعتماد بين الوحدات: اعتماد A على B يعني أن Systemd عند بدء تشغيل A سيبدأ أيضًا تشغيل B.
systemctl list-dependencies
قم بإدراج جميع التبعيات لوحدة معينة.
xxxxxxxxxx
$ systemctl list-dependencies nginx.service
في ناتج الأمر أعلاه، هناك بعض التبعيات من نوع Target (انظر أدناه)، والتي لا يتم عرضها بشكل افتراضي. إذا كنت ترغب في توسيع Target، ستحتاج إلى استخدام
--all
معاملات.
xxxxxxxxxx
$ systemctl list-dependencies --all nginx.service
كل وحدة تحتوي على ملف تكوين، يخبر Systemd كيفية بدء تشغيل هذه الوحدة.
النظامd الافتراضي من الدليل
/etc/systemd/system/
قراءة ملف الإعدادات. ومع ذلك، فإن معظم الملفات الموجودة فيه هي روابط رمزية تشير إلى الدلائل.
/usr/lib/systemd/system/
ملف التكوين الحقيقي مخزن في أي دليل.
systemctl enable
يتم استخدام الأمر لإنشاء علاقة ارتباط رمزي بين الدليلين المذكورين أعلاه.
xxxxxxxxxx
$ sudo systemctl enable clamd@scan.service
# يعادل
$ sudo ln -s '/usr/lib/systemd/system/clamd@scan.service' '/etc/systemd/system/multi-user.target.wants/clamd@scan.service'
إذا تم تعيين بدء التشغيل في ملف التكوين،
systemctl enable
الأمر يعادل تفعيل بدء التشغيل.
مقابل ذلك،
systemctl disable
الأمر يستخدم لإلغاء العلاقة بين الدلائلين، وهو يعادل إلغاء بدء التشغيل.
xxxxxxxxxx
$ sudo systemctl disable clamd@scan.service
امتداد ملف التكوين هو نوع الوحدة، مثل
sshd.socket
إذا تم حذفها، فإن نظام Systemd الافتراضي هو
.service
لذا
sshd
سيتم فهمه على أنه
sshd.service
。
systemctl list-unit-files
الأمر المستخدم لعرض جميع ملفات التكوين.
xxxxxxxxxx
# قائمة بجميع ملفات التكوين
$ systemctl list-unit-files
# قائمة ملفات التكوين من النوع المحدد
$ systemctl list-unit-files --type=service
سيقوم هذا الأمر بإخراج قائمة.
xxxxxxxxxx
$ systemctl list-unit-files
UNIT FILE STATE
chronyd.service enabled
clamd@.service static
clamd@scan.service disabled
تظهر هذه القائمة حالة كل ملف تعريف، وهناك أربعة أنواع.
[Install]
جزء (لا يمكن تنفيذه) ، يمكن استخدامه فقط كاعتماد لملفات التكوين الأخرى.
يرجى ملاحظة أنه لا يمكن تحديد ما إذا كانت الوحدة تعمل من حالة ملف التكوين. يجب تنفيذ ما تم ذكره سابقًا.
systemctl status
أمر.
xxxxxxxxxx
$ systemctl status bluetooth.service
بمجرد تعديل ملف التكوين، يجب عليك إعادة تحميل ملف التكوين في SystemD ثم إعادة التشغيل، وإلا فلن تُطبق التعديلات.
xxxxxxxxxx
$ sudo systemctl daemon-reload
$ sudo systemctl restart httpd.service
ملف التكوين هو مجرد ملف نصي عادي، يمكن فتحه باستخدام محرر نصوص.
systemctl cat
يمكنك استخدام الأمر لعرض محتوى ملف التكوين.
xxxxxxxxxx
$ systemctl cat atd.service
[Unit]
Description=ATD daemon
[Service]
Type=forking
ExecStart=/usr/bin/atd
[Install]
WantedBy=multi-user.target
يمكننا أن نرى من المخرجات أعلاه أن ملف التكوين مقسم إلى عدة كتل. السطر الأول من كل كتلة هو اسم مميز يتم تمثيله بأقواس مربعة، مثل
[Unit]
يرجى ملاحظة أن أسماء كتل وحقول ملف التكوين حساسة لحالة الأحرف.
كل كتلة تحتوي على مجموعة من أزواج القيم والمفاتيح الموصولة بواسطة علامات المساواة.
xxxxxxxxxx
[Section]
Directive1=value
Directive2=value
. . .
[Unit]
الكتلة عادة ما تكون الكتلة الأولى في ملف التكوين، وتستخدم لتعريف بيانات التعريف لوحدة (Unit)، بالإضافة إلى تكوين العلاقة مع وحدات أخرى. الحقول الرئيسية لها كما يلي.
Dsecription
وصف موجز
Documentation
عنوان الوثيقة
Requires
إذا كانت الوحدات الأخرى التي يعتمد عليها الوحدة الحالية غير قيد التشغيل، فسيفشل بدء الوحدة الحالية.
Wants
إذا كانت الوحدات الأخرى المرتبطة بالوحدة الحالية غير قيد التشغيل، فلن تفشل الوحدة الحالية في الإقلاع.
BindsTo
و
Requires
على غرار ذلك، إذا خرجت الوحدة المحددة، فسيتسبب ذلك في توقف الوحدة الحالية عن التشغيل.
Before
إذا كان يجب بدء الوحدة المحددة في هذا الحقل، فيجب أن تبدأ بعد الوحدة الحالية.
After
إذا كانت الوحدة المحددة في هذا الحقل تحتاج أيضًا إلى التشغيل، فيجب تشغيلها قبل الوحدة الحالية.
Conflicts
الوحدة المحددة هنا لا يمكن تشغيلها مع الوحدة الحالية في نفس الوقت.
Condition...
: يجب تلبية الشروط التي يجب أن تحققها الوحدة الحالية، وإلا فلن تعمل.
Assert...
: يجب أن تستوفي وحدة التشغيل الحالية الشروط المطلوبة، وإلا ستظهر رسالة فشل في الإقلاع.
[Install]
عادةً ما تكون الكتلة الأخيرة من ملف التكوين، وتستخدم لتعريف كيفية التشغيل وما إذا كان يجب بدء التشغيل عند تشغيل الجهاز. الحقول الرئيسية لها كالتالي.
WantedBy
قيمته هي هدف واحد أو أكثر، وعندما تكون الوحدة الحالية مفعلة، سيتم وضع الارتباط الرمزي.
/etc/systemd/system
تحت الفهرس باستخدام
اسم الهدف +
.wants
في الدليل الفرعي المكون من اللاحقات
RequiredBy
قيمته هي هدف واحد أو أكثر، وعندما يتم تفعيل الوحدة الحالية، سيتم إدخال الرابط الرمزي.
/etc/systemd/system
تحت الفهرس باستخدام
اسم الهدف +
.required
في الدليل الفرعي المكون من اللاحقات
Alias
: الأسماء المستعارة المتاحة لتشغيل الوحدة الحالية
Also
عند تفعيل الوحدة الحالية (التفعيل)، سيتم تفعيل وحدات أخرى في نفس الوقت.
[Service]
يتم استخدام الكتلة لتكوين الخدمة، فقط وحدات من نوع الخدمة لديها هذه الكتلة. الحقول الرئيسية لها كما يلي.
Type
: تحديد سلوك العملية عند بدء التشغيل. لديها القيم التالية.
Type=simple
القيمة الافتراضية، التنفيذ
ExecStart
الأمر المحدد، بدء العملية الرئيسية
Type=forking
: إنشاء عملية فرعية من العملية الأب بطريقة fork، وبعد الإنشاء ستخرج العملية الأب على الفور.
Type=oneshot
عملية واحدة، سينتظر Systemd حتى تخرج الخدمة الحالية قبل أن يستمر في التنفيذ.
Type=dbus
: الخدمة الحالية تبدأ عبر D-Bus
Type=notify
: تم تشغيل الخدمة الحالية، وسيتم الإبلاغ.
Systemd
تابع التنفيذ.
Type=idle
إذا كانت هناك مهام أخرى قد اكتملت، فستعمل الخدمة الحالية فقط.
ExecStart
: أمر تشغيل الخدمة الحالية
ExecStartPre
الأوامر التي يتم تنفيذها قبل بدء الخدمة الحالية
ExecStartPost
الأمر الذي يتم تنفيذه بعد بدء الخدمة الحالية
ExecReload
: الأمر الذي يتم تنفيذه عند إعادة تشغيل الخدمة الحالية
ExecStop
أمر يتم تنفيذه عند إيقاف الخدمة الحالية
ExecStopPost
إيقاف الأمر الذي يتم تنفيذه بعد توقف الخدمة
RestartSec
: عدد الثواني بين إعادة تشغيل الخدمة الحالية
Restart
تعريف الحالات التي سيقوم فيها Systemd بإعادة تشغيل الخدمة الحالية، والقيم المحتملة تشمل
always
(دائمًا إعادة التشغيل)
on-success
、
on-failure
、
on-abnormal
、
on-abort
、
on-watchdog
TimeoutSec
تعريف عدد الثواني التي ينتظرها Systemd قبل إيقاف الخدمة الحالية
Environment
تعيين متغير البيئة
يرجى الرجوع إلى القائمة الكاملة لحقول ملف تكوين الوحدة. الوثائق الرسمية
عند تشغيل الكمبيوتر، يحتاج إلى تشغيل عدد كبير من الوحدات. إذا كان من الضروري تحديد كل وحدة تحتاج إلى تشغيلها في كل مرة، فمن الواضح أن ذلك سيكون غير مريح للغاية. الحل الذي تقدمه Systemd هو الهدف (Target).
简单说,Target 就是一个 Unit 组,包含许多相关的 Unit 。启动某个 Target 的时候,Systemd 就会启动里面所有的 Unit。从这个意义上说,Target这个概念类似于"状态点",启动某个 Target 就好比启动到某种状态。
تقليدي
init
في وضع التشغيل، هناك مفهوم RunLevel، والذي يشبه وظيفة Target. والاختلاف هو أن RunLevel متعارضة، فلا يمكن تشغيل عدة RunLevel في نفس الوقت، بينما يمكن تشغيل عدة Target في نفس الوقت.
xxxxxxxxxx
# عرض جميع الأهداف الحالية للنظام
$ systemctl list-unit-files --type=target
# عرض جميع الوحدات الموجودة في هدف معين
$ systemctl list-dependencies multi-user.target
# عرض الهدف الافتراضي عند الإقلاع
$ systemctl get-default
# تعيين الهدف الافتراضي عند بدء التشغيل
$ sudo systemctl set-default multi-user.target
عند تغيير الهدف، لا يتم إغلاق العمليات التي بدأها الهدف السابق بشكل افتراضي.
أمر # systemctl isolate يغير هذا السلوك،
# إغلاق جميع العمليات في Target السابق التي لا تنتمي إلى Target التالي
$ sudo systemctl isolate multi-user.target
تتوافق Target مع مستوى التشغيل التقليدي كما يلي.
xxxxxxxxxx
Traditional runlevel New target name Symbolically linked to...
Runlevel 0 | runlevel0.target -> poweroff.target
Runlevel 1 | runlevel1.target -> rescue.target
Runlevel 2 | runlevel2.target -> multi-user.target
Runlevel 3 | runlevel3.target -> multi-user.target
Runlevel 4 | runlevel4.target -> multi-user.target
Runlevel 5 | runlevel5.target -> graphical.target
Runlevel 6 | runlevel6.target -> reboot.target
إنه مع
init
الاختلافات الرئيسية بين العمليات كالتالي.
(1) مستوى التشغيل الافتراضي
(في
/etc/inittab
تم استبدال إعدادات الملف) الآن بـ Target الافتراضي، الموقع هو
/etc/systemd/system/default.target
عادةً ما ترتبط الرموز بالـ
graphical.target
واجهة رسومية أو
multi-user.target
(سطر الأوامر المتعدد المستخدمين).
(2) موقع سكربت التشغيل
كان سابقًا
/etc/init.d
الدليل، روابط رمزية إلى أدلة RunLevel مختلفة (مثل
/etc/rc3.d
、
/etc/rc5.d
الآن يتم تخزينه في
/lib/systemd/system
و
/etc/systemd/system
فهرس.
(3) موقع ملف التكوين
سابقًا
init
ملف تكوين العملية هو
/etc/inittab
تُخزَّن ملفات تكوين الخدمات المختلفة في
/etc/sysconfig
الفهرس. يتم تخزين ملفات التكوين الحالية بشكل رئيسي في
/lib/systemd
الفهرس، في
/etc/systemd
يمكن أن تتجاوز التعديلات في الدليل الإعدادات الأصلية.
يعمل Systemd على إدارة جميع سجلات بدء التشغيل لوحدات الخدمة بشكل موحد. الفائدة من ذلك هي أنه يمكنك فقط استخدام
journalctl
أمر لعرض جميع السجلات (سجلات النواة وسجلات التطبيقات). ملف تكوين السجلات هو
/etc/systemd/journald.conf
。
journalctl
وظيفة قوية، واستخدامها متعدد جداً.
# عرض جميع السجلات (بشكل افتراضي، يتم حفظ سجلات بدء التشغيل الحالي فقط)
$ sudo journalctl
# عرض سجلات النواة (بدون عرض سجلات التطبيقات)
$ sudo journalctl -k
# عرض سجلات بدء تشغيل النظام هذه المرة
$ sudo journalctl -b
$ sudo journalctl -b -0
# عرض سجل آخر تشغيل (يجب تغيير الإعدادات)
$ sudo journalctl -b -1
# عرض السجلات في وقت محدد
$ sudo journalctl --since="2012-10-30 18:17:16"
$ sudo journalctl --since "20 min ago"
$ sudo journalctl --since yesterday
$ sudo journalctl --since "2015-01-10" --until "2015-01-11 03:00"
$ sudo journalctl --since 09:00 --until "1 hour ago"
# عرض آخر 10 أسطر من السجل في النهاية
$ sudo journalctl -n
# عرض سجلات عدد محدد من الأسطر من النهاية
$ sudo journalctl -n 20
# عرض السجلات الجديدة في الوقت الفعلي
$ sudo journalctl -f
# عرض سجلات الخدمة المحددة
$ sudo journalctl /usr/lib/systemd/systemd
# عرض سجلات العملية المحددة
$ sudo journalctl _PID=1
# عرض سجلات البرنامج النصي لمسار معين
$ sudo journalctl /usr/bin/bash
# عرض سجلات المستخدم المحدد
$ sudo journalctl _UID=33 --since today
# عرض سجلات وحدة معينة
$ sudo journalctl -u nginx.service
$ sudo journalctl -u nginx.service --since today
# عرض أحدث سجلات وحدة معينة بشكل متواصل实时
$ sudo journalctl -u nginx.service -f
# دمج عرض سجلات متعددة للوحدات
$ journalctl -u nginx.service -u php-fpm.service --since today
# عرض السجلات ذات الأولوية المحددة (وما فوقها) ، هناك 8 مستويات
# 0: emerg
# 1: alert
# 2: crit
# 3: err
# 4: warning
# 5: notice
# 6: info
# 7: debug
$ sudo journalctl -p err -b
# الإخراج الافتراضي للسجلات مقسم إلى صفحات، --no-pager يغيره إلى الإخراج القياسي العادي
$ sudo journalctl --no-pager
{"以 JSON 格式(单行)输出":"إخراج بتنسيق JSON (سطر واحد)"}
$ sudo journalctl -b -u nginx.service -o json
```json
{
"格式": "JSON",
"特点": "可读性更好"
}
```
$ sudo journalctl -b -u nginx.serviceqq
-o json-pretty
# عرض المساحة التخزينية المستخدمة من قبل السجلات
$ sudo journalctl --disk-usage
# تحديد الحد الأقصى لمساحة ملف السجل
$ sudo journalctl --vacuum-size=1G
# تحديد مدة حفظ ملفات السجل
$ sudo journalctl --vacuum-time=1years
(النهاية)
لقد استخدمت مؤخرًا: