systemd چیست ؟
systemd یک مدیر (manager) برای سیستم و سرویسهای لینوکسی بوده که با تمامی سیستمهای LSB و sysV سازگاری دارد و محاسن ذکر شده در زیر را در اختیار سیستم قرار میدهد .
- systemd قابلیت پردازش موازی پویا را فراهم میکند
- برای استارت سرویسها از فعالیتهای D-bus و سوکتها استفاده میکند
- استارت سرویسها بر اساس تقاضا(on-demand)
- پردازشها را با استفاده از کنترل گروپ لینوکس ردیابی میکند
- پشتیبانی از snapshotting و بازگرداندن حالت سیستم
- نگه داشتن نقاط 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 به اشتراک بگذارید.