إدارة الخدمات على لينكس بأدوات نظام التمهيد systemd


محمد أحمد العيل

يتكوّن نظام التمهيد systemd من مجموعة من الأدوات التي تمثّل منصة مركزية لإدارة نظام لينكس وإعداده. تُستخدم أداة systemctl للتحكّم في systemd وإدارة الخدمات المرتبطة به. يهدف هذا المقال إلى إلقاء الضوء على كيفية إدارة النظام والخدمات على نظام تشغيل يستخدم systemd للتمهيد.

أساسيات systemd وsystemctl

  1. التحقق من أن systemd مثبّت وإصداره:

     
    $ systemd --version
    systemd 229
    +PAM +AUDIT +SELINUX +IMA +APPARMOR +SMACK +SYSVINIT +UTMP +LIBCRYPTSETUP +GCRYPT +GNUTLS +ACL +XZ -LZ4 +SECCOMP +BLKID +ELFUTILS +KMOD -IDN
    

    يظهر من المثال أعلاه أن نظام التمهيد systemd مثبت وأن لدينا الإصدار 229.

  2. التحقق من مكان تواجد الملفات التنفيذية والمكتبات البرمجية الخاصّة بـ وsystemctl:

    $ whereis systemd
    systemd: /usr/lib/systemd /bin/systemd /etc/systemd /lib/systemd /usr/share/systemd /usr/share/man/man1/systemd.1.gz
    $ whereis systemctl
    systemctl: /bin/systemctl /usr/share/man/man1/systemctl.1.gz

     

  3. التحقق من حالة عمل systemd

    يمكن استخدام الأمر ps لسرد العمليات Processes النشطة ثم عزل تلك المتعلقة بـsystemd، وذلك على النحو التالي:

    $ ps -eaf | grep [s]ystemd
    root      1000     1  0 12:23 ?        00:00:00 /lib/systemd/systemd-journald
    root      1029     1  0 12:23 ?        00:00:00 /lib/systemd/systemd-udevd
    systemd+  2639     1  0 12:23 ?        00:00:00 /lib/systemd/systemd-timesyncd
    message+  2781     1  0 12:23 ?        00:00:01 /usr/bin/dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation
    root      2862     1  0 12:23 ?        00:00:00 /lib/systemd/systemd-logind
    sddm      3284     1  0 12:23 ?        00:00:00 /lib/systemd/systemd --user
    academy   3532     1  0 12:25 ?        00:00:00 /lib/systemd/systemd --user

    تحمل عمليّة systemd المعرِّف 1. استخدمنا الخيار e- مع الأمر ps لسرد جميع العمليات، ثم حدّدنا العمليات التي لا ترأس جلسة Session leaders (العمليات التي يساوي معرّف العمليّة السّلف Parent Id معرّفَ الجلسة Session Id). استخدمنا الخيار f- لتهيئة مخرجات الأمر التي طبّقنا عليه الأمر grep لتحديد تلك التي توافق التعبير النمطي s]ystemd].

  4. تحليل متتالية الإقلاع في systemd

    تُستخدَم أداة systemd-analyze لتحليل متتالية الإقلاع:

    $ systemd-analyze 
    Startup finished in 9.314s (firmware) + 2.897s (loader) + 9.290s (kernel) + 46.672s (userspace) = 1min 8.175s

    نضيف المعطى blame للأمر أعلاه من أجل الحصول على الوقت الذي استغرقته كل خدمة للإقلاع:

    $ systemd-analyze blame
        40.880s systemd-suspend.service
        25.010s apt-daily.service
        14.173s dev-sda7.device
        10.530s dnsmasq.service
        10.228s click-system-hooks.service
        7.909s accounts-daemon.service
        7.908s ModemManager.service
        7.120s NetworkManager-wait-online.service
        7.084s gpu-manager.service
        (...)

    يمكن أيضا تحليل الوقت المستغرق للعمليات الحرجة باستخدام المعطى critical-chain الذي يطبع شجرة بتتالي العمليات التي تنتظر بقية العمليات إقلاعها:

    $ systemd-analyze critical-chain
    The time after the unit is active or started is printed after the "@" character.
    The time the unit takes to start is printed after the "+" character.
    
    graphical.target @41.348s
    └─multi-user.target @41.348s
    └─apache2.service @34.735s +6.612s
        └─network-online.target @34.717s
        └─NetworkManager-wait-online.service @27.596s +7.120s
            └─NetworkManager.service @21.672s +5.913s
            └─dbus.service @21.471s
                └─basic.target @21.470s
                └─sockets.target @21.470s
                    └─snapd.socket @21.441s +17ms
                    └─sysinit.target @21.391s
                        └─apparmor.service @20.785s +605ms
                        └─local-fs.target @20.772s
                            └─run-user-123.mount @35.991s
                            └─local-fs-pre.target @15.110s
                                └─systemd-remount-fs.service @15.038s +27ms
                                └─systemd-journald.socket @3.530s
                                    └─-.slice @3.497s

    تظهر بعد علامة @ المدة التي فُعلت بعدها الوحدة، في ما يظهر الوقت الذي استغرقته الوحدة للإقلاع بعد علامة +.

    يمكن تمرير اسم وحدة إلى الأمر أعلاه لقصر السّرد على العمليات التي تنتظر الوحدة إقلاعها:

    $ systemd-analyze critical-chain apache2.service
    The time after the unit is active or started is printed after the "@" character.
    The time the unit takes to start is printed after the "+" character.
    
    └─network-online.target @35.533s
    └─NetworkManager-wait-online.service @29.424s +6.108s
        └─NetworkManager.service @22.174s +7.234s
        └─dbus.service @20.998s
            └─basic.target @20.976s
            └─sockets.target @20.976s
                └─snapd.socket @20.919s +46ms
                └─sysinit.target @20.902s
                    └─apparmor.service @19.691s +1.193s
                    └─local-fs.target @19.681s
                        └─run-user-123.mount @37.402s
                        └─local-fs-pre.target @14.915s
                            └─systemd-remount-fs.service @14.866s +32ms
                            └─system.slice @3.541s
                                └─-.slice @3.508s

     

  5. سرد الوحدات

    يعمل الأمر systemctl عند استخدام المعطى list-unit-files على سرد قائمة بجميع الوحدات الموجودة في النظام:

    $ systemctl list-unit-files
    UNIT FILE                                  STATE   
    proc-sys-fs-binfmt_misc.automount          static  
    org.freedesktop.hostname1.busname          static  
    org.freedesktop.locale1.busname            static  
    org.freedesktop.login1.busname             static  
    org.freedesktop.network1.busname           static  
    org.freedesktop.resolve1.busname           static  
    org.freedesktop.systemd1.busname           static  
    org.freedesktop.timedate1.busname          static  
    dev-hugepages.mount                        static  
    dev-mqueue.mount                           static  
    proc-sys-fs-binfmt_misc.mount              static  
    sys-fs-fuse-connections.mount              static  
    sys-kernel-config.mount                    static  
    sys-kernel-debug.mount                     static  
    acpid.path                                 enabled 
    cups.path                                  enabled 
    (...)

    ملحوظة: يمكن للوحدة أن تكون خدمة، نقطة تركيب Mount point، مقبس شبكة Socket أو جهازا طرفيا Device.

    يمكنك الاقتصار على الوحدات العاملة حاليا بالمعطى list-units:

    $ systemctl list-units
    UNIT LOAD ACTIVE SUB DESCRIPTION
    proc-sys-fs-binfmt_misc.automount loaded active running Arbitrary Executable File Formats File System Automoun
    sys-devices-pci0000:00-0000:00:02.0-drm-card0-card0\x2deDP\x2d1-intel_backlight.device loaded active plugged /sys/devices/pci0000:
    sys-devices-pci0000:00-0000:00:03.0-sound-card0.device loaded active plugged Broadwell-U Audio Controller
    sys-devices-pci0000:00-0000:00:14.0-usb1-1\x2d3-1\x2d3:1.0-net-enx582c80139263.device loaded active plugged E353/E3131
    sys-devices-pci0000:00-0000:00:14.0-usb1-1\x2d4-1\x2d4:1.0-bluetooth-hci0.device loaded active plugged /sys/devices/pci0000:00/000
    sys-devices-pci0000:00-0000:00:1b.0-sound-card1.device loaded active plugged Wildcat Point-LP High Definition Audio Controller
    (…)

    كما يمكن عزل الوحدات التي أخفقت بالمعطى failed--:

    $ systemctl --failed
    UNIT                    LOAD   ACTIVE SUB    DESCRIPTION
    ● snapd.refresh.service   loaded failed failed Automatically refresh installed snaps
    ● systemd-suspend.service loaded failed failed Suspend
    
    LOAD   = Reflects whether the unit definition was properly loaded.
    ACTIVE = The high-level unit activation state, i.e. generalization of SUB.
    SUB    = The low-level unit activation state, values depend on unit type.
    
    2 loaded units listed. Pass --all to see loaded but inactive units, too.
    To show all installed unit files use 'systemctl list-unit-files'.

     

  6. التحقق من تفعيل خدمة

    يطلُب الأمر التالي التحقق من أن خدمة الجدولة Cron مفعَّلة (تعمل مع إقلاع النظام):

    $ systemctl is-enabled cron.service
    enabled

    يظهر من نتيجة الأمر أن الخدمة مفعَّلة enabled.

  7. التحقق من حالة خدمة

    نتحقق في الأمر التالي من حالة الخدمتين mysql وapache2:

    systemctl status apache2.service
    ● apache2.service - LSB: Apache2 web server
    Loaded: loaded (/etc/init.d/apache2; bad; vendor preset: enabled)
    Drop-In: /lib/systemd/system/apache2.service.d
    └─apache2-systemd.conf
    Active: active (running) since Wed 2016-09-14 12:23:56 GMT; 4h 31min ago

    يظهر في نتيجة تنفيذ الأمرين أعلاه أن mysql غير مفعَّلة وليست نشطة أثناء تنفيذ الأمر؛ أما الخدمة apache2 فهي مفعَّلة وتعمل منذ أربع ساعات.

