हैकिंग सिस्टमडी

मैं पिछले 10 वर्षों से अधिक समय से एम्बेडेड लिनक्स सिस्टम बना रहा हूँ। इसका मतलब है कि मैंने 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 की एक अच्छी क्षमता यह है कि यह एक चूट फाइलसिस्टम पर chrooting के बिना 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