منبع اصلی نوشتار زیر در این لینک قرار دارد

systemd در دبیان‌ (شماره نهایی)

در شماره پیش با مفاهیم systemd آشنا شدیم. حداقل‌هایی برای ذهنیت اولیه کار با systemd آماده شد تا با Systemd-on-fedoraمفاهیمی مثل  performance ، مهاجرت بدنه اصلی گنو/لینوکس (کل فرآیند بوت) و غیره آشنا باشد. اما چیزی که در دنیای واقعی بدان نیاز دارد دستوراتی است که بعد از درک پایه مفاهیم اصلی بدان ضرورتاً نیازمند است. در این شماره سعی شده است تا مستقل از دیسترو بدان اشاره شود. در SysV هر چیزی برای خودش رشد کرده بود و تحت لوای فرآیند خاصی نبود ولی در systemd همانطور که در شماره پیشین بدان اشاره شد، همه چیز در فرآیند بوت تحت لوای systemd می‌باشد، ضرورت آنهم صرفاً یکپارچگی بوده تا به سرعت بالاتری رسد. بهتر است این متن را در ۳ قسمت توضیح دهیم:

۱. مدیریت سرویس‌ها

در SysV باید در BootSplash محتویات بوت سرویس‌ها را میدیدیم و بقیه مقادیر از بین میرفت و در log ها و با دستور ps و یا پاس کردن status به خود سرویس همانند:

/etc/init.d/proftpd status

اید می‌دیدیم اما در صورتی نه تنها سرویس‌ها بلکه همه منابع سیستمی را در systemd می‌توان با دستور systemctl نمایش داد، به عنوان مثال:

root@debian:/lib/systemd/system# 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. ^[[1;39m11 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 کلی می‌گیرد.
به دستور زیر دقت کنید:

root@debian:/home/mohsen# systemctl |grep proftpd -i
proftpd.service loaded active running LSB: Starts ProFTPD daemon

به دلایلی می‌توان با دستور بالا مخالفت کرد. اصل و اساس مخالفت با دستور بالا تولید زیاد داده می‌باشد. این تنها در مورد systemd نیست، بلکه در موارد متعددی منجمله netstat و یا lsof هم از طرف کاربران رعایت نمی‌شود و تولید داده اضافی می‌شود و درنهایت از آن grep گرفته می‌شود. دستور اصولی بالا بدین گونه است:

root@debian:/home/mohsen# systemctl is-active proftpd.service
active

دستور بالا نه تنها به SysV یک دستور مدرن تلقی می‌شود بلکه گویای یک فریم ورک قوی از جانب systemd می‌باشد که غیر قابل انکار می‌باشد.

نه تنها می‌توان از فرمان is-active استفاده کرد بلکه برای حالت معادل سازی status می‌توان از فرمان زیر استفاده کرد:

root@debian:/home/mohsen# systemctl status proftpd.service
● proftpd.service – LSB: Starts ProFTPD daemon
Loaded: loaded (/etc/init.d/proftpd)
Active: active (running) since Wed 2015-02-25 09:59:39 IRST; 22h ago
Process: 23177 ExecReload=/etc/init.d/proftpd reload (code=exited, status=0/SUCCESS)
CGroup: /system.slice/proftpd.service
└─5378 proftpd: (accepting connections)
Feb 25 09:59:39 debian proftpd[5371]: Starting ftp server: proftpd.
Feb 26 08:24:59 debian proftpd[23139]: Reloading ftp server: proftpd
Feb 26 08:25:04 debian proftpd[23151]: Reloading ftp server: proftpd
Feb 26 08:25:12 debian proftpd[23177]: Reloading ftp server: proftpd

دستوراتی به صورت سنتی در Debeian-Base و RedHat-Base ها به نام‌های update-rc.d و chkconfig وجود دارند که در systemd برای استفاده از آن‌ها دیگر نیاز به مسقیم صدا زدنشان نیست.

نکته: برای کار با یک سیستم جدید باید فرهنگ آن را نیز آموخت.
پس بدین منظور بیاد از دستورات خاصی استفاده نماییم.

بیایید کمی دستورات ساده‌ای که در SysV استفاده می‌کردیم را در systemd پیدا کنیم :

statrt کردن سرویس:

systemctl start apache2.service


نکته:
برای راحتی کار می‌توانید کلمهservice آخر را نگذارید.

برای stop و یا هر پارامتری که در SysV به یک سرویس می‌دادید می‌توانید از همین روش استفاده کنید:

systemctl stop squid
systemctl restart squid
systemctl reload proftpd

یا از دستور زیر استفاده نمایید:

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 به صورت زیر به کار خواهند رفت:

systemctl enable cups.service

در‌واقع عبارت فوق همانند دو دستور بالا کار می‌کند و باعث می‌شود سرویس cups در هنگام boot
اجرا شود. فرمان disable معکوس آن عمل می‌کند. اما کمی در آن وارد جزییات شویم:

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 کرده‌اید:

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

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

root@debian:/home/mohsen# systemctl is-enabled cups
enabled

پیشنهاد systemd به جای استفاده از enable و disable:

systemd خود پیشنهاد می‌دهد به جای disable از mask و از به جای enable از unmask استفاده نماییم:

root@debian:/home/mohsen# systemctl mask cups
Created symlink from /etc/systemd/system/cups.service to /dev/null.

در‌واقع با mask کردن یک لینک به dev/null/ ایجاد کردیم و آن را از حالت اتو استارت درآوردیم.
و unmask عکس این حالت را انجام می‌دهد:

root@debian:/home/mohsen# systemctl unmask cups
Removed symlink /etc/systemd/system/cups.service.


۲. کار با Targetها

بر فرض اینکه در نسخه پیش توضیح داده شد که target ها چی ‌میباشند به جزییات در مورد آن‌ها می‌پردازیم.

اگر به جای دستور

root@debian:/lib/systemd/system# systemctl list-units -t target

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

root@debian:/lib/systemd/system# 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 باید از فرمان زیر استفاده نماییم:

root@debian:/home/mohsen# systemctl get-default
graphical.target

با توجه به لینک‌های بالا متوجه شدید که مدیریت runlevel ها به چه صورت می‌باشد.

نکته: مهاجرت عظیمی که systemd داشت، از اجرای فایلی به درون کدی بود که در شماره پیش توضیح دادم. همین امر یکی از عواملی بود که سرعت systemd را به طرز فاحشی بالا برد.

برای تغییر runlevel جاری می‌توان از فرمان زیر استفاده نمود:

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 با فرمان زیر این کار را انجام می‌دهیم:

mohsen@/home/mohsen~#systemctl rescue

توصیه: برای بیشتر یادگرفتن systemd دایرکتوری /lib/systemd/system/ را هک کنید.


۳. فرمان‌های کلیدی

در لینوکس و حتی بعضا در بعضی از بونیکس های بعضی از فرمان‌های زیر صادق بودند که هنوز هم هستند، ولی معادل systemd آن‌ها برایتان لیست شده است:

سیستم را power off می‌کند.

  فرمان قدیمی  فرمان مطابق با 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 مهاجرت دهد.

نوشته systemd در دبیان‌ (شماره نهایی) اولین بار در چرت و پرت پدیدار شد.



برچسب ها : , , , , ,