التحكم في الخدمات وإداراتها بـ systemctl

  1. سرد جميع الخدمات

    يسرُد الأمر التالي جميع خدمات النظام بغضّ النظر عن حالتها (مفعَّلة أو معطَّلة):

    $ systemctl list-unit-files --type=service
    UNIT FILE                                  STATE   
    accounts-daemon.service                    enabled 
    acpid.service                              disabled
    apport-forward@.service                    static  
    apt-daily.service                          static  
    atd.service                                enabled 
    autovt@.service                            enabled 
    bootlogd.service                           masked  
    bootlogs.service                           masked  
    bootmisc.service                           masked  
    cgmanager.service                          enabled 
    cgproxy.service                            enabled 
    checkfs.service                            masked  
    checkroot-bootclean.service                masked  
    checkroot.service                          masked  
    (...)

     

  2. تشغيل خدمة (apache2)، إيقافها، إعادة تشغيلها أو إعادة تحميلها:

    تبدأ الأوامر التالية تشغيل الخدمة apache2، تعيد تحميلها، تعيد تشغيلها وتوقفها على التوالي (تحتاج لصلاحيات إدارية):

     
    # sudo systemctl start apache2
    # sudo systemctl restart apache2
    # sudo systemctl stop apache2
    # sudo systemctl reload apache2
    apache2.service is not active, cannot reload.
    # sudo systemctl start apache2
    # sudo systemctl reload apache2
    # sudo systemctl status  apache2
    ● apache2.service - LSB: Apache2 web server
    Loaded: loaded (/etc/init.d/apache2; bad; vendor preset: enabled)
    Drop-In: /lib/systemd/system/apache2.service.d
            └─apache2-systemd.conf
    Active: active (running) since Wed 2016-09-14 17:15:11 GMT; 17s ago
    

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

  3. تفعيل خدمة أو تعطيلها

    تُسمّى الخدمات التي تبدأ بالعمل مع إقلاع النظام بالخدمات المفعَّلة Enabled، وعكسُها الخدمات المعطّلة Disabled. أما الخدمات النشطة Active فهي الخدمات العاملة حاليا (تُشغَّل بالأمر start). يستفسر الأمر التالي عن نشاط الخدمة apache2 (تعمل أم لا):

    $ systemctl is-active apache2.service 
    active

    نستخدم الأمر disable لتعطيل خدمة وenable لتفعيلها:

    # systemctl enable apache2.service 
    # systemctl disable apache2.service

     

  4. إخفاء خدمة

    يمنع الإخفاء Masking تشغيل خدمة. يمكن إخفاء الخدمة apache2 على النحو التالي:

    # systemctl mask apache2.service 
    Created symlink from /etc/systemd/system/apache2.service to /dev/null.

    ولإلغاء الإخفاء:

    $ sudo systemctl unmask apache2.service 
    Removed symlink /etc/systemd/system/apache2.service.

     

  5. الإيقاف الإجباري لخدمة بـsystemctl

    # systemctl kill apache2
    # sudo systemctl status apache2
    ● apache2.service - LSB: Apache2 web server
    Loaded: loaded (/etc/init.d/apache2; bad; vendor preset: enabled)
    Drop-In: /etc/systemd/system/apache2.service.d
            └─50-CPUShares.conf
            /lib/systemd/system/apache2.service.d
            └─apache2-systemd.conf
    Active: inactive (dead)
        Docs: man:systemd-sysv-generator(8)

     

