systemd و پرسش های آن
توسط royaflash دذ ۱۳ آذر, ۱۳۹۵ دذ ۰۹:۰۰ قبل از ظهر | دسته‌بندی شده در گنو/لینوکس | با ۰ دیدگاه |857 views

ر این مقاله، ما در مورد تمام پرسش ها، یک به یک بحث کرده و راه حل ارائه خواهیم داد.

  • init چیست؟
  • System چیست؟
  • چرا باید init جایگزین شود؟
  • کدام ویژگی های systemd مال خود می باشد؟

init چیست؟

در لینوکس، init یک مخفف برای مقداردهی اولیه است. init یک پروسه سرویس است که به محض استارت کامپیوتر شروع می شود و اجرای آن تا خاموش شدن کامپیوتر ادامه دارد. در حقیقت init اولین پروسه ای است که موقع بوت شدن کامپیوتر آغاز می شود، آن را سرچشمه تمامی دیگر پروسه های در حال اجرای مستقیم و غیر مستقیم می کند و از این رو به طور معمول “pid=1“ به آن اختصاص داده شده است.

اگر به نحوی سرویس init نتوانست شروع شود، هیچ پروسه ای آغاز نمی شود و سیستم به مرحله ای به نام “Kernel Panic“ می رسد. init رایج ترین مرجع برای System V init است. System V اولین سیستم عامل یونیکس تجاری است که طراحی شد و کاربردهای init در بسیاری از توزیع های لینوکس امروزی مشابه سیستم عامل System V است با مورد استثنایی همچون Slackware با استفاده از BSD-style و Gentoo با استفاده از custom init.

لزوم جایگزینی init با چیزی کامل تر، از مدت ها احساس می شد و جایگزین های مختلفی مرحله به مرحله توسعه داده شد، که برخی جایگزین native init توزیع شدند، بعضی از آنها عبارتند از :

  • Upstart : یک سرویس جایگزین init که در اوبونتو گنو/لینوکس اجرا شد و برای شروع پروسه غیر همزمان طراحی شده است.
  • Epoch : یک سرویس جایگزین init که از همه طرف سادگی و مدیریت سرویس ایجاد کرده، این برای شروع پروسه تک نخی طراحی شده است.
  • Mudar : یک سرویس جایگزین init که به زبان پایتون نوشته شده است، در پاردوس گنو/لینوکس اجرا شده و برای شروع پروسه های غیر همزمان طراحی شده است.
  • Systemd : یک سرویس جایگزین init که برای شروع پروسه های موازی طراحی شده و در تعدادی از توزیع های استاندارد (Fedora, OpenSuSE, Arch, RHEL, CentOS وغیره) اجرا شده است.

Systemd چیست؟
Systemd یک سرویس مدیریت سیستم است که توسط مجمع یونیکس برای افزودن ‘d‘ در پایان سرویس نام گذاری شده است. بنابراین می توانند به راحتی تشخیص داده شوند. در ابتدا تحت لایسنس عمومی همگانی گنو GNU منتشر شد، اما اکنون نسخه ها تحت لایسنس GNU Lesser General Public License ساخته می شوند. شبیه به init، systemd نیز سرچشمه همه پروسه های مستقیم و غیر مستقیم دیگری است که هنگام بوت آغاز می شوند از این رو معمولا “pid=1“ به آن اختصاص داده شده است.

systemd، ممکن است با تمام پکیج ها، سرویس ها و کتابخانه های پیرامون سرویس ارتباط داشته باشد. Systemd برای غلبه بر کاستی های init طراحی شده است. این به خودی خود یک پیش زمینه برای پروسه هایی است که برای شروع فرآیندها به طور موازی، طراحی شده است، در نتیجه زمان بوت و overhead محاسباتی کاهش می یابد. Systemd دارای ویژگی های بسیار دیگری می باشد که قابل مقایسه با init است.

چرا init باید تعویض شود؟
پروسه init به راحتی آغاز می شود، یک task درست بلافاصله بعد از آخرین task ای که با موفقیت در startup است، شروع می شود و در حافظه لود می گردد. این اغلب به تاخیر و طولانی شدن مدت زمان بوت، منجر می شود. با این حال، systemd برای سرعت بخشیدن به انجام کارها به طور منظم طراحی نشده است که از تمام تاخیرهای غیرضروری اجتناب کند.

