SystemD کو ہیک کرنا
میں 10 سال سے زیادہ عرصے سے ایمبیڈڈ لینکس سسٹمز بنا رہا ہوں، اور میں نے sysV طرز کے init کے ساتھ بہت کام کیا ہے۔ یہ مضبوط اور آزمودہ ہے، لیکن اس کی اپنی حدود ہیں۔ اب کئی پروجیکٹس sysvinit کو تبدیل کرنے کا ہدف رکھتے ہیں، جیسے Upstart اور systemd۔
میں Fedora کے ساتھ بہت کام کرتا ہوں، ڈسک لیس ورک سٹیشنز کے لیے nfsroot فائل سسٹمز اور Fedora ریپوزیٹریز پر مبنی ایمبیڈڈ فرم ویئر دونوں بنا رہا ہوں۔ اس قسم کے کام کے لیے Fedora ایک عجیب انتخاب ہے؛ زیادہ تر لوگ Debian یا Ubuntu کا انتخاب کریں گے۔
Fedora نے ریلیز 15 میں systemd پر منتقل ہو گیا تھا۔ چونکہ systemd نیا تھا، میں نے اپنے ٹول چینز کو Fedora 15 میں اپ گریڈ نہ کرنے کا فیصلہ کیا۔ اب ہم 17 پر ہیں، اور systemd مستحکم دکھائی دیتا ہے۔ اس لیے میں نے Fedora 17 استعمال کرتے ہوئے ایک nfsroot سسٹم بنایا۔ نتیجہ LTSP5/Meukow کے مشابہ ہے، سوائے اس کے کہ تمام پیکجز بہت زیادہ نئے ہیں، کیونکہ Fedora حالیہ ریلیزز بھیجتا ہے۔
systemd پر دستاویزات کم ہیں، اور مجھے systemd کو کم کرنے کا طریقہ معلوم کرنے میں کچھ دشواری پیش آئی۔ sysvinit کے ساتھ، کم کرنا آسان ہے: آپ rc.sysinit میں ترمیم کرتے ہیں جب تک کہ یہ دبلے پتلے نہ ہو جائے، chkconfig استعمال کرتے ہیں غیر متعلقہ سروسز کو بند کرنے کے لیے، اور SELinux کو غیر فعال کرتے ہیں۔ Fedora ٹیم نے systemd کو ٹوئیک کرنے اور استعمال کرنے پر کچھ مفید دستاویزات فراہم کی ہیں۔ ان کے پاس ایک sysVinit سے systemd چیٹ شیٹ، اور ایک ڈیبگنگ گائیڈ بھی ہے۔ ان صفحات نے میری بہت مدد کی۔
میرا nfsroot فائل سسٹم پہلی کوشش میں بوٹ ہونے میں ناکام رہا۔ کمرنل کمانڈ لائن میں
systemd.confirm_spawn=true
شامل کر کے، میں systemd کے چلائے گئے ہر کمانڈ کی تصدیق کرنے کے قابل ہوا، اور معلوم کر سکا کہ کون سا کریش ہو رہا ہے۔
systemd کی ایک مفید خصوصیت یہ ہے کہ یہ chroot فائل سسٹم پر chroot کیے بغیر chkconfig طرز کی کمانڈز چلا سکتا ہے۔ یہ yum کے --installroot آپشن کے مشابہ ہے، جسے میں نے فائل سسٹم بنانے کے لیے استعمال کیا تھا۔ مثال کے طور پر، اس سسٹم پر cron کو غیر فعال کرنے کے لیے جو آپ نے ابھی بنایا ہے، چلائیں
systemctl --system --root=$TARGET disable crond.service
جہاں $TARGET آپ کے chroot کا راستہ ہے۔
Systemd متعدد سروسز لانچ کرتا ہے جنہیں مندرجہ بالا کمانڈ سے غیر فعال نہیں کیا جا سکتا۔ ان سروسز/کمانڈز کے سم لنکس /etc/systemd میں بھی موجود نہیں ہیں۔ واحد طریقہ جو میں نے پایا وہ یہ تھا کہ /lib/systemd/system سے ان کمانڈز کے سم لنکس حذف کر دیے جائیں۔ کچھ کمانڈز جو میں نے ایمبیڈڈ/ڈیسک ٹاپ سسٹم میں غیر ضروری پائیں وہ ہیں:
/lib/systemd/system/sysinit.target.wants/*binfmt*
/lib/systemd/system/sysinit.target.wants/cryptsetup.target
/lib/systemd/system/sysinit.target.wants/dev-hugepages.target
/lib/systemd/system/basic.target.wants/fedora-configure.service
/lib/systemd/system/local-fs.target.wants/fedora-import-state.service
/lib/systemd/system/local-fs.target.wants/fedora-readonly.service
/lib/systemd/system/local-fs.target.wants/fedora-storage-init*.service