اختراق SystemD

لقد كنت أبني أنظمة Linux المدمجة لأكثر من 10 سنوات، وقد عملت بشكل مكثف مع sysV style init. إنه قوي ومُجرَّب عبر الزمن، لكن له حدوده. تهدف عدة مشاريع الآن إلى استبدال sysvinit، مثل Upstart وsystemd.

أعمل بشكل مكثف مع Fedora، حيث أبني كلاً من أنظمة ملفات nfsroot لمحطات العمل عديمة القرص، والبرامج الثابتة المدمجة القائمة على مستودعات Fedora. تُعد Fedora خياراً غريباً لهذا النوع من العمل؛ معظم الناس سيختارون Debian أو Ubuntu.

انتقلت Fedora إلى systemd في الإصدار 15. ولأن systemd كان جديداً، قررت عدم ترقية سلاسل أدواتي إلى Fedora 15. الآن نحن على 17، ويبدو أن systemd مستقر. لذلك بنيت نظام nfsroot باستخدام Fedora 17. النتيجة مشابهة لـ LTSP5/Meukow، باستثناء أن جميع الحزم أحدث بكثير، حيث تشحن Fedora إصدارات حديثة.

التوثيق حول systemd شحيح، وقد واجهت بعض الصعوبة في معرفة كيفية تقليص systemd. مع sysvinit، يكون التقليص أسهل: تقوم بتحرير rc.sysinit حتى يصبح نحيفاً، وتستخدم chkconfig لإيقاف الخدمات غير الضرورية، وتعطيل SELinux. وقد نشر فريق Fedora بعض التوثيق المفيد حول ضبط واستخدام systemd. لديهم أيضاً ورقة مرجعية للانتقال من sysVinit إلى systemd، ودليل تصحيح الأخطاء. ساعدتني هذه الصفحات كثيراً.

فشل نظام ملفات nfsroot الخاص بي في الإقلاع من المحاولة الأولى. بإضافة

systemd.confirm_spawn=true

إلى سطر أوامر النواة، تمكنت من تأكيد كل أمر ينفذه systemd، ومعرفة أيهما كان يتعطل.

من الميزات المفيدة في systemd أنه يمكنه تشغيل أوامر بنمط chkconfig على نظام ملفات chroot دون الحاجة إلى الدخول إليه عبر chroot. هذا مشابه لخيار --installroot في yum، الذي استخدمته لبناء نظام الملفات في المقام الأول. على سبيل المثال، لتعطيل 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