systemd چیست؟
تفاوت میان init و systemd
systemd
systemd یک System Manager می باشد که در ابتدای بوت شدن سیستم پردازش آن شروع می شود و به عنوان parent سایر process ها شناخته می شود و به عنوان جایگزینی برای init معرفی شده است.
init چیست؟
init یا SysVinit در اصل یک daemon process یا پکیج مدیریت سرویس است که به محض روشن شدن کامپیوتر تا زمان خاموش شدن آن فعالیت می کند. در واقع init اولین پردازشی است که پس از بوت شدن سیستم شروع به فعالیت می کند و به عنوان والد (parent) تمام پردازش ها محسوب می شود و همیشه دارای PID برابر با ۱ می باشد.
اگر به هر دلیلی daemon مربوط به init نتواند شروع به کار کند, هیچ پردازش یا پروسس دیگری نمی تواند شروع به کار نماید. در این صورت سیستم وارد شرایطی شده است که به آن kernel panic می گویند.
با توجه به نیاز های مختلف جایگزین هایی برای هدف ایجاد شد که برخی از آنها به daemon process اصلی برخی از توزیع ها در آمد. مانند Upstart که در Ubuntu پیاده سازی گردید (تا نسخه ۱۶.۰۴) یا systemd که در برخی از توزیع ها مانند Fedora, Open SuSE, CentOS و … پیاده سازی گردیده اند.
systemd چیست؟
systemd همانند init یک System Manager یا پکیج مدیریت سرویس می باشد که در ابتدای بوت شدم سیستم پردازش آن شروع می شود و به عنوان parent سایر process ها با PID=1 فعالیت خواهد کرد. systemd برای رفع برخی نواقص init طراحی و پیاده سازی شده است به عنوان نمونه شروع process ها به صورت همزمان و موازی در زمان بوت شدن سیستم که علاوه بر کاهش زمان بوت شدن سیستم عامل, استفاده از منابع پردازشی را نیز کاهش می دهد.
به عنوان نمونه init به صورت سریالی عمل میکند. به این معنی که یک وظیفه تنها در زمانی شروع میشود که وظیفه قبلی با موفقیت انجام شده و در Memory نیز load شده باشد که در زمان بوت شدن سیستم عامل باعث افزایش زمان بوت شدن می گردید. لازم به ذکراست که systemd با هدف افزایش سرعت بوت شدن ایجاد نشده است اما برای این که کارها به صورت منظم انجام شود, نیاز بود تا هر گونه delay یا تاخیر غیر ضروری حذف گردد. که اجرای موازی process ها و رعایت dependency از مواردی بود که به کاهش این تاخیر ها کمک کردند.
نمونه ای از رعایت dependency این است که به صورت مثال سرویس هایی که در ابتدای شروع به پردازش نیاز به running بودن سرویس network دارند میتوانند پس از شروع به کار سرویس network به صورت همزمان و موازی شروع به کار نمایند. که این کار در init همانطور که گفته شد به صورت سریالی انجام می پذیرد.
ویژگی های systemd
برخی از ویژگی هامانند کارآمی بیشتر نسبت به init و یا ساده تر شدن پروسه بوت و بهبود API و… باعث شد تا systemd محبوبیت بیشتری پیدا کند و رفته رفته جای خود را در توزیع های مختلف باز بکند. در زیر شرح کامل ویژگی های systemd آورده شده است.
- طراحی بهتر و کارآمد
- ساده شدن پروسه بوت شدن
- اجرای پروسس ها به صورت همزمان و موازی در هنگام بوت
- بهتر شدن API
- امکان حذف Component های اختیاری
- راه اندازی سرویس ها بر اساس تنظیمات نوشته شده در فایل کانفیگ (راه اندازی سرویس ها در init به وسیله سلسله دستوراتی از طریق شل اسکریپت انجام میگیرد.)
- زمان بندی کارها
- لاگ ها توسط journald ذخیره سازی می شوند.
- امکان انتخاب systemd برای ثبت وقایع سیستمی همانند sysog
- ذخیره سازی لاگ ها به صورت باینری
- کنترل ورود و خروج کاربران به وسیله systemd-logind
نطقه ضعف systemd عدم تطابق با POSIX است.
systemd در برخی از توزیع های لینوکس:
نام توزیع | وضعیت استفاده |
Fedora | از سال ۲۰۱۱ (اولین توزیعی که از systemd به صورت پیش فرض استفاده نمود) |
Arch | از سال ۲۰۱۲ |
RedHat | از سال ۲۰۱۴ و نسخه ۷ |
CentOS | از سال ۲۰۱۴ و نسخه ۷ |
Debian | از سال ۲۰۱۵ و نسخه ۸ (Jessie) |
Gentoo | به صورت پیش فرض استفاده نمی شود و نیاز به دانلود, نصب و پیکربندی دارد. |
OpenSUSE | از سال ۲۰۱۴ و نسخه ۱۲ |
Slack | در حال حاضر خیر |
Ubuntu | از سال آپریل سال ۲۰۱۵ و نسخه ۱۵.۰۴ |
مقایسه systemd و init
Features | init | systemd |
DBus Dependency – Mandatory | No | Yes |
Device based Activation | No | Yes |
Device dependency configuration with udev | No | Yes |
Timer based Activation | Cron/at | Proprietary |
Quota Management | No | Yes |
Automatic Service Dependency Handling | No | Yes |
Kills users Process at logout | No | Yes |
Swap Management | No | Yes |
SELinux integration | No | Yes |
Support for Encrypted HDD | No | Yes |
Static kernle module loading | No | Yes |
GUI | No | Yes |
List all the child processes | No | Yes |
Sysv compatible | Yes | Yes |
Interactive booting | No | Yes |
Portable to non x86 | Yes | No |
Adopted on | Several Distro | Several Distro |
Parallel service startup | No | Yes |
Resource limit per service | No | Yes |
Easy extensible startup script | Yes | No |
Separate Code and Configuration File | Yes | No |
Automatic dependency calculation | No | Yes |
Verbose debug | Yes | No |
Version | N/A | V44+ |
Size | 560 KB | N/A |
Number of Files | 75 files | 900 files + glib + DBus |
Lines of code – LOC | 15000 (Approx) | 224000 (Approx) (inc Codes, comments and white space) 125000 (Approx) (acctual code) |
Systemd برای فعالیت از مجموعه ای از پکیج ها استفاده می کند برخی از این پکیج ها و وظایف آنها به شرح زیر است.
journald
daemon است که وظیفه جمع آوری لاگ اتفاقات سیستمی و ذخیره سازی آنها به صورت باینری را بر عهده دارد. البته ادمین سیستم این امکان را دارد که مشخص کند لاگ ها توسط این daemon انجام شود یا توسط syslog-ng یا rsyslog
logind
وظیفه مدیریت ورود و خروج واتصالات کاربران را بر عهده دارد و امکان multi session را برای کاربران را فراهم می آورد و در واقع جایگزینی است برای Consolekit که توسعه آن متوقف شده است.
networkd
وظیفه handle کردن پیکربندی کارت های شبکه را بر عهده دارد.در اوایل این daemon تنها می توانست به صورت استاتیک به کارت های شبکه IP دهد و برخی از پیکربندی های اولیه Bridging را انجام دهد که از سال ۲۰۱۴ امکان DHCP سرور برای IPv4 و پشتیبانی از VXLAN به آن اضافه شده است.
tmpfiles
ابزاری است که وظیفه ایجاد و حذف فایل ها و دایرکتوری های موقت (Temp) را بر عهده دارد و به صورت معمول در شروع به کار سیستم عامل فعال شده و در بازه های مشخص شده نیز عمل می کند.
timedated
وظیفه کنترل تنظیمات مربوط به زمان را بر عهده دارد. تنظیماتی مانند زمان سیستم, time zone و انتخاب زمان به UTC و زمان محلی (Local Time Zone) را بر عهده این daemon است.
udevd
udev نقش یک device manager را برای کرنل ایفا میکند و وظیفه آن handle کردن دایرکتوری /dev و تمام فعالیت های مرتبط با user space را در هنگام حذف یا اضافه device جدید را بر عهده دارد.
libudev
یک استاندارد library برای استفاده از udev است که به برنامه های third-party اجازه میدهد تا منابع udev را query کنند.
Systemd-boot
boot Manager است که در systemd تعبیه شده است که سابقا با نام gummiboot شناخته می شده است.
تفاوت init و Systemd در یک نگاه
برای آشنایی با نحوه ایجاد سرویس در systemd میتوانید با ما در این وبسایت همراه باشید.