بهترین سیستمهای init مدرن لینوکس (1992-2025)
مقدمه: سیستم init چیست و چرا اهمیت دارد؟
در سیستمعامل لینوکس و دیگر سیستمعاملهای شبه یونیکس، فرآیند init (مخفف initialization) اولین فرآیندی است که توسط کرنل در زمان بوت شدن سیستم اجرا میشود. این فرآیند دارای شناسه پردازش (PID) شماره 1 بوده و به صورت پسزمینه تا زمان خاموش شدن سیستم به اجرا ادامه میدهد.
فرآیند init مسئول راهاندازی تمامی فرآیندهای دیگر لینوکس شامل دیمونها، سرویسها و سایر پردازشهای پسزمینه است. به همین دلیل، به آن “مادر تمام فرآیندهای سیستم” گفته میشود.
از دیدگاه فنی، وقتی یک فرآیند والد، فرآیندهای فرزند زیادی را در سیستم ایجاد میکند، در صورت از بین رفتن فرآیند والد، init به عنوان والد جدید فرآیندهای یتیم انتخاب میشود. این مکانیزم از ایجاد فرآیندهای یتیم در سیستم جلوگیری میکند.
مکانیزم کارکرد init
سیستم init در چند مرحله اصلی کار میکند:
- مرحله 1: کرنل لینوکس پس از بارگذاری، فرآیند init را اجرا میکند
- مرحله 2: init فایلهای پیکربندی خود را خوانده و سرویسهای ضروری را راهاندازی میکند
- مرحله 3: سرویسهای سیستمی و شبکهای راهاندازی میشوند
- مرحله 4: محیط کاربری و سرویسهای نهایی Load میشوند
تاریخچه سیستمهای init در لینوکس
در طول سالهای مختلف، سیستمهای init متعددی در توزیعهای اصلی لینوکس ظهور کردهاند. در این راهنما، به بررسی برخی از بهترین سیستمهای init که میتوانید در سیستمعامل لینوکس با آنها کار کنید، میپردازیم.
1. سیستم System V Init
System V (SysV) یک طرح init بالغ و محبوب در سیستمعاملهای شبه یونیکس است. این سیستم والد تمام فرآیندها در یک سیستم یونیکس/لینوکس محسوب میشود. SysV اولین سیستمعامل تجاری یونیکس طراحی شده است.
تقریباً تمام توزیعهای لینوکس در ابتدا از طرح init SysV استفاده میکردند، به جز Gentoo که دارای init سفارشی است و Slackware که از طرح init به سبک BSD استفاده میکند.
معماری System V Init
معماری SysV مبتنی بر runlevelها (سطحهای اجرایی) است که هر کدام مجموعهای از سرویسها را تعریف میکنند:
who -r
runlevel
# تغییر runlevel
init 3
telinit 5
runlevelهای استاندارد در SysV:
- 0: خاموش کردن سیستم
- 1: حالت تک کاربره
- 2: حالت چندکاربره بدون سرویس شبکه
- 3: حالت چندکاربره با سرویس شبکه
- 5: حالت چندکاربره با رابط گرافیکی
- 6: راهاندازی مجدد سیستم
مدیریت سرویسها در SysV
service apache2 start
service network restart
service sshd stop
# یا با استفاده از اسکریپتهای مستقیم
/etc/init.d/apache2 start
/etc/init.d/mysql restart
با گذشت سالها، به دلیل برخی نواقص، چندین جایگزین برای SysV init در راستای ایجاد سیستمهای init کارآمدتر و کاملتر برای لینوکس توسعه یافتهاند.
اگرچه این جایگزینها به دنبال بهبود SysV و احتمالاً ارائه ویژگیهای جدید هستند، اما هنوز با اسکریپتهای init اصلی SysV سازگار میباشند.
اگرچه SysV init هنوز در دسترس و نگهداری میشود، اما در اکثر توزیعهای اصلی largely توسط systemd جایگزین شده است. تنها تعداد معدودی از توزیعها مانند Slackware همچنان به استفاده از انواع سیستمهای init سنتی به صورت پیشفرض ادامه میدهند.
2. SystemD
SystemD یک طرح init نسبتاً جدید در پلتفرم لینوکس است. این سیستم که در فدورا 15 معرفی شد، مجموعهای از ابزارها برای مدیریت آسان سیستم است. هدف اصلی آن، مقداردهی اولیه، مدیریت و پیگیری تمام فرآیندهای سیستم در فرآیند بوت و در حین اجرای سیستم میباشد.
مزایای معماری systemd
init systemd به طور جامعی از دیگر سیستمهای init سنتی یونیکس متمایز است، چرا که به صورت عملی به مدیریت سیستم و سرویسها میپردازد. همچنین با اسکریپتهای init SysV و LBS سازگار است.
برخی از ویژگیهای برجسته آن عبارتند از:
- طراحی تمیز، مستقیم و کارآمد
- پردازش همزمان و موازی در زمان بوت
- API بهتر
- امکان حذف فرآیندهای اختیاری
- پشتیبانی از ثبت رویداد با استفاده از journald
- پشتیبانی از زمانبندی کارها با استفاده از تایمرهای تقویمی systemd
- ذخیره لاگها در فایلهای باینری
- حفظ وضعیت systemd برای مرجع آینده
- یکپارچگی بهتر با GNOME و موارد بسیار دیگر
مدیریت سرویسها در systemd
systemctl start apache2
systemctl stop nginx
systemctl restart ssh
systemctl status mysql
# فعال/غیرفعال کردن سرویسها
systemctl enable apache2
systemctl disable mysql
# مشاهده تمام سرویسها
systemctl list-units –type=service
systemctl list-unit-files –type=service
لاگگیری و مدیریت زمانبندی
journalctl -f
journalctl -u apache2
journalctl –since “2024-01-01” –until “2024-01-02”
journalctl -p err
# مدیریت تایمرها
systemctl list-timers
systemctl start mytimer.timer
systemctl enable dailytask.timer
واحدهای (Units) systemd
systemd از واحدهای مختلفی پشتیبانی میکند:
.service # سرویسها
.socket # سوکتها
.device # دستگاهها
.mount # نقطههای mount
.automount # mount خودکار
.swap # فضای swap
.target # گروههای سرویس
.path # نظارت بر مسیرها
.timer # تایمرها
.slice # مدیریت منابع
.scope # فرآیندهای خارجی
SystemD به سیستم init غالب در اکوسیستم لینوکس تبدیل شده است. از سال 2015، تقریباً تمام توزیعهای اصلی لینوکس شامل دبیان، اوبونتو، فدورا، سنتاواس، ردهت انترپرایز لینوکس، openSUSE، آرچ لینوکس و بسیاری دیگر، systemd را به عنوان سیستم init پیشفرض خود پذیرفتهاند. اکنون این سیستم به عنوان استاندارد de facto برای اکثر توزیعهای لینوکس شناخته میشود، اگرچه همچنان موضوع بحث در جامعه لینوکس باقی مانده است.
3. OpenRC
OpenRC یک طرح init مبتنی بر وابستگی برای سیستمعاملهای شبه یونیکس است که با SysV init سازگار میباشد. هرچند که بهبودهایی به Sys V میآورد، اما باید در نظر داشته باشید که OpenRC یک جایگزین مطلق برای فایل /sbin/init نیست.
ویژگیهای OpenRC
این سیستم ویژگیهای درخشانی ارائه میدهد، از جمله:
- میتواند روی بسیاری از توزیعهای لینوکس دیگر، از جمله Gentoo و همچنین روی BSD اجرا شود
- پشتیبانی از اسکریپتهای init آغاز شده توسط سختافزار
- پشتیبانی از یک فایل پیکربندی واحد
- عدم پشتیبانی از پیکربندیهای per-service
- اجرا به عنوان یک دیمون
- راهاندازی موازی سرویسها و موارد بسیار دیگر
مدیریت سرویسها در OpenRC
rc-service apache2 start
rc-service mysql stop
rc-service sshd restart
# مدیریت وابستگیها
rc-update add apache2 default
rc-update del mysql default
rc-update show
# بررسی وضعیت سرویسها
rc-status
OpenRC همچنان به طور فعال نگهداری میشود و سیستم init پیشفرض برای Gentoo Linux است. همچنین توسط Artix Linux و دیگر توزیعهای فاقد systemd پذیرفته شده است.
OpenRC همچنان یک انتخاب محبوب برای کاربرانی است که به دنبال یک جایگزین سبکوزن برای systemd هستند و در بین کسانی که سیستمهای init سادهتر و با ویژگیهای کمتر را ترجیح میدهند، رتبه بالایی دارد.
4. runit
runit همچنین یک سیستم init cross-platform است که میتواند روی GNU/Linux، Solaris، *BSD و Mac OS X اجرا شود و یک جایگزین برای SysV init است که نظارت سرویس را ارائه میدهد.
مزایای runit
این سیستم با مزایا و مؤلفههای قابل توجهی همراه است که در SysV init و احتمالاً دیگر سیستمهای init در لینوکس یافت نمیشوند و این موارد شامل:
- نظارت سرویس، جایی که هر سرویس با یک دایرکتوری سرویس مرتبط است
- وضیعت فرآیند تمیز که به هر فرآیند یک وضعیت تمیز تضمین میکند
- دارای امکانات ثبت قابل اعتماد
- بوت و خاموش کردن سریع سیستم
- همچنین portable است
- متناسب با بستهبندی
- اندازه کد کوچک و موارد بسیار دیگر
مدیریت سرویسها در runit
sv start apache2
sv stop mysql
sv restart sshd
sv status nginx
# مشاهده تمام سرویسها
ls /etc/sv/
sv status /etc/sv/*
# فعال/غیرفعال کردن سرویسها
ln -s /etc/sv/apache2 /var/service/
rm /var/service/mysql
runit همچنان به طور فعال نگهداری میشود و در Void Linux به عنوان سیستم init پیشفرض ادامه استفاده دارد. این سیستم به دلیل سادگی، footprint کوچک و قابلیتهای نظارت سرویس قابل اعتماد مورد تقدیر قرار میگیرد. همچنین به دلیل ماهیت سبکوزن آن، اغلب در محیطهای کانتینری استفاده میشود.
5. s6
s6 مجموعهای فشرده از ابزارها برای UNIX ارائه میدهد که برای نظارت فرآیند، مشابه daemontools و runit طراحی شده است. این سیستم عملیات روی فرآیندها و دیمونها را تسهیل میکند.
معماری s6
s6 به عنوان یک toolkit مدیریت سرویس سطح پایین طراحی شده است که ابزارهای متنوعی ارائه میدهد که میتوانند به طور مستقل یا در چارچوب آن عمل کنند. این ابزارها، وقتی با هم ترکیب شوند، عملکردی قوی با حداقل کد ارائه میدهند.
s6-svscanctl -a /var/run/s6/services
s6-svc -u /var/run/s6/services/apache2
s6-svc -d /var/run/s6/services/mysql
s6-svstat /var/run/s6/services/sshd
ویژگیهای کلیدی s6
- طراحی ماژولار و ترکیبی
- نظارت قوی بر سرویسها
- لاگگیری پیشرفته
- مدیریت وابستگیهای پیچیده
- مناسب برای سیستمهای embedded
- مصرف منابع بسیار پایین
s6 همچنان به طور فعال توسعه و نگهداری میشود که توسط برخی توزیعهای تخصصی استفاده میشود و به ویژه در سیستمهای embedded و محیطهای کانتینری محبوب است، جایی که footprint منبع کم و قابلیتهای نظارت قوی آن ارزشمند هستند.
6. Dinit
Dinit یک افزوده جدید به چشمانداز سیستم init است که به عنوان یک مدیر سرویس و سیستم init مدرن مبتنی بر وابستگی طراحی شده است. این سیستم هدف ارائه یک جایگزین سادهتر و مینیمالیستی برای systemd را دارد، در حالی که همچنان ویژگیهای مدرن را ارائه میدهد.
ویژگیهای کلیدی Dinit
- مدیریت سرویس مبتنی بر وابستگی
- نظارت سرویس و راهاندازی مجدد خودکار
- سینتکس پیکربندی تمیز و قابل خواندن
- مصرف منابع کم و زمانهای بوت سریع
- لایه سازگاری برای سرویسهای runit
- مناسب برای هر دو init سیستم و سرویسهای کاربر
پیکربندی Dinit
type = process
command = /usr/sbin/apache2 -f /etc/apache2/apache2.conf
restart = true
# وابستگیها
depends-on = network.service
depends-on = mysql.service
dinitctl start apache2
dinitctl stop mysql
dinitctl status sshd
dinitctl enable nginx
Dinit به طور فعال توسعه مییابد و در جامعه در حال gaining traction است، که توسط توزیعهایی مانند Chimera Linux به عنوان سیستم init پیشفرض پذیرفته شده است، و editionهای init-diversity از antiX Linux آن را به عنوان یک گزینه شامل میشوند. این سیستم نماینده یک رویکرد مدرن به سیستمهای init است که از پیچیدگی systemd اجتناب میکند در حالی که ویژگیهای معاصر را ارائه میدهد.
سیستمهای init تاریخی و منسوخ شده
Upstart
ذکر این نکته حائز اهمیت است که Upstart، یک سیستم init مبتنی بر رویداد که در اصل توسط اوبونتو توسعه یافت، زمانی یک بازیگر significant در چشمانداز سیستم init بود. با این حال، اوبونتو در سال 2015 به systemd انتقال یافت و Upstart از آن زمان discontinued شده است، که دیگر به طور فعال نگهداری نمیشود یا توسط هیچ توزیع اصلی استفاده نمیشود.
ویژگیهای Upstart
start apache2
stop mysql
restart network
status ssh
# مشاهده jobها
initctl list
مقایسه فنی سیستمهای init مدرن
معیارهای مقایسه
- سرعت بوت: systemd و runit سریعترین هستند
- مصرف حافظه: s6 و runit کمترین مصرف را دارند
- پیچیدگی: systemd پیچیدهترین، runit سادهترین
- انعطافپذیری: OpenRC و s6 بیشترین انعطاف را دارند
- جامعه و پشتیبانی: systemd بزرگترین جامعه را دارد
انتخاب سیستم init مناسب
انتخاب سیستم init به نیازهای خاص شما بستگی دارد:
- سیستمهای دسکتاپ و سرور عمومی: systemd
- سیستمهای embedded و کم منابع: s6 یا runit
- توزیعهای سنتی و minimalist: OpenRC
- پروژههای جدید و مدرن: Dinit
- کانتینرها و میکروسرویسها: runit یا s6
نتیجهگیری
همانطور که قبلاً اشاره کردم، سیستم init تمام فرآیندهای دیگر در یک سیستم لینوکس را راهاندازی و مدیریت میکند. علاوه بر این، SysV طرح init اولیه در سیستمعاملهای لینوکس است، اما به دلیل برخی ضعفهای عملکردی، برنامهنویسان سیستم چندین جایگزین برای آن توسعه دادهاند.
امروزه انتخاب سیستم init به عوامل متعددی از جمله:
- نیازهای سختافزاری
- میزان تخصص تیم
- محدودیتهای منابع
- نیازهای امنیتی
- سازگاری با نرمافزارهای موجود
توسعه سیستمهای init همچنان ادامه دارد و شاهد نوآوریهای جدید در این حوزه خواهیم بود. انتخاب بهترین سیستم init بستگی به نیازهای خاص، تخصص فنی و اهداف بلندمدت پروژه شما دارد.