در شماره پیش با مفاهیم systemd آشنا شدیم. حداقلهایی برای ذهنیت اولیه کار با systemd آماده شد تا با Systemd-on-fedoraمفاهیمی مثل performance ، مهاجرت بدنه اصلی گنو/لینوکس (کل فرآیند بوت) و غیره آشنا باشد. اما چیزی که در دنیای واقعی بدان نیاز دارد دستوراتی است که بعد از درک پایه مفاهیم اصلی بدان ضرورتاً نیازمند است. در این شماره سعی شده است تا مستقل از دیسترو بدان اشاره شود. در SysV هر چیزی برای خودش رشد کرده بود و تحت لوای فرآیند خاصی نبود ولی در systemd همانطور که در شماره پیشین بدان اشاره شد، همه چیز در فرآیند بوت تحت لوای systemd میباشد، ضرورت آنهم صرفاً یکپارچگی بوده تا به سرعت بالاتری رسد. بهتر است این متن را در ۳ قسمت توضیح دهیم:
۱. مدیریت سرویسها
در SysV باید در BootSplash محتویات بوت سرویسها را میدیدیم و بقیه مقادیر از بین میرفت و در log ها و با دستور ps و یا پاس کردن status به خود سرویس همانند:
1 |
/etc/init.d/proftpd status |
باید میدیدیم اما در صورتی نه تنها سرویسها بلکه همه منابع سیستمی را در systemd میتوان با دستور systemctl نمایش داد، به عنوان مثال:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
root@debian:/home/mohsen# systemctl list-units -t socket UNIT LOAD ACTIVE SUB DESCRIPTION acpid.socket loaded active running ACPID Listen Socket avahi-daemon.socket loaded active running Avahi mDNS/DNS-SD Stack Activation Socket cups.socket loaded active running CUPS Printing Service Sockets dbus.socket loaded active running D-Bus System Message Bus Socket syslog.socket loaded active running Syslog Socket systemd-initctl.socket loaded active listening /dev/initctl Compatibility Named Pipe systemd-journald-dev-log.socket loaded active running Journal Socket (/dev/log) systemd-journald.socket loaded active running Journal Socket systemd-shutdownd.socket loaded active listening Delayed Shutdown Socket systemd-udevd-control.socket loaded active running udev Control Socket systemd-udevd-kernel.socket loaded active running udev Kernel Socket 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. 11 loaded units listed. Pass --all to see loaded but inactive units, too. To show all installed unit files use 'systemctl list-unit-files'. |
نکته: t- نوع unit را برای filter کردن مشخص میکند. همانطور که در بالا میبینید برای unit از نوع socket فیلتر ایجاد کردیم.
نکته: systemctl بدون پارامتر یک query کلی میگیرد.
به دستور زیر دقت کنید:
1 2 |
root@debian:/home/mohsen# systemctl |grep proftpd -i proftpd.service loaded active running LSB: Starts ProFTPD daemon |
به دلایلی میتوان با دستور بالا مخالفت کرد. اصل و اساس مخالفت با دستور بالا تولید زیاد داده میباشد. این تنها در مورد systemd نیست، بلکه در موارد متعددی منجمله netstat و یا lsof هم از طرف کاربران رعایت نمیشود و تولید داده اضافی میشود و درنهایت از آن grep گرفته میشود. دستور اصولی بالا بدین گونه است:
1 2 |
root@debian:/home/mohsen# systemctl is-active proftpd.service active |
دستور بالا نه تنها به SysV یک دستور مدرن تلقی میشود بلکه گویای یک فریم ورک قوی از جانب systemd میباشد که غیر قابل انکار میباشد.
نه تنها میتوان از فرمان is-active استفاده کرد بلکه برای حالت معادل سازی status میتوان از فرمان زیر استفاده کرد:
1 2 3 4 5 6 7 8 9 |
oot@debian:/home/mohsen# systemctl status proftpd.service ● proftpd.service - LSB: Starts ProFTPD daemon Loaded: loaded (/etc/init.d/proftpd) Active: active (running) since Sat 2015-03-28 23:24:51 IRDT; 2h 52min ago Process: 778 ExecStart=/etc/init.d/proftpd start (code=exited, status=0/SUCCESS) CGroup: /system.slice/proftpd.service └─902 proftpd: (accepting connections) Mar 28 23:24:51 debian proftpd[778]: Starting ftp server: proftpd. |
دستوراتی به صورت سنتی در Debeian-Base و RedHat-Base ها به نامهای update-rc.d و chkconfig وجود دارند که در systemd برای استفاده از آنها دیگر نیاز به مسقیم صدا زدنشان نیست.
نکته: برای کار با یک سیستم جدید باید فرهنگ آن را نیز آموخت.
پس بدین منظور بیاد از دستورات خاصی استفاده نماییم.
بیایید کمی دستورات سادهای که در SysV استفاده میکردیم را در systemd پیدا کنیم :
statrt کردن سرویس:
1 |
systemctl start apache2.service |
نکته: برای راحتی کار میتوانید کلمهservice آخر را نگذارید.
برای stop و یا هر پارامتری که در SysV به یک سرویس میدادید میتوانید از همین روش استفاده کنید:
1 2 3 |
systemctl stop squid systemctl restart squid systemctl reload proftpd |
یا از دستور زیر استفاده نمایید:
1 2 3 |
service proftpd start service apache2 stop service samba restart |
نکته: اگر با توزیعهای RedHat-Base کار کرده باشید خواهید دریافت که دستور service ، دستور جدیدی نیست ولی از وجود systemd به این طرف بازنویسی شده است. ولی در توزیعهای Debian-Base وجود نداشته است.
اگر کاربر سیستمهای RedHat-Base باشید با دستور chkconfig و اگر کابر سیستمهای Debian-Base باشید با دستور update.rc-d حتماً آشنا هستید. در بخش فرمانهای متعلق به سرویس دو فرمان enable و disable به صورت زیر به کار خواهند رفت:
1 |
systemctl enable cups.service |
درواقع عبارت فوق همانند دو دستور بالا کار میکند و باعث میشود سرویس cups در هنگام boot
اجرا شود. فرمان disable معکوس آن عمل میکند. اما کمی در آن وارد جزییات شویم:
1 2 3 4 5 6 7 8 |
root@debian:/home/mohsen# systemctl enable cups Synchronizing state for cups.service with sysvinit using update-rc.d... Executing /usr/sbin/update-rc.d cups defaults insserv: warning: current start runlevel(s) (empty) of script `cups' overrides LSB defaults (2 3 4 5). insserv: warning: current stop runlevel(s) (1 2 3 4 5) of script `cups' overrides LSB defaults (1). Executing /usr/sbin/update-rc.d cups enable Created symlink from /etc/systemd/system/sockets.target.wants/cups.socket to /lib/systemd/system/cups.socket. Created symlink from /etc/systemd/system/paths.target.wants/cups.path to /lib/systemd/system/cups.path. |
نکته: تمام unit فایلها در دایرکتوری /lib/systemd/system/ قرار دارند. (منظور همان ۷ نوع unit ی میباشد که در شماره قبل صحبت شد و systemd بر مبنای آنان کار میکند.) وقتی میگوییم یک سرویس به صورت اتوماتیک اجرا شود systemd از آن unit مربوطه یک symbolic link از آن در دایرکتوری /etc/systemd/system/ و بعضی از زیر دایرکتوریهای آن میسازد.
ممکن است برای فرمان بالا چنین خروجی دریافت نمایید، که این نشانگر این است که شما یکبار آن را enable کردهاید:
1 2 3 4 5 |
root@debian:/home/mohsen# systemctl enable cups Synchronizing state for cups.service with sysvinit using update-rc.d... Executing /usr/sbin/update-rc.d cups defaults Executing /usr/sbin/update-rc.d cups enable root@debian:/home/mohsen# |
برای اینکه بفهمید یک سرویس enable شده است یا خیر از فرمان زیر استفاده نمایید:
1 2 |
root@debian:/home/mohsen# systemctl is-enabled cups enabled |
پیشنهاد systemd به جای استفاده از enable و disable:
systemd خود پیشنهاد میدهد به جای disable از mask و از به جای enable از unmask استفاده نماییم:
1 2 |
root@debian:/home/mohsen# systemctl mask cups Created symlink from /etc/systemd/system/cups.service to /dev/null. |
درواقع با mask کردن یک لینک به dev/null/ ایجاد کردیم و آن را از حالت اتو استارت درآوردیم.
و unmask عکس این حالت را انجام میدهد:
1 2 |
root@debian:/home/mohsen# systemctl unmask cups Removed symlink /etc/systemd/system/cups.service. |
۲. کار با Targetها
بر فرض اینکه در نسخه پیش توضیح داده شد که target ها چی میباشند به جزییات در مورد آنها میپردازیم.
اگر به جای دستور
1 |
root@debian:/lib/systemd/system# systemctl list-units -t target |
از فرمان ls به صورت زیر استفاده کنیم خیلی موارد برایمان روشن میشود:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 |
root@debian:/home/mohsen# ls -lF /lib/systemd/system/*.target -rw-r--r-- 1 root root 524 Feb 13 14:52 /lib/systemd/system/basic.target -rw-r--r-- 1 root root 379 Feb 13 14:52 /lib/systemd/system/bluetooth.target -rw-r--r-- 1 root root 394 Feb 13 14:52 /lib/systemd/system/cryptsetup-pre.target -rw-r--r-- 1 root root 366 Feb 13 14:52 /lib/systemd/system/cryptsetup.target lrwxrwxrwx 1 root root 13 Feb 13 14:52 /lib/systemd/system/ctrl-alt-del.target -> reboot.target lrwxrwxrwx 1 root root 16 Feb 13 14:52 /lib/systemd/system/default.target -> graphical.target -rw-r--r-- 1 root root 431 Feb 13 14:52 /lib/systemd/system/emergency.target -rw-r--r-- 1 root root 440 Feb 13 14:52 /lib/systemd/system/final.target -rw-r--r-- 1 root root 460 Feb 13 14:52 /lib/systemd/system/getty.target -rw-r--r-- 1 root root 490 Feb 13 14:52 /lib/systemd/system/graphical.target -rw-r--r-- 1 root root 487 Feb 13 14:52 /lib/systemd/system/halt.target -rw-r--r-- 1 root root 447 Feb 13 14:52 /lib/systemd/system/hibernate.target -rw-r--r-- 1 root root 468 Feb 13 14:52 /lib/systemd/system/hybrid-sleep.target -rw-r--r-- 1 root root 553 Feb 13 14:52 /lib/systemd/system/initrd-fs.target -rw-r--r-- 1 root root 526 Feb 13 14:52 /lib/systemd/system/initrd-root-fs.target -rw-r--r-- 1 root root 691 Feb 13 14:52 /lib/systemd/system/initrd-switch-root.target -rw-r--r-- 1 root root 671 Feb 13 14:52 /lib/systemd/system/initrd.target -rw-r--r-- 1 root root 501 Feb 13 14:52 /lib/systemd/system/kexec.target -rw-r--r-- 1 root root 395 Feb 13 14:52 /lib/systemd/system/local-fs-pre.target -rw-r--r-- 1 root root 507 Feb 13 14:52 /lib/systemd/system/local-fs.target -rw-r--r-- 1 root root 473 Feb 13 14:52 /lib/systemd/system/mail-transport-agent.target -rw-r--r-- 1 root root 492 Feb 13 14:52 /lib/systemd/system/multi-user.target -rw-r--r-- 1 root root 464 Feb 13 14:52 /lib/systemd/system/network-online.target -rw-r--r-- 1 root root 461 Feb 13 14:52 /lib/systemd/system/network-pre.target -rw-r--r-- 1 root root 480 Feb 13 14:52 /lib/systemd/system/network.target -rw-r--r-- 1 root root 514 Feb 13 14:52 /lib/systemd/system/nss-lookup.target -rw-r--r-- 1 root root 473 Feb 13 14:52 /lib/systemd/system/nss-user-lookup.target -rw-r--r-- 1 root root 354 Feb 13 14:52 /lib/systemd/system/paths.target -rw-r--r-- 1 root root 500 Feb 13 14:52 /lib/systemd/system/poweroff.target -rw-r--r-- 1 root root 377 Feb 13 14:52 /lib/systemd/system/printer.target -rw-r--r-- 1 root root 493 Feb 13 14:52 /lib/systemd/system/reboot.target -rw-r--r-- 1 root root 396 Feb 13 14:52 /lib/systemd/system/remote-fs-pre.target -rw-r--r-- 1 root root 498 Feb 13 14:52 /lib/systemd/system/remote-fs.target -rw-r--r-- 1 root root 486 Feb 13 14:52 /lib/systemd/system/rescue.target -rw-r--r-- 1 root root 500 Feb 13 14:52 /lib/systemd/system/rpcbind.target lrwxrwxrwx 1 root root 15 Feb 13 14:52 /lib/systemd/system/runlevel0.target -> poweroff.target lrwxrwxrwx 1 root root 13 Feb 13 14:52 /lib/systemd/system/runlevel1.target -> rescue.target lrwxrwxrwx 1 root root 17 Feb 13 14:52 /lib/systemd/system/runlevel2.target -> multi-user.target lrwxrwxrwx 1 root root 17 Feb 13 14:52 /lib/systemd/system/runlevel3.target -> multi-user.target lrwxrwxrwx 1 root root 17 Feb 13 14:52 /lib/systemd/system/runlevel4.target -> multi-user.target lrwxrwxrwx 1 root root 16 Feb 13 14:52 /lib/systemd/system/runlevel5.target -> graphical.target lrwxrwxrwx 1 root root 13 Feb 13 14:52 /lib/systemd/system/runlevel6.target -> reboot.target -rw-r--r-- 1 root root 402 Feb 13 14:52 /lib/systemd/system/shutdown.target -rw-r--r-- 1 root root 362 Feb 13 14:52 /lib/systemd/system/sigpwr.target -rw-r--r-- 1 root root 420 Feb 13 14:52 /lib/systemd/system/sleep.target -rw-r--r-- 1 root root 409 Feb 13 14:52 /lib/systemd/system/slices.target -rw-r--r-- 1 root root 380 Feb 13 14:52 /lib/systemd/system/smartcard.target -rw-r--r-- 1 root root 356 Feb 13 14:52 /lib/systemd/system/sockets.target -rw-r--r-- 1 root root 380 Feb 13 14:52 /lib/systemd/system/sound.target -rw-r--r-- 1 root root 441 Feb 13 14:52 /lib/systemd/system/suspend.target -rw-r--r-- 1 root root 353 Feb 13 14:52 /lib/systemd/system/swap.target -rw-r--r-- 1 root root 518 Feb 13 14:52 /lib/systemd/system/sysinit.target -rw-r--r-- 1 root root 652 Feb 13 14:52 /lib/systemd/system/system-update.target -rw-r--r-- 1 root root 355 Feb 13 14:52 /lib/systemd/system/timers.target -rw-r--r-- 1 root root 395 Feb 13 14:52 /lib/systemd/system/time-sync.target -rw-r--r-- 1 root root 417 Feb 13 14:52 /lib/systemd/system/umount.target -rw-r--r-- 1 root root 469 Feb 13 14:52 /lib/systemd/system/x-display-manager.target |
میتوانیم به خیلی از حقایق پی ببریم.
به جای فرمان runlevel در systemd باید از فرمان زیر استفاده نماییم:
1 2 |
root@debian:/home/mohsen# systemctl get-default graphical.target |
با توجه به لینکهای بالا متوجه شدید که مدیریت runlevel ها به چه صورت میباشد.
نکته: مهاجرت عظیمی که systemd داشت، از اجرای فایلی به درون کدی بود که در شماره پیش توضیح دادم. همین امر یکی از عواملی بود که سرعت systemd را به طرز فاحشی بالا برد.
برای تغییر runlevel جاری میتوان از فرمان زیر استفاده نمود:
1 2 3 |
mohsen@/home/mohsen~#systemctl set-default multi-user.target rm '/etc/systemd/system/default.target' ln -s '/lib/systemd/system/multi-user.target' '/etc/systemd/system/default.target' |
برای وارد شدن به single user در SysV با فرمان init 1 این امر را انجام میدادیم، اما در systemd با فرمان زیر این کار را انجام میدهیم:
1 |
mohsen@/home/mohsen~#systemctl rescue |
توصیه: برای بیشتر یادگرفتن systemd دایرکتوری /lib/systemd/system/ را هک کنید.
۳. فرمانهای کلیدی
در لینوکس و حتی بعضا در بعضی از بونیکس های بعضی از فرمانهای زیر صادق بودند که هنوز هم هستند، ولی معادل systemd آنها برایتان لیست شده است:
فرمان قدیمی | فرمان مطابق با systemd | توضیحات |
halt | systemctl halt | سیستم رو halt میکند. |
poweroff | systemctl poweroff | سیستم را power off میکند. |
reboot | systemctl reboot | سیستم را reboot میکند. |
pm-suspend | systemctl pm-suspend | سیستم را suspend میکند. |
pm-hibernate | systemctl pm-hibernate | سیستم را hibernate میکند. |
pm-suspend-hybrid | systemctl pm-suspend-hybrid | سیستم را hibernate و suspend-hybird میکند. |
نکته: سعی کنید وقتی از systemd استفاده میکنید فرامین سنتی را استفاده نکنید و از فرمامینی همچون: systemd-cgls و غیره استفاده نمایید.
خواهشی که در آخر از خواننده عزیز دارم این است که با توجه به بزرگی systemd به همراه آن بنشیند و خود را و فرامین قابل استفاده در توزیع را به systemd مهاجرت دهد.