سسٹم ڈی کو ہیک کرنا

میں دس سال سے زیادہ عرصے سے ایمبیڈڈ لینکس سسٹم بنا رہا ہوں۔ اس کا مطلب ہے کہ میں نے sysV style init کے ساتھ بہت کام کیا ہے۔ یہ مضبوط اور وقت آزمودہ ہے، لیکن اس کی اپنی حدود ہیں۔ اب کئی پروجیکٹس sysinit کے تسلط کو ختم کرنے کے لیے کام کر رہے ہیں، جیسے Upstart اور systemd۔

میں Fedora کے ساتھ کافی کام کرتا ہوں، بغیر ڈسک کے ورک سٹیشنز کے لیے nfsroot فائل سسٹم اور Fedora ریپوزٹریز پر مبنی ایمبیڈڈ فرم ویئر بنا رہا ہوں۔ اس قسم کے کام کے لیے Fedora ایک عجیب انتخاب ہے؛ زیادہ تر لوگ Debian یا Ubuntu استعمال کرتے ہیں۔

Fedora نے ریلیز 15 میں systemd کی طرف منتقلی کی۔ چونکہ systemd نیا تھا، میں نے فیصلہ کیا کہ پیچھے رہوں اور اپنے تمام ٹول چینز کو Fedora 15 میں اپ گریڈ نہ کروں۔ اب ہم 17 پر ہیں، اور چیزیں کافی مستحکم نظر آتی ہیں۔ چنانچہ میں نے Fedora 17 استعمال کرتے ہوئے nfsroot سسٹم بنانے کا خطرہ مول لیا۔ حتمی نتیجہ LTSP5/Meukow جیسا ہے – فرق صرف یہ ہے کہ تمام پیکجز بہت نئے ہیں کیونکہ Fedora جدید ترین ٹیکنالوجی پر کام کرتا ہے۔

systemd پر دستاویزات بہت کم ہیں، اس لیے مجھے systemd کو چھوٹا کرنے کا طریقہ سمجھنے میں کچھ مشکل پیش آئی۔ sysinit کے ساتھ چیزیں آسان ہیں۔ آپ صرف rc.sysinit میں سے گزرتے ہیں جب تک کہ یہ اچھا اور چھوٹا نہ لگے۔ آپ chkconfig کا استعمال کرتے ہوئے غیر متعلقہ سروسز کو بند کر دیتے ہیں۔ اور یقیناً selinux کو غیر فعال کر دیتے ہیں۔ Fedora ٹیم نے systemd کو ٹویک اور استعمال کرنے پر کچھ مفید دستاویزات فراہم کی ہیں۔ ان کے پاس sysVinit to systemd cheatsheet اور ایک ڈیبگنگ گائیڈ بھی ہے۔ یہ صفحات بہت مددگار تھے۔

جب میں نے پہلی بار اپنے 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