التحكم في نقاط التركيب وإداراتها بـsystemctl

  1. سرد جميع نقاط التركيب في النظام

    $ systemctl list-unit-files --type=mount
    UNIT FILE                     STATE 
    dev-hugepages.mount           static
    dev-mqueue.mount              static
    proc-sys-fs-binfmt_misc.mount static
    sys-fs-fuse-connections.mount static
    sys-kernel-config.mount       static
    sys-kernel-debug.mount        static
    tmp.mount                     disabled
    
    7 unit files listed.

     

  2. إدارة نقاط التركيب

    يمكن بالأوامر التالية تشغيل نقطة تركيب، فصلها، إعادة تركيبها والتحقق من حالتها على التوالي:

    # systemctl start tmp.mount
    # systemctl stop tmp.mount
    # systemctl restart tmp.mount
    # systemctl reload tmp.mount
    # systemctl status tmp.mount
    tmp.mount - Temporary Directory
    Loaded: loaded (/usr/lib/systemd/system/tmp.mount; disabled)
    Active: active (mounted) since Wed 2016-09-14 17:36:11 GMT;; 2min 48s ago
    Where: /tmp
    What: tmpfs
    (...)

     

  3. تفعيل نقطة تركيب أو تعطيلها

    يمكن بطريقة مشابهة للخدمات تفعيل نقاط التركيب أوتعطيلها:

    # systemctl enable tmp.mount
    # systemctl disable  tmp.mount

     

  4. إخفاء نقطة تركيب

    يُستخدَم الأمر mask لإخفاء نقطة تركيب على النحو التالي:

    # systemctl mask tmp.mount
    Created symlink from /etc/systemd/system/tmp.mount to /dev/null.

    ولإلغاء الإخفاء:

    # systemctl unmask tmp.mount
    Removed symlink /etc/systemd/system/tmp.mount

     