ویژگی های systemd

  • شفاف، stateforward و طراحی کارآمد
  • پروسه بوت ساده تر
  • پردازش همزمان و موازی در هنگام بوت
  • API بهتر
  • نحو واحد ساده
  • قابلیت حذف اجزای اختیاری
  • رد پاهای حافظه کم
  • تکنیک بهبود یافته برای بیان نیازمندی ها
  • آموزش اولیه نوشته شده در فایل کانفیگ و نه در in shell script
  • ایجاد امکان استفاده از سوکت دامنه یونیکس
  • برنامه ریزی شغلی با استفاده از تایمرهای تقویم systemd
  • رویداد لاگین با journald
  • انتخاب رویدادهای سیستم لاگین با systemd و همچنین syslog
  • لاگ ها در فایل باینری ذخیره می شوند
  • حالت systemd می تواند حفظ شود تا در آینده به آن رجوع شود
  • پروسه Track با استفاده از cgroup کرنل و نه PID
  • لاگین کاربرها توسط systemd-logind
  • تلفیق بهتر با Gnome برای

تنگناهای systemd

  • همه چیز در یک جا
  • نبود استاندارد POSIX

ادغام Systemd و Distro

توزیع لینکس ادغام
Fedora بله، اولین توزیع برای
Arch بله
RedHat بله
CentOS بله
Debian بله، Debian 8 با اسم رمز Jessie به طور پیش فرض system را خواهد داشت
Gentoo بله، اما لازم است دانلود شود، نصب و کانفیگ side با custom init
OpenSUSE بله
Slack نه (اگرچه هنوز تا کنون درslackware اتخاذ نشده است، اما چه اتخاذ بشود چه نشود Patric Volkerding هیچ علامتی را نشان نمی دهد)
Ubuntu بله، لازم است تا با Upstream نصب و کانفیگ شود.

مناظره
Linus Torvalds، معمار ارشد کرنل لینوکس، به شیوه توسعه دهنده اصلی نسبت به کاربران معتقد است و گزارش های باگ، خوب به نظر نمی رسد. همچنین گزارش شده است که فلسفه systemd، روش عجیب و ناآشنایی برای پروسه سیستم کنترل است. همانطور که از روی Patric Volkerding ثبت شده است و قابل توجه کاربران و توسعه دهندگان لینوکس و همچنین گاهی اوقات فروم های آنلاین، می باشد.

Systemd در مقایسه با init

systemd init Features
Yes No DBus Dependency – Mandatory
Yes No Device based Activation
Yes No Device dependency configuration with udev
Proprietary Cron/at Timer based Activation
Yes No Quota Management
Yes No Automatic Service Dependency Handling
Yes No Kills users Process at logout
Yes No Swap Management
Yes No SELinux integration
Yes No Support for Encrypted HDD
Yes No Static kernle module loading
Yes No GUI
Yes No List all the child processes
Yes Yes Sysv compatible
Yes No Interactive booting
No Yes Portable to non x86
Several Distro Several Distro Adopted on
Yes No Parallel service startup
Yes No Resource limit per service
No Yes Easy extensible startup script
No Yes Separate Code and Configuration File
Yes No Automatic dependency calculation
No Yes Verbose debug
V44+ N/A Version
N/A ۵۶۰ KB Size
۹۰۰ files + glib + DBus ۷۵ files Number of Files
۲۲۴۰۰۰ (Approx) (inc Codes, comments and white space) 125000 (Approx) (acctual code) ۱۵۰۰۰ (Approx) Lines of code – LOC

دستور systemd بر روی واحدها یا Unit هایی کنترل دارد که این واحد ها می توانند: سرویس ها، سوکت ها، دیوایس ها و یا نقاط اتصال باشند. برای فهرست کردن تمامی واحدها از دستور زیر استفاده کنید.

systemctl list-units

در مطلبی جداگانه به واحدها پرداخته خواهد شد. هدف از این مطلب معرفی فرایند systemd و دستور systemctl خواهد بود. همچنین به چگونگی کنترل سرویس هایی مانند sshd که پیش از این توسط دستور service انجام می شد نیز خواهم پرداخت. برای شروع از دستور systemctl برای نمایش متغیر های محلی PATH$ و LANG$استفاده می کنیم. به طور معمول باید از دو دستور زیر استفاده کنیم.

echo $PATH

echo $LANG

  • اما در فدورا ۲۰  یا هر توزیع دیگری که از systemd استفاده می کند از دستور زیر استفاده کنید.

systemctl show-environment

OUTPUT

PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin
LANG=en_US.UTF-8

و یا برای تغییر متغیر محیطی PATH$ و افزودن یک مسیر جدید از دستور زیر استفاده کنید.

systemctl set-environment PATH=$PATH:/games

  • برای reboot و shutdown کردن سیستم از دستور های زیر استفاده کنید.

systemctl reboot

systemctl poweroff

systemctl halt

و یا اینکه از دستور های زیر استفاده کنید.

reboot

poweroff

halt

یک Service Unit مشخص کننده یک سرویس است که به صورت یک فرایند با یک شناسه در سیستم وجود دارد مانند سرویس sshd یا سرویس آپاچی یا وب سرور که نام سرویس httpd است یا سرویس dhcp و هر سرویس دیگری. شش عمل start, stop, restart,relaod,enable و disable بر روی هر سرویس انجام می گیرد. هر سرویس عضوی از واحد service بوده و در دستور systemctl به صورت زیر مشخص می شود.

systemctl COMMAND SERVICE_NAME.service

COMMAND  یکی از چهار عمل بالا به همراه دستور status برای نمایش وضعیت یک سرویس و همچنین دستور is-active برای مشخص کردن اینکه آیا سرویس مورد نظر start یا فعال است و is-enabled برای مشخص کردن اینکه آیا سرویسی در زمان بودت شده فعال خواهد شد یا نه. البته می تانید عبارت service را در پایان نام سرویس نیز نیاورید.

systemctl COMMAND SERVICE_NAME

  • برای تعیین وضعیت یک سرویس (مانند سرویس named) از دستور زیر استفاده کنید.

systemctl status named.service

 

خروجی بالا دو مطلب را نشان می دهد. یکی اینکه سرویس named غیر فعال یا inactive است و اینکه سرویس در زمان بوت شدن بطور خودکار فعال یا enable نمی شود در حالت disable است). نمونه دیگری از خروجی status مانند  دستور زیر است . که می توانید مشاهده کنید :

systemctl status httpd.service

 

از خروجی دستور  مشخص است (اگر وب سرویس شما up باشد .)که سرویس فعال یا active است و قادر به پایخ گویی به درخواست ها. همچنین سرویس در زمان بوت شدن بطور خودکار فعال می شود زیر enabled شده است. شناسه مربوط به سرویس (Main PID) برای نمونه :  ۶۷۴.  شناسه های اصلی یعنی شناسه مربوط به فرایندی که بطور مستقیم توسط systend ایجاد شده است و بقیه شناسه ها (بطور خاص در شکل بالا برای سرویس httpd) از همان شناسه اصلی fork شده اند. برای اینکه پی ببریم آیا واقعا ۶۷۴ از systemd ایجاد شده است دستور زیر را اجرا کنید. در این دستور زیر توسط سوییچ P- از فرمان pgrep شناسه فرایند هایی را فهرست می کنیم که والد یا Parent آنها فرایندی با شناسه ۱ یعنی systemd باشد و با grep مطمین می شویم که آیا ۶۷۴ نیز جز آنها است یا نه.

pgrep -P 1 | grep 674

خط زیر از خروجی بالا نشان می دهد که فرایند یا سرویس httpd به مدت ۱ ساعت ۲۸ دقیقه از ساعت ۲۰:۱۲ تاریخ ۲۱-۰۲-۲۰۱۴ فعال و در حال اجرا شدن است.

Active: active (running) since Fri 2014-02-21 20:12:10 IRST; 1h 28min ago

CGroup که مخفف Control Group است ویژگی از کرنل لینوکس است که محدودیت هایی را بر روی منابعی سیستمی مانند پردازندهُ حافظه اصلی و I/O به ازای گروهی از فرایند ها (در اینجا گروهی از فرایند های مربوط له سرویس httpd) اعمال می کند. برای مطالعه بیشتر در مستندات Red Hat به دنبال داکیومنت Resource Management بگردید. همچنین در خروجی بالا چندین خط از رکورد های Log مربوط به سرویس آپاچی را نشان می دهد.

  • فعال یا start کردن (active کردن) یک سرویس (مانند سرویس sshd در مثال زیر)

systemctl start sshd.service

  • غیر فعال یا stop کردن (inactive کردن) یک سرویس

systemctl stop sshd.service

  • بررسی اینکه آیا سرویسی فعال است. برای این کار از سدتور is-active استفاده می کنیم.در صورتی که سرویسی فعال یا در حال اجرا باشد عبارت active نشان داده می شود و اگر غیر فعال باشد عبارت inactive را نشان می دهد.

