Linux SystemD haqqında

Salam dostlar. Bu günki mövzumuz Linux əməliyyat sisteminin Red Hat 7 distributivi ilə gələn Systemd haqqında olacaqdır. Systemd sistemi və ya servis idarə edicisi linux sistemində servislərin başladılmasından, sondürülməsindən və ya idarə edilməsindən məsuliyyətlidir. Systemd sistemi Red Hat əvvəlki versiyalarında olan SysV init sistemi ilə əvəzlənib hətda daha çox funksiya əlavə edilib.O funksiyalardan bəzilərini qeyd etsək, sistemdə resursların daha yaxşı formada idarə edilməsi(cgroups), yeni logging texnologiyası(journalctl), dependensiyaların daha da sadələşdirilib sistemin sürətli şəkildə yüklənməsi(bunu da bəzi scriptləri paralel olaraq icra etməsinən irəli gəlir), əvvəkli versiyada ancaq servisləri idarə edə bilirdinizsə amma Systemd-də daxilində bir çox servis olan unitləri idarə edirsiniz. Unitlər də öz növbəsində çox şey ola bilər, misal üçün ən çox vacib unit servisdir. Tipik olaraq servis də xüsüsi funsionallıq təmin edən hər hansi bir prosesdir. Servislərdən başqa unitlər də mövcüddur belə ki soketlər,mountlar və başqaları amma SysV də isə yanlız servisləri idarə bilirdiniz, systemd isə aşağıda göstərilənlərin hamısını idarə edə bilərsiniz. Sistemdə olan unitlərə baxmaq üçün aşağıdakı komandadan istifadə edilir.

# systemctl -t help

Available unit types:

service

socket

busname

target

snapshot

device

mount

automount

swap

timer

path

slice

scope

Systemd-nin əsas konfiqurasiya faylları.

Ümümi systemd confiqurasiyası /etc/systemd/ direktoriyasında saxlanılır.

Sistem xüsüsiyyətli fayllar isə /etc/systemd/system direktoriyasında saxlanılır.

İşləyən zaman (runtime) olan konfiqurasiyalar avtomatik olaraq /run/systemd/system direktoriyasında generasiya olunur.

Sistemin susyamaya görə unit faylları /usr/lib/systemd/system direktoriyasında saxlanılır.

Misal üçün Vsftpd unit faylına baxsaq.


$ cat vsftpd.service

[Unit]

Description=Vsftpd ftp daemon

After=network.target

[Service]

Type=forking

ExecStart=/usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf

[Install]

WantedBy=multi-user.target

Hər systemd unit faylı 3 bölmədən ibarət olur.Birinci həmişə unit olar, ikinci unitin tipinə görə dəyişir yəni servis, soket, mount və s , üçüncü isə həmişə İnstall bölməsi olur.

[Unit] – bu unit özünü və dependensiyanlarını təsvir edir. Burada ola biləcək AfterBefore xüsüsiyyətləri müxtəlif unitlər arasında dependensiyanı göstərir. Əgər After xüsüsiyyətidirsə, bu zaman biz anlamalıyıq ki, bu unit(vsftpd) Afterdə qeyd olunan unitdən əvvəl başlamalıdır. Before xüsüsiyyəti olduqda isə , bu unit(vsftpd) Beforedə yazılan unitdən sonra başlamalıdır. After və Before -də verilən unitlər boşluqla ayrılır. Unit faylar olan direktoriyada #cat sshd.service yazib baxsanızı dependensiyaların boşluqla ayrıldığını görəcəksiniz.

[Service] – Burada siz ədatən unitin necə başladılması, söndürülməsi , yüklənmə statusu haqında məlumat və s. görəcəksiniz.ExecStart sətri unitin necə başladılmasını bildirir, ExecStop isə əksinə.

[Install] – Bu barədə ətraflı məlumatı target unitləri danışanda verməyə çalışacam.

Bu unit faylların strukturu unitlərdən asılı olaraq dəyişə bilər, misal üçün fayla unit bölməsi altında başqa xüsüsiyyətlər və ya başqa bir yeni bölmə əlavə edilə bilər. Nümünə üçün mount unit faylına baxaq.

$ cat tmp.mount</span>

[Unit]

Description=Temporary Directory

Documentation=man:hier(7)

Documentation=http://www.freedesktop.org/wiki/Software/systemd/APIFileSystems

ConditionPathIsSymbolicLink=!/tmp

DefaultDependencies=no

Conflicts=umount.target

Before=local-fs.target umount.target

[Mount]

What=tmpfs

Where=/tmp

Type=tmpfs

Options=mode=1777,strictatime

# Make 'systemctl enable tmp.mount' work:

[Install]

WantedBy=local-fs.target

Bu unit faylın bəzi fərqli xüsüsiyyətləri vardır, onlardan ən vacibi isə Conflicts xüsüsiyyətir.Yəni mount unitinin bu xüsusiyyətin qarşısında yazılan başqa unitlərlə birlikdə istifadə olunma bilməyəcəyini bildirir.Mount bölməsinə baxdıqda isə aydın şəkildə bilmək olur.