التحكّم في مقابس الشبكة بـsystemctl

  1. سرد جميع المقابس

    $ systemctl list-unit-files --type=socket
    UNIT FILE                       STATE   
    acpid.socket                    enabled 
    apport-forward.socket           enabled 
    avahi-daemon.socket             enabled 
    cups.socket                     enabled 
    dbus.socket                     static  
    lxd.socket                      masked  
    saned.socket                    disabled
    snapd.socket                    enabled 
    syslog.socket                   static  
    systemd-bus-proxyd.socket       static  
    systemd-fsckd.socket            static  
    systemd-initctl.socket          static  
    systemd-journald-audit.socket   static  
    systemd-journald-dev-log.socket static  
    systemd-journald.socket         static  
    systemd-networkd.socket         disabled
    systemd-rfkill.socket           static  
    systemd-udevd-control.socket    static  
    systemd-udevd-kernel.socket     static  
    uuidd.socket                    enabled                                                                                               
    20 unit files listed.
    
    
    
  2. تشغيل مقبس (cups)، إعادة تشغيله، إعادة تحميله أو إيقافه:

    # systemctl start cups.socket
    # systemctl restart cups.socket
    # systemctl reload cups.socket
    # systemctl stop cups.socket
    $ systemctl status cups.socket
    ● cups.socket - CUPS Scheduler
    Loaded: loaded (/lib/systemd/system/cups.socket; enabled; vendor preset: enabled)
    Active: active (listening) since Thu 2016-09-15 14:39:47 GMT; 5s ago
    Listen: /var/run/cups/cups.sock (Stream)

     

  3. تفعيل مقبس أو تعطيله:

    # systemctl enable cups.socket
    # systemctl disable cups.socket

     

  4. إخفاء مقبس

    $ sudo systemctl mask cups.socket
    Created symlink from /etc/systemd/system/cups.socket to /dev/null.
    $ sudo systemctl unmask cups.socket
    Removed symlink /etc/systemd/system/cups.socket.

     