systemctl is-active httpd.service

active

systemctl is-active named.service

inactive

  • برای فعال کردن خودکار یک سرویس در زمان بوت شدن (معادل همان کاری که دستور chkconfig در توزیع های RHLE/CentOS V5,6)

systemctl enable httpd.service

systemctl enable named.service

  • و برای غیر فعال کردن آن سرویس از دستور disable استفاده کنید.

systemctl disable httpd.service

systemctl disable named.service

  • همچنین از دستور is-enabled برای اینکه بفهمیم آیا سرویسی در زمان بوت شدن به طور خودکار فعال می شود یا خیر از دستور is-enabled استفاده کنید. اگر فعال باشد عبارت enabled و اگر غیر فعال باشد عبارت disabled نشان داده می شود.

systemctl is-enable httpd.service

 



systemctl is-enable named.service

 


جدول زیر دستور service که در سبک Unix System V (یا Sysvinit) است را با دستور های معادل آن در سیستم systemd نشان می دهد.

 

 

 

از میان دستور های بالا تنها دستور chkconfig –list در توزیع هایی که از سیستم systemd استفاده می کنند قابل استفاده نمی باشد و برای مابقی دستور ها می تواند از معادل Sysvinit آن استفاده کنید که در این صورت دستور service یا chkconfig به معادل خودش در systemd ترجمه یا Redirect می شود و خروجی مشابه زیر نشان داده می شود.

service named start

Redirecting to /bin/systemctl start  named.service

مدیریت سرویس‌ها توسط systemctl

در این مطلب قصد داریم دستورات systemctl را آموزش بدهیم که ابزار اصلی برای کنترل سرویس‌ها و init است. در ادامه نگاهی می‌اندازیم که چگونه سرویس‌ها را مدیریت کنیم و در نهایت وضعیتشان را بررسی کنیم.

شروع و متوقف کردن سرویس‌ها

برای شروع کردن یک سرویس systemd باید از دستور start استفاده کنیم.

اگر شما یک کاربر غیر ریشه هستید لطفا روت شوید و یا قبل از دستور sudo بگذارید تا دستور با دسترسی ریشه اجرا شود در غیر این صورت ممکن که دستور شما عمل نکند.

systemctl start APPLICATION.service

توسط این دستور شما می‌توانید سرویس خود را شروع کنید.

برای مثال توسط این دستور میتوانید وب سرور nginx را فعال نمایید (لازم به ذکر است که اگر شما نام سرویسی را که می‌خواهید استفاده کنید را نمی‌دانید، می‌توانید با نوشتن فقط یکی دو حرف اول آن سرویس و سپس زدن دو بار پشت سر هم کلید TAB نام آن را کامل کنید.).

systemctl start nginx.service

systemd برای کنترل کردن یک سرویس، به دنبال *.service (همانطور که می‌دانید ستاره یک wild card و به معنی هر چیزی است) می‌گردد، بنابر این شما می‌توانید برای راحتی کار به این صورت سرویس‌های خود را مدیریت کنید.

systemctl start nginx

درصورتی که می‌خواهید سرویسی را که شروع کرده‌اید، متوقف کنید می‌توانید به همین شیوه عمل کنید با این تفاوت که به جای start از stop استفاده کنید.

systemctl stop APPLICATION.service

بارگذاری و راه اندازی مجدد سرویس‌ها

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

systemctl restart APPLICATION.service

و یا اگر می‌خواهید فقط آن را به صورت مجدد بارگذاری نمایید میتوانید از reload استفاده کنید.

systemctl reload APPLICATION.service

نکته: تفاوت reload و restart در این است که reload فقط فایل کانفیگ ویرایش شده را می‌خواند (و سرویس را مجدد راه‌اندازی نمی‌کند) که عموما بسیار سریع انجام می‌شود. اما اگر می‌خواهید به‌طور کلی یک سرویس را دوباره راه‌اندازی کنید باید از restart استفاده کنید که عموما زمان بیشتری نسبت به بارگذاری طول می‌کشد. اگر مطمئن نیستید که می‌خواهید از کدام استفاده کنید بهتر است که از reload-or-restart استفاده کنید که ابتدا فایل کانفیگ ویرایش شده را مجدد بارگذاری می‌کند و در صورت نیاز سرویس مربوطه را مجدد راه اندازی می‌کند.

