Hacking SystemD
હું 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 ની એક સરસ ક્ષમતા એ છે કે chroot ફાઇલસિસ્ટમ પર chkconfig શૈલીના કમાન્ડ ચલાવવા, તેમાં chroot થયા વિના. આ 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