systemd چیست ؟


systemd چیست ؟

systemd یک مدیر (manager) برای سیستم و سرویس‌های لینوکسی بوده که با تمامی سیستم‌های LSB و sysV سازگاری دارد و محاسن ذکر شده در زیر را در اختیار سیستم قرار میدهد .

  1. systemd قابلیت پردازش موازی پویا را فراهم می‌کند
  2. برای استارت سرویس‎‌ها از فعالیت‌های D-bus و سوکت‌ها استفاده می‌کند
  3. استارت سرویس‌ها بر اساس تقاضا(on-demand)
  4. پردازش‌ها را با استفاده از کنترل گروپ لینوکس ردیابی می‌کند
  5. پشتیبانی از snapshotting و بازگرداندن حالت سیستم
  6. نگه داشتن نقاط mount و automount و پیاده سازی یک منطق کنترل سرویس مبتنی بر وابستگی متقابل

در systemd به تمامی سرویس‌ها،سوکت‌ها،مونت پوینت‌ها،دیوایس‌ها یونیت(unit) گفته می‎شود.

در اکوسیستم لینوکسی systemd در اکثر توزیع‌های لینوکس با کمی استثنا پیاده‌سازی شده است .

systemd در centos 7 جایگزین sysVinit شده است که همین امر باعث بوت (راه اندازی اولیه سیستم عامل) سریعتر این سیستم عامل شده است چرا که systemd از اسکریپت‌های کمتری استفاده می‌کند و همچنین بیشتر عملیات‌ها (task) را به طور همزمان (موازی) اجرا می‌کند .

systemctl چیست ؟

systemctl یک ابزار سیستمی برای مدیریت و کنترل systemd است.

شروع کار با systemd و systemctl

برای قدم اول شروع کار با systemd با استفاده از کامند زیر بررسی می‌کنیم که آیا بر روی توزیع لینوکس مورد نظر systemd نصب هست یا خیر و چه نسخه ای از آن در سیستم عامل لینوکس ما نصب است.

#debian based system
systemd --version
#rhel based system
systemctl --version

خروجی کامند بالا در صورتی که بر روی توزیع در حال کار شما systemd فعال باشد مشابه زیر خواهد بود که در این سیستم systemd نسخه ۲۱۹ فعال است.

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

در صورتی که پیام دیگری مانند -bash: systemd: command not found مشاهده نمودید به این معناست که در توزیع یا نسخه توزیع شما از systemd استفاده نشده و احتمالا هنوز بر پایه sysV در حال فعالیت است مانند Centos 5

مسیر لایبراری‎ها و فایلهای کانفیگ systemctl و systemd

systemctl و systemd نیز مانند سایر ابزارهای لینوکس از طریق لایبراری‌ها و فایل‌های کانفیگ بر روی لینوکس فعالیت کرده و کنترل می‎شوند که با استفاده از دستور زیر می‌توانید مسیر آن‌ها را بیابید .

whereis systemctl

systemctl: /usr/bin/systemctl /usr/share/man/man1/systemctl.1.gz

whereis systemd
systemd: /usr/lib/systemd /etc/systemd /usr/include/systemd /usr/share/systemd /usr/share/man/man1/systemd.1.gz

نکته: کامند whereis به معنای کجاست را می‌توانید برای سایر سرویس‌ها یا ابزارهای لینوکس نیز استفاده کنید و به کمک آن مسیر ذخیره فایل‌های آن سرویس یا ابزار را پیدا کنید که در این خصوص حتما در مقاله جداگانه در آینده نزدیک صحبت خواهیم کرد .

بررسی فعال(run) بودن  systemd

ps -eaf | grep [s]ystemd

اگر پس از اجرای دستور فوق خروجی مشاهده نکردید که البته در صورت فعال بودن systemd در سیستم شما این امر تقریبا غیر ممکن است مگر در شرایط خاص و احتمالا بحرانی (با فرض اینکه در توزیع شما systemd وجود دارد) به این معناست که systemd غیر فعال شده و در حال فعالیت نیست، در غیر اینصورت خروجی ای مشابه زیر را مشاهده خواهید کرد .