systemctl reload-or-restart APPLICATION.service

فعال و غیر فعال کردن سرویس‌ها

در صورتی که سرویس مورد نظر خود را توسط start شروع کرده باشید، با اولین ریبوت همه آنها به تنظیمات خود بازمی‌گردد و ممکن است اصلا بعد از بارگذاری سیستم اجرا نشوند. در صورتی که می‌خواهید systemd سرویس مورد نظر شما را هنگام بوت به صورت خودکار فعال کند باید از enable استفاده کنید. به این صورت.

systemctl enable APPLICATION.service

این کار یک لینک از /etc/systemd/system (و در بعضی سیستم ها /lib/systemd/system) ایجاد می‌کند در مسیری که systemd در آن به دنیال فایل هایی می‌گردد که باید هنگام بوت آنها را شروع کند. (معمولا در /etc/systemd/system/some-target.target.wants_)

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

systemctl disable APPLICATION.service

برای مثال درصورتی که می‌خواهید جلوی اجرا شدن خودکار وب سرور nginx را هنگام بوت بگیرید باید به این صورت عمل کنید.

systemctl disable nginx.service

وضعیت یک سرویس

در صورتی که می‌خواهید وضعیت یک سرویس را بررسی کنید (برای مثال مطمئن شوید که سرویس شروع و یا متوقف شده است و یا چند خط اول لاگ را بررسی کنید) میتوانید از status استفاده نمایید.

systemctl status APPLICATION.service

برای مثال، در صورتی که وضعیت وب سرور nginx را بررسید کنید با خطوطی شبیه به این مواجه می‌شوید:

nginx.service - A high performance web server and a reverse proxy server
Loaded: loaded (/usr/lib/systemd/system/nginx.service; enabled; vendor preset: disabled)
Active: active (running) since Tue 2015-01-27 19:41:23 EST; 22h ago Main PID: 495 (nginx)
CGroup: /system.slice/nginx.service
├─۴۹۵ nginx: master process /usr/bin/nginx -g pid /run/nginx.pid; error_log stderr;
└─۴۹۶ nginx: worker processJan 27 19:41:23 desktop systemd[1]: Starting A high performance web server and a reverse proxy server...Jan 27 19:41:23 desktop systemd[1]: Started A high performance web server and a reverse proxy server.

اگر می‌خواهید مطمئن شوید سرویسی که می‌خواهید شروع یا متوقف شده است (برای مثال در اسکریپت نویسی) می‌توانید از is-active استفاده کنید.

systemctl is-active APPLICATION.service

خروجی این دستور در صورتی که سرویس مورد نظر شما شروع شده باشد active خواهد بود و در غیر این صورت inactive.

و به همین ترتیب، اگر می‌خواهید مطمئن شوید که سرویس شما فعال است یا غیر فعال (الان شما دیگه می‌دونید که فرق غیر فعال با متوقف چیه 🙂 ) می‌توانید از is-enabled استفاده کنید.

systemctl is-enabled APPLICATION.service

خروجی این دستور هم در صورت فعال بودن enable و در صورت غیر فعال بودن disable خواهد بود.

 

 

نتیجه گیری
هیچ چیز در حال اجرایی که pid=1 است نباید شکست بخورد، نباید آشفته باشد و می بایست کاربران به طور موثر و کارآمد آن را کنترل کنند. بسیاری از کاربران بر این باورند که جایگزینی init با systemd چیزی بیش از دوباره کاری چرخه زمان به عنوان تاثی جانبی لینوکس نیست. اما این ماهیت متنوع لینوکس است. به این دلیل است که لینوکس بسیار قدرتمند است. تغییر خوب است و اگر به دلیل خوبی انجام می شود باید آن را درک کنیم.

درباره - یاشار اسمعیل دخت هستم ۲۷ سالمه (به دنیال یافتم آنم که کیستم)به صورت ۱۰۰٪ به گنو/لینوکس مهاجرت کردم . من رو با نام royaflash میشناسید . در زمینه شبکه و امنیت شبکه فعالیت میکنم . لینوکس همیشه چیزی برای یادگیری داره و لینوکس یه فرهنگه . در صورت نیاز میتونین با آدرس ایمیل : [email protected] یا شماره تلفن : 09141100257 در ارتباط باشید . وبلاگ شخصی من (-:) درباره من

فرستادن یک دیدگاه

XHTML: شما می‌توانید از این برچسب‌ها استفاده کنید: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>