استخدام المعالج

  1. حصة خدمة من المعالج

    يمكن استخدام systemctl لعرض عدد الحصص الحاليّة المحدّدة لخدمة من المعالج:

    # systemctl show -p CPUShares apache2.service
    CPUShares=18446744073709551615

    تعرّف قيمة CPUShares الوقت المخصّص للخدمة من المعالج. تعني زيادة هذه القيمة الرفع من أولويّة للخدمة. يمكن تحديد الحصّة بتغيير قيمة المتغيّر على النحو التالي:

    # systemctl set-property apache2.service CPUShares=1500
    $ systemctl show -p CPUShares apache2.service
    CPUShares=1500

    ينشئ النظام عند تحديد حصّة خدمة مجلّدا يوافق اسمه اسمَ الخدمة (مثلا apache2.service.d) وينشئ بداخله ملف إعداد يبدأ برقم يتبعه اسم المتغيّر (مثلا 50-CPUShares.conf):

    $ cat /etc/systemd/system/apache2.service.d/50-CPUShares.conf 
    [Service]
    CPUShares=1500

     

  2. عرض تفاصيل الإعداد الخاصّة بخدمة

    $ systemctl show apache2
    Type=forking
    Restart=no
    NotifyAccess=none
    RestartUSec=100ms
    TimeoutStartUSec=5min
    TimeoutStopUSec=5min
    RuntimeMaxUSec=infinity
    WatchdogUSec=0
    WatchdogTimestampMonotonic=0
    FailureAction=none
    PermissionsStartOnly=no
    RootDirectoryStartOnly=no
    RemainAfterExit=no
    GuessMainPID=no
    MainPID=0
    ControlPID=0
    FileDescriptorStoreMax=0
    NFileDescriptorStore=0
    StatusErrno=0
    (...)

     

  3. عرض اعتماديّات خدمة

    $ systemctl list-dependencies apache2.service
    apache2.service
    ● ├─system.slice
    ● ├─network-online.target
    ● │ ├─networking.service
    ● │ └─NetworkManager-wait-online.service
    ● └─sysinit.target
    ●   ├─apparmor.service
    ●   ├─brltty.service
    ●   ├─console-setup.service
    ●   ├─dev-hugepages.mount
    ●   ├─dev-mqueue.mount
    ●   ├─friendly-recovery.service
    ●   ├─keyboard-setup.service
    ●   ├─kmod-static-nodes.service
    ●   ├─plymouth-read-write.service
    ●   ├─plymouth-start.service
    ●   ├─proc-sys-fs-binfmt_misc.automount
    ●   ├─resolvconf.service
    ●   ├─setvtrgb.service
    (...)

     

  4. سرد مجموعات التحكّم Control groups

    يُستخدَم الأمر systemd-cgls لسرد مجموعات التحكّم هرميّا على النحو التالي:

    # systemd-cgls
    ├─1 /usr/lib/systemd/systemd --switched-root --system --deserialize 21
    ├─user.slice
    │ └─user-1000.slice
    │   └─session-1.scope
    │     ├─ 2292 gdm-session-worker [pam/gdm-password]
    │     ├─ 2308 /usr/bin/gnome-keyring-daemon --daemonize --login
    │     ├─ 2351 gnome-session --session gnome-classic
    │     ├─ 2358 dbus-launch --sh-syntax --exit-with-session
    │     ├─ 2359 /bin/dbus-daemon --fork --print-pid 4 --print-address 6 --sessi...
    │     ├─ 2424 /usr/libexec/gvfsd
    │     ├─ 2428 /usr/libexec/gvfsd-fuse /run/user/1000/gvfs -f -o big_writes

    يُمكن سرد هذه المجموعات حسب استخدام المعالج والذاكرة العشوائية أو حسب المُدخَلات والمُخرجات بالأمر systemd-cgtop:

    Path                                              Tasks   %CPU   Memory  Input/s Output/s
    
    /                                                  216   37.7     1.6G        -        -
    /system.slice                                      -    7.1        -        -        -
    /system.slice/gdm.service                          2    7.1        -        -        -
    /system.slice/rngd.service                         1    0.0        -        -        -
    /system.slice/tuned.service                        1    0.0        -        -        -
    /system.slice/vboxadd-service.service              1    0.0        -        -        -
    /system.slice/httpd.service                        6    0.0        -        -        -

     