root 1 0 0 Jun09 ? 00:01:56 /usr/lib/systemd/systemd –switched-root –system  deserialize 22
root 2617 1 0 Jun09 ? 00:03:32 /usr/lib/systemd/systemd-journald
root 2651 1 0 Jun09 ? 00:00:00 /usr/lib/systemd/systemd-udevd
root 5052 1 0 Jun09 ? 00:00:48 /usr/lib/systemd/systemd-logind
dbus 5055 1 0 Jun09 ? 00:02:06 /usr/bin/dbus-daemon –system –address=systemd: –nofork –nopidfile –system -activation

در خصوص دستور ps که در این کامند استفاده شده است در آینده صحبت خواهیم کرد، در خروجی بالا systemd به عنوان یک پراسس والد با شناسه (id) 1 در حال اجرا است .

تجزیه تحلیل روند بوت systemd

با استفاده از دستور زیر می‎توانید زمان تقریبی بوت سیستم عامل را متوجه شوید. که خروجی مشابه زیر خواهد داشت

systemd-analyzesystemd-analyze
Startup finished in 487ms (kernel) + 2.776s (initrd) + 20.229s (userspace) = 23.493s

تجزیه و تحلیل زمان بوت شدن هر یک از یونیت‎ها

با استفاده از دستور زیر زمان صرف شده به ازای هر یونیت از ابتدای فرایند آغاز به کار تا اتمام آن و فعال شدن کامل را مانند خروجی زیر مشاهده خواهید کرد.

systemd-analyze blamesystemd-analyze blame
mariadb.service 7.991 s
webmin.service 6.095 s
postfix.service 4.311 s
httpd.service 3.926 s
firewalld.service 3.780 s
kdump.service 3.238 s
tuned.service 1.712 s
network.service 1.394 s
lvm2-monitor.service 1.26 s
systemd-logind.service 8.556 s
...

تجزیه و تحلیل زنجیره حیات در بوت شدن

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.
multi-user.target @20.222s
└─mariadb.service @11.657s +8.565s
└─network.target @11.168s
└─network.service @9.456s +1.712s
└─NetworkManager.service @8.858s +596ms
└─firewalld.service @4.931s +3.926s
└─basic.target @4.916s
└─sockets.target @4.916s
└─dbus.socket @4.916s
└─sysinit.target @4.905s
└─systemd-update-utmp.service @4.864s +39ms
└─auditd.service @4.563s +301ms
└─systemd-tmpfiles-setup.service @4.485s +69ms
└─rhel-import-state.service @4.342s +142ms
└─local-fs.target @4.324s
└─boot.mount @4.286s +31ms
└─systemd-fsck@dev-disk-by\x2duuid-79f594ad\x2da332\x2d4730\x2dbb5f\x2d85d19608096
└─dev-disk-by\x2duuid-79f594ad\x2da332\x2d4730\x2dbb5f\x2d85d196080964.device @4

زمان ذکر شده در خروجی بالا که پس از علامت @ آمده است زمان شروع یا فعال شدن آن بوده و زمان ذکر شده پس از علامت + زمان صرف شده برای فعال شدن یونیت می‌باشد .

دریافت لیست تمام یونیت‎ها

با دستور زیر لیست تمامی یونیت‎های روی سیستم را مانند خروجی زیر مشاهده می‌کنید

systemctl list-unit-filessystemctl list-unit-files
UNIT FILE STATE
proc-sys-fs-binfmt_misc.automount 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
tmp.mount disabled
brandbot.path enabled
systemd-ask-password-console.path static
....

دریافت لیست تمام یونیت‎های در حال اجرا

با دستور زیر تمامی یونیت‌هایی که در حال حاضر فعال هستند را مشاهده خواهید کرد که خروجی به شکل زیر است.

 systemctl list-units systemctl list-units
