این مقاله با هدف بررسی ، نحوه کنترل سیستم و سرویسها در سیستم عاملهایی که در آنها systemd اجرا میشوند ایجاد شده است .
فهرست مطلب
- systemd چیست ؟
- systemctl چیست ؟
- شروع کار با systemd و systemctl
- تجزیه تحلیل روند بوت systemd
- تجزیه و تحلیل زمان بوت شدن هر یک از یونیتها
- تجزیه و تحلیل زنجیره حیات در بوت شدن
- دریافت لیست تمام یونیتها
- دریافت لیست تمام یونیتهای در حال اجرا
- لیست تمام یونیتهای از کار افتاده
- بررسی اوتو استارت بودن سرویس یا یونیت
- بررسی وضعیت یک سرویس یا یونیت
- نحوه مدیریت و کنترل سرویسها با استفاده systemctl
- مدیریت نقاط mount با استفاده از systemctl
- نحوه مدیریت و کنترل سوکتها با استفاده از systemctl
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-analyze
میتوانید زمان تقریبی بوت سیستم عامل را متوجه شوید. که خروجی مشابه زیر خواهد داشت
Startup finished in 487ms (kernel) + 2.776s (initrd) + 20.229s (userspace) = 23.493s
تجزیه و تحلیل زمان بوت شدن هر یک از یونیتها
با استفاده از دستور systemd-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-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
تمامی یونیتهایی که در حال حاضر فعال هستند را مشاهده خواهید کرد که خروجی به شکل زیر است.
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 --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. ۱ loaded units listed. Pass --all to see loaded but inactive units, too. To show all installed unit files use 'systemctl list-unit-files'.
بررسی اوتو استارت بودن سرویس یا یونیت
با ارسال کامند systemctl is-enabled mariadb.service
متوجه خواهید شد که یک یونیت یا سرویس به صورت استارت خودکار یا اوتولود در سیستم شما فعال هست یا خیر که در پاسخ کلمه enable در صورت فعال بودن و کلمه disabled در صورت غیر فعال بودن چاپ خواهد شد.
بررسی وضعیت یک سرویس یا یونیت
جهت بررسی وضعیت یک سرویس یا یونیت از کامند systemctl 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 نحوه مدیریت سرویسها و کنترل آنها است که در ادامه به آن خواهیم پرداخت .
لیست تمامی سرویسهای فعال و غیرفعال سیستم
برای دریافت لیست سرویسها از دستور systemctl list-unit-files --type=service
استفاده میکنیم که خروجی آن مشابه زیر خواهد بود، باید بدانید که ستون state وضعیت اوتواستارت بودن سرویس در زمان بوت سیستم را نمایش میدهد.
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=enabled
عمل کنید .
وضعیت mask در ستون state لیست سرویسها یا یونیتها به معنی غیرقابل استارت است، یعنی این یونیت به صورت دستی یا حتی با درخواست سایر سرویسها/نرمافزارها نیز قابل اجرا یا استارت نخواهند بود.
چگونه سرویسها را در systemctl استارت،استاپ،ریاستارت،ریلود کنیم
برای این منظور میتوانید از دستورات زیر استفاده کنید، با توجه به مشخص بودن عملیات انجام شده توسط هر کامند از توضیح آن چشم پوشی میکنیم.
systemctl start httpd.service systemctl restart httpd.service systemctl stop httpd.service systemctl reload httpd.service #مشاهده وضعیت سرویس systemctl status httpd.service
چگونه یک سرویس را به وضعیت فعال یا غیرفعال تغییر دهیم (اوتواستارت در زمان بوت سیستم)
برای اینکه یک سرویس در زمان بوت سیستم به صورت خودکار استارت شود از کامند systemctl enable httpd.service
و برای اینکه یک سرویس از حالت اوتواستارت خارج شود از دستور systemctl disable httpd.service
استفاده میکنیم و همچنین برای اینکه یک سرویس غیرقابل استارت شود از کامند systemctl mask httpd.service
استفاده میکنیم و برای خارج کردن از حالت غیرقابل استارت نیز از کامند systemctl unmask httpd.service
استفاده میکنیم.
چگونه یک سرویس را با systemctl میتوانیم kill کنیم
حتما میدانید که kill در سیستمهای نرم افزاری به معنای توقف فوری یک پردازش است که البته خود kill با چند متد مختلف قابل اجرا است که هر یک از آنها توضیحات مربوط به خود را داشته که میطلبد در پستی مجزا در این خصوص توضیح دهیم. از طریق systemctl و کامند systemctl kill httpd
میتوانید یک سرویس را kill کنید.
مدیریت نقاط mount با استفاده از systemctl
زمانی که در لینوکس اقدام به ایجاد یک پارتیشن میکنیم برای دسترسی به آن باید این پارتیشن را به یک دایرکتوری متصل کنیم به این عملیات، مانت کردن میگوییم که در این خصوص و نحوه مانت کردن در مقالات آینده مفصلا توضیح خواهیم داد.
ابزار پرقدرت systemctl در مدیریت mount point نیز به شما کمک میکند که در ادامه به آن خواهیم پرداخت.
لیست تمامی نقاط mount
با استفاده از دستور 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
چگونگی استاپ،استارت،ریلود و دریافت وضعیت یک نقطه مانت
با استفاده از دستورات زیر میتوانید عملیاتهای ذکر شده را انجام دهید.
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=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 به اشتراک بگذارید.
4 نظر
سلام و خسته نباشید میگم بهت
دستتم درد نکنه.من به شخصه خیلی دلم میخواد بیشتر با این ابزارها کار کنم.
چیزای مثل haproxy , fitoban , دستورات کامل فایروالها
تنظیم میل سرور و ایجاد امنیت خوب با دانش کافی که هر بخش چیکار میکنه و هنگامی که خطا رخ میده کجا و چطوری میشه رفع کرد
چطوری میشه dns ست کرد تو لینوکس و چطوری می چنرین وب سایت و سابدومین داشت.
همه ایا هر بار که به مشکل میخورم با هزار زحمت رفع میکنم و حتی بیشتر این موارد میتونم بگم بلد نیستم و فقط کپی از مطالب خارجی و تمام که اصلا دوست ندارم.همیشه میخوام بدونم هر دستور چیکار میکنه و چیرو برام اماده میکنه
خیلی ها از پنل های پولی یا رایگان استفاده میکنن.ولی اصلا نمیدونیم امنیت رعایت میشه یا همونی که طرف نموشته رو کور کوراه قبول میکنیم
اگه اینچیزارو بتونی و وقتشو داشته باشی بنویسی یه لطف بزرگ به هم ادما فارسی زبان کردی
بابت مطلبت ممنون
سلام
ممنون از حسن توجه شما ، هدف من از ایجاد این سایت همین بوده اما متاسفانه کمبود زمان برای نوشتن مطالب باعث شده نتونم سایت رو آپدیت کنم که امیدوارم بزودی با مطالب جدید در خدمت شما دوستان عزیز باشم . نگران نباشید خیلی از حرفه ای ها هم خیلی مواقع از همین روش شما برای رفع مشکلات استفاده میکنند 🙂 و البته یکی از ارکان اصلی اوپن سورس هم همین موضوع در دسترس بودن مقالات و راه حل های رفع مشکلات به صورت رایگان برای همگان است که این سیستم رو جذاب تر میکنه ، در کل براتون آرزوی موفقیت دارم و امیدوارم روزی بتونید یک سیس ادمین موفق باشید .
سلام
از دستور chkconfig روی Centos 8 استفاده میکنم ولی این پیام دریافت میشه:
Note: This output shows SysV services only and does not include native
systemd services. SysV configuration data might be overridden by native
systemd configuration.
If you want to list systemd services use ‘systemctl list-unit-files’.
To see services enabled on particular target use
‘systemctl list-dependencies [target]’.
مشکل از چی هست؟
سلام
از دستور systemctl استفاده کنید
برخی از دستورات systemctl :
systemctl list-unit-files –state=disabled
systemctl enable httpd