التحكم في مستويات التشغيل Runlevels

  1. الإقلاع في وضع الإنقاذ Rescue mode أو وضع الطوارئ Emergency mode

    يمكن في حال حدوث مشكل الإقلاعُ في وضع الإنقاذ بالأمر التالي:

    # systemctl rescue

    كما يُستخدم الأمر systemctl للإقلاع في وضع الطوارئ:

    # systemctl emergency

    وللعودة إلى وضع الإقلاع المبدئي:

    # systemctl default

     

  2. عرض مستوى التشغيل الحالي

    $ systemctl get-default
    graphical.target

     

  3. الإقلاع على مستوى تشغيل

    يمكن تحديد مستوى التشغيل الذي نريد الإقلاع عليه بالأمر systemctl isolate؛ مثلا:

    # systemctl isolate runlevel5.target
    # systemctl isolate runlevel3.target

    أو بذكر اسم المستوى:

    # systemctl isolate graphical.target
    # systemctl isolate multiuser.target

     

  4. تعيين مستوى التشغيل المبدئي

     
    # systemctl set-default runlevel3.target
    # systemctl set-default runlevel5.target
    

    مستويات التشغيل هي التالية:

    • المستوى 0 runlevel0: إيقاف تشغيل النظام وفصله عن الطاقة.
    • المستوى 1 runlevel1: وضع الإنقاذ والصيانة.
    • المستوى 2 runlevel2: تعدّد المستخدمين.
    • المستوى 3 runlevel3: تعدّد المستخدمين مع تشغيل خدمات الشبكة.
    • المستوى 4 runlevel4: مستوى تشغيل محجوز لما يعرّفه المستخدم.
    • المستوى 5 runlevel5: المستوى 3 + واجهة رسومية.
    • المستوى 6 runlevel6: إعادة تشغيل النظام.
  5. إعادة تشغيل النظام، إيقافه، تعليقه وإسباته
# systemctl reboot
# systemctl halt
# systemctl suspend
# systemctl hibernate

كما يمكن جعل النظام في وضع السبات المزدوج (مزيج من وضع السبات والتعليق) بالأمر:

 

# systemctl hybrid-sleep

ترجمة - بتصرّف - لمقال How to Manage ‘Systemd’ Services and Units Using ‘Systemctl’ in Linux.





تفاعل الأعضاء




يجب أن تكون عضوًا لدينا لتتمكّن من التعليق

انشاء حساب جديد

يستغرق التسجيل بضع ثوان فقط


سجّل حسابًا جديدًا

تسجيل الدخول

تملك حسابا مسجّلا بالفعل؟


سجّل دخولك الآن