UNIT LOAD ACTIVE SUB DESCRIPTION
proc-sys-fs-binfmt_misc.automount loaded active waiting Arbitrary Executable File Formats File System Automo
sys-devices-pci0000:00-0000:00:01.0-0000:01:00.0-host5-port\x2d5:0-end_device\x2d5:0-target5:0:0-5:0:0:0-block-sdc-sdc1.device lo
sys-devices-pci0000:00-0000:00:01.0-0000:01:00.0-host5-port\x2d5:0-end_device\x2d5:0-target5:0:0-5:0:0:0-block-sdc-sdc2.device lo
sys-devices-pci0000:00-0000:00:01.0-0000:01:00.0-host5-port\x2d5:0-end_device\x2d5:0-target5:0:0-5:0:0:0-block-sdc-sdc3.device lo
sys-devices-pci0000:00-0000:00:01.0-0000:01:00.0-host5-port\x2d5:0-end_device\x2d5:0-target5:0:0-5:0:0:0-block-sdc.device loaded
sys-devices-pci0000:00-0000:00:01.0-0000:01:00.0-host5-port\x2d5:1-end_device\x2d5:1-target5:0:1-5:0:1:0-block-sdd-sdd1.device lo
sys-devices-pci0000:00-0000:00:01.0-0000:01:00.0-host5-port\x2d5:1-end_device\x2d5:1-target5:0:1-5:0:1:0-block-sdd.device loaded
sys-devices-pci0000:00-0000:00:1a.7-usb1-1\x2d4-1\x2d4:1.0-host4-target4:0:0-4:0:0:0-block-sr1.device loaded active plugged Vir
sys-devices-pci0000:00-0000:00:1a.7-usb1-1\x2d4-1\x2d4:1.0-host4-target4:0:0-4:0:0:1-block-sda.device loaded active plugged Vir
sys-devices-pci0000:00-0000:00:1a.7-usb1-1\x2d4-1\x2d4:1.0-host4-target4:0:0-4:0:0:2-block-sdb.device loaded active plugged Vir
sys-devices-pci0000:00-0000:00:1c.0-0000:0b:00.0-net-ens1f0.device loaded active plugged 82576 Gigabit Network Connection
sys-devices-pci0000:00-0000:00:1c.0-0000:0b:00.1-net-ens1f1.device loaded active plugged 82576 Gigabit Network Connection
sys-devices-pci0000:00-0000:00:1f.5-ata4-host3-target3:0:0-3:0:0:0-block-sr0.device loaded active plugged HL-DT-ST_DVDRAM_GT51N

لیست تمام یونیت‌های از کار افتاده

با زدن دستور زیر در محیط شل نیز میتوانید به سادگی تمامی یونیت‌های متوقف شده را یافته و نسبت به انجام عملیات مورد نظر برای رفع مشکل آن‌ها اقدام کنید که خروجی مشابه زیر خواهد داشت.

systemctl --failedsystemctl --failed
UNIT LOAD ACTIVE SUB DESCRIPTION
● mariadb.service loaded failed failed MariaDB 10.1.36 database server
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.
1 loaded units listed. Pass --all to see loaded but inactive units, too.
To show all installed unit files use 'systemctl list-unit-files'.

بررسی اوتو استارت بودن سرویس یا یونیت

با ارسال دستور زیر متوجه خواهید شد که یک یونیت یا سرویس به صورت استارت خودکار یا اوتو‎لود در سیستم شما فعال هست یا خیر که در پاسخ کلمه enable در صورت فعال بودن و کلمه disabled در صورت غیر فعال بودن چاپ خواهد شد.

systemctl is-enabled mariadb.servicesystemctl is-enabled mariadb.service

بررسی وضعیت یک سرویس یا یونیت

جهت بررسی وضعیت یک سرویس یا یونیت از دستور زیر استفاده می‌کنیم که در صورت فعال نبودن آن خروجی مانند زیر خواهد بود

systemctl status firewalld.servicesystemctl status firewalld.service 
● firewalld.service
Loaded: masked (/dev/null; bad)
Active: inactive (dead)

و در صورت فعال بودن یک سرویس خروجی مشابه خروجی زیر را مشاهده میکنید

● mysqld.service - MariaDB database server
Loaded: loaded (/etc/systemd/system/mysqld.service; enabled; vendor preset: disabled)
Active: active (running) since Sun 2019-06-09 18:50:34 +0430; 1 weeks 0 days ago
Main PID: 120155 (mysqld)
Status: "Taking your SQL requests now..."
CGroup: /system.slice/mysqld.service
└─۱۲۰۱۵۵ /usr/sbin/mysqld

نحوه مدیریت و کنترل سرویس‌ها با استفاده systemctl