Unitlərin başqa vacib tiplərindən biri isə soket(socket) unitidir. Soket hər hansı proqramların başqa biri ilə əlaqadə olması üçün soket yaradır.Bəzi servislər başlayanda öz soketlərini yaradırlar.Hər soketin özünə uygun unit faylına ehtiyacı vardır.Buna nümünə olaraq virtlockd unit faylını göstərəcə. Bu systemd soketi virtual maşınlar üçün olan prosesləri izləyir.

$ cat virtlockd.socket
[Unit]
Description=Virtual machine lock manager socket
[Socket]
ListenStream=/var/run/libvirt/virtlockd-sock
[Install]
WantedBy=sockets.target

Dediyimiz kimi, hər unit faylınn özünə uygun xüsüsiyyətləri vardır. Bunları hamısını yadda saxlamaq çətindir. Bu problemi həll etmək üçün siz ümümilikdə #systemctl show komandasından , əgər hər hansı xüsüsi unitə görə istəsəniz onda # systemctl show sshd yaza məlumatlana bilərsiniz.

Target unitləri haqqında

Bildiyimiz kimi Unit fayllar sizin serverinizdə funksionallığın yaradılması üçün istifadə olunur.Və onları düzgün anda düzgün ardıcıllığda yükləmək lazımdır.Unitlərin xüsüsi tiplərdən biridə target unitlərdir. Target unitlərə sadə izah versək, onda bunu unitlər qrupu kimi anlamaq olar. Amma müxtəlif cür target tipləri vardir.Bəzi targetlər isə Red hat 7-nin əvvəlki versiyasında olan icra səviyyələrinə(run levels) ekvivalentdir. Run leveldədə öz növbəsində serverin hansı vəziyyətdə başladılmasında ibarətdir(çox istifadəçili modda, qrafik modda, text bazalı və s.). Nümünə üçün multi-user.target unit faylına baxaq.


$ cat multi-user.target

....

[Unit]

Description=Multi-User System

Documentation=man:systemd.special(7)

Requires=basic.target

Conflicts=rescue.service rescue.target

After=basic.target rescue.service rescue.target

AllowIsolate=yes

Bu faylda olan bəzi xüsüsiyyətləri bir az öncə izah etmişdik. Başqa target tiplərinə gəldikdə isə misal üçün bura nfs.target, printer.target və s. vardır. Target unit faylların daxilində gordüyümz kimi o qədərdə çox informasiya olmur. Məlumatlar wantlarda olur. Bu wantların nə olduguni bilmək o qədərdə çətin deyil ingilis dilindən tərcümdə , istəmək mənasındadır və systemd-dəki wantlarda hər hansı bir target başlayarkən həmin targetdən nə istəcəyəni bildirir. Wantlar systemd unitləri aktivləşdirilən yaradılır və simbolik link olaraq /etc/systemd/system direktoriyasında subdirektoriyalar şəklində yaradılır. $ cd /etc/systemd/system/ komandasında istifadə edərək göstərilən direktoriyaya keçid eləsək və $ ls komandasını yazsaq bu aydın şəkildə görmüş olarıq.

Dediyimiz kimi,bəzi targetlər RHEL əvvəlki versiyalarında olan run səviyyələrinə uygundur.Həmin targetlər aşağıdakılardır.

Poweroff.target – runlevel 0 – Sistemi söndürür.

rescue.target – runlevel 1 – bərpa moduna keçir

multi-user.target – runlevel 3 – grafik olmayan çox istifadəçili moda keçir

graphic.target – runlevel 5 – grafik çox istifadəçili moda keçir

reboot.target- runlevel 6 – sistemi reboot(restart) edir

Bu unit faylların hər birinin tərkibinə /usr/lib/systemd/system/ direktoriyasında baxsanız AllowIsolate=yes sətri görəcəksiniz, bu o deməkdir ki siz sistemin vəziyyətini systemctl isolate əmrindən istifadə edərək bir vəziyyətdən digər vəziyyətə keçirə bilərsiniz. Misal üçün:

# systemctl isolate rescue.target   //komandasını yazsanız sistemin bərpa vəziyyətinə keçəcəkdir.

# systemctl isolate reboot.target  //komandasını yazsanız sistemin restart olacaqdır.

Hal-hazırda sistemin hansı targetdə oldugunu öyrənmək üçün

# systemctl get-default    //komandasından istifadə etməlisiniz

# systemctl set-default “target_name” //isə sizin təyin etdiyiniz target_name , sizin sisteminizi susmaya görə həçin vəziyyətə gətirəcəkdir.

Düzdü ingilis dilində olsada aşağıdakı şəkildə SysVSystemD arasında müəyyən fərqlər göstərilmişdir.

systemd-vs-sysvinit-cheatsheet

Bu günlük bu qədər dostlar, çalışdım ki systemd sistemi haqqında ümümi məlumat verim. Ümid varam ki faydalı olacaqdır.

Gələn görüşlərədək…

Səs: +70. Bəyənilsin Zəifdir

Müəllif: Babək Məmmədov

Şərhlər ( 4 )

  1. Təşəkkürlər, Babək bəy.

     

  2. Təşəkkürlər Babək bəy,  sayənizdə artıq Linux üçün ilk müraciət edəcəyim yer Technet.az olacaq 🙂

Şərh yazın