SystemD को हैक करना
मैं 10 वर्षों से अधिक समय से एम्बेडेड Linux सिस्टम बना रहा हूँ, और मैंने 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