تا به اینجا با برخی از دستورات systemctl و مکانیزم systemd آشنا شدیم اما بخش بسیار مهم و کاربردی کامند systemctl نحوه مدیریت سرویس‏‌ها و کنترل آن‌ها است که در ادامه به آن خواهیم پرداخت .

لیست تمامی سرویس‌های فعال و غیرفعال سیستم

برای دریافت لیست سرویس‌ها از دستور زیر استفاده می‌کنیم که خروجی آن مشابه زیر خواهد بود، باید بدانید که ستون state وضعیت اوتو‎استارت بودن سرویس در زمان بوت سیستم را نمایش میدهد.

systemctl list-unit-files --type=servicesystemctl list-unit-files --type=service
UNIT FILE STATE
alt-php53-fpm.service disabled
alt-php54-fpm.service disabled
alt-php55-fpm.service disabled
alt-php56-fpm.service disabled
alt-php70-fpm.service disabled
alt-php70-newrelic-daemon.service disabled
alt-php71-fpm.service disabled
alt-php71-newrelic-daemon.service disabled
alt-php72-fpm.service disabled
alt-php72-newrelic-daemon.service disabled
alt-php73-fpm.service disabled
alt-php73-newrelic-daemon.service disabled
arp-ethers.service disabled
auditd.service enabled
.....

نکته : در صورتی که میخواهید در لیست بالا سرویس‌هایی با state یا وضعیت خاص مانند enabled را فیلتر کنید تا فقط یونیت‌های دارای وضعیت مورد نظر نمایش داده شوند میتوانید به این شکل عمل کنید .

systemctl list-unit-files --type=service --state=enabledsystemctl list-unit-files --type=service --state=enabled

وضعیت mask در ستون state لیست سرویس‌ها یا یونیت‌ها به معنی غیر‎قابل استارت است، یعنی این یونیت به صورت دستی یا حتی با درخواست سایر سرویس‌ها/نرم‎افزار‎ها نیز قابل اجرا یا استارت نخواهند بود.

چگونه سرویس‌ها را در systemctl استارت،استاپ،ری‎استارت،ریلود کنیم

برای این منظور می‌توانید از دستورات زیر استفاده کنید، با توجه به مشخص بودن عملیات انجام شده توسط هر کامند از توضیح آن چشم پوشی می‌کنیم.

# استارت سرویس
1systemctl start httpd.service
# شروع مجدد سرویس
systemctl restart httpd.service
# متوقف کردن سرویس
systemctl stop httpd.service
# بارگذاری مجدد سرویس
systemctl reload httpd.service
# مشاهده وضعیت سرویس
systemctl status httpd.service

چگونه یک سرویس را به وضعیت فعال یا غیرفعال تغییر دهیم (اوتو‎استارت در زمان بوت سیستم)

برای اینکه یک سرویس در زمان بوت سیستم به صورت خودکار استارت شود از دستور زیر استفاده میکنیم

systemctl enable httpd.servicesystemctl enable httpd.service

و برای اینکه یک سرویس از حالت اوتو‎استارت خارج شود از دستور زیر استفاده می‌کنیم

systemctl disable httpd.servicesystemctl disable httpd.service

و همچنین برای اینکه یک سرویس غیر‎قابل استارت شود از دستور استفاده میکنیم

 systemctl mask httpd.servicesystemctl mask httpd.service

و برای خارج کردن از حالت غیر‎قابل استارت نیز از دستور زیر استفاده میکنیم.

systemctl unmask httpd.servicesystemctl unmask httpd.service

چگونه یک سرویس را با systemctl میتوانیم kill کنیم

حتما میدانید که kill در سیستم‎های نرم افزاری به معنای توقف فوری یک پردازش است که البته خود kill با چند متد مختلف قابل اجرا است که هر یک از آن‌ها توضیحات مربوط به خود را داشته که می‌طلبد در پستی مجزا در این خصوص توضیح دهیم. از طریق systemctl و دستور زیر میتوانید یک سرویس را kill کنید.

systemctl kill httpdsystemctl kill httpd

مدیریت نقاط mount با استفاده از systemctl

زمانی که در لینوکس اقدام به ایجاد یک پارتیشن میکنیم برای دسترسی به آن باید این پارتیشن را به یک دایرکتوری متصل کنیم به این عملیات، مانت کردن میگوییم که در این خصوص و نحوه مانت کردن در مقالات آینده مفصلا توضیح خواهیم داد.

ابزار پر‎قدرت systemctl در مدیریت mount point نیز به شما کمک میکند که در ادامه به آن خواهیم پرداخت.

لیست تمامی نقاط mount

با استفاده از دستور زیر لیست نقاط مانت را دریافت می‌کنید که خروجی مانند زیر خواهد بود .

systemctl list-unit-files --type=mountsystemctl 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

چگونگی استاپ،استارت،ریلود و دریافت وضعیت یک نقطه مانت

با استفاده از دستورات زیر میتوانید عملیات‌های ذکر شده را انجام دهید.

systemctl start tmp.mount
systemctl stop tmp.mount
systemctl restart tmp.mount
systemctl reload tmp.mount
systemctl status tmp.mount

نحوه فعال یا غیر فعال کردن یک نقطه مانت در زمان بوت سیستم(اوتو‎ مانت)

دستورات زیر همانند مورد مربوط به سرویس‌ها جهت اوتو مانت نیز کارایی دارند is-active جهت بررسی وضعیت کنونی یک مانت پوینت می‌باشد

systemctl is-active tmp.mount
systemctl enable tmp.mount
systemctl disable tmp.mount
systemctl mask tmp.mount
systemctl unmask tmp.mount

نحوه مدیریت و کنترل سوکت‌ها با استفاده از systemctl

همانطور که در مورد نقاط مانت مشاهده کردید تمامی دستورات و کارکرد کامند systemctl در مورد نقاط مانت مشابه مورد قبلی در کنترل سرویس‌ها بود، با این تفاوت که در تمامی کامند‌ها کلمه mount را جایگزین کلمه service کردیم. در خصوص مدیریت و کنترل سوکت‌ها نیز به همین شکل تمامی کامند‌های قبلی صادق بوده و فقط بجای service از socket استفاده میشود.

دریافت لیست سوکت‌ها با استفاده از systemctl

برای دریافت لیست سوکت‎های فعال و غیرفعال از دستور زیر استفاده می‌کنیم که خروجی همانند موارد قبل را مشاهده خواهید کرد.

systemctl list-unit-files --type=socketsystemctl list-unit-files --type=socket

چگونگی استاپ،استارت،ریلود و دریافت وضعیت یک سوکت با استفاده از systemctl

با استفاده از دستورات زیر میتوانید عملیات‌های ذکر شده را انجام دهید.

systemctl start cups.socket
systemctl restart cups.socket
systemctl stop cups.socket
systemctl reload cups.socket
systemctl status cups.socket

نحوه فعال یا غیر فعال کردن یک سوکت در زمان بوت سیستم(اوتو‎ استارت)

دستورات زیر همانند مورد مربوط به سرویس‎ها جهت اوتو استارت کردن سوکت‌ها نیز کارایی دارند is-active جهت بررسی وضعیت کنونی یک سوکت میباشد

systemctl is-active cups.socket
systemctl enable cups.socket
systemctl disable cups.socket

قرار دادن وضعیت سوکت در حالت غیر قابل استارت در لینوکس با systemctl

با استفاده ار دستور اول میتوانید یک سوکت در لینوکس را با استفاده از systemctl در وضعیت غیر‌قابل اجرا قرار دهید تا به صورت دستی یا درخواست سایر سرویس‌ها نیز اجرا نشود و با دستور دوم این وضعیت را لغو نمایید.

systemctl mask cups.socket
systemctl unmask cups.socket

این تمامی کامندهای مربوط به systemctl بود البته کامندهای دیگری هم هست که ما از آن‎ها به علت کارایی کم چشم پوشی کردیم، با ما همراه باشید و از طریق بخش نظرات، دیدگاه‌ها و کامندهای دیگر را در خصوص systemctl به اشتراک بگذارید.

ارسال پاسخ

آدرس ایمیل شما منتشر نخواهد شد. فیلدهای مورد نیاز با * مشخص شده اند.پر کردن این فیلد ضروری است *