SystemD ഹാക്കിംഗ്
ഞാൻ 10 വർഷത്തിലധികമായി എംബെഡഡ് ലിനക്സ് സിസ്റ്റങ്ങൾ നിർമ്മിക്കുന്നു, കൂടാതെ sysV ശൈലിയിലുള്ള init ഉപയോഗിച്ച് വ്യാപകമായി പ്രവർത്തിച്ചിട്ടുണ്ട്. ഇത് കരുത്തുറ്റതും കാലപരീക്ഷണത്തിൽ വിജയിച്ചതുമാണ്, എന്നാൽ ഇതിന് പരിമിതികളുണ്ട്. Upstart和 systemd പോലുള്ള നിരവധി പ്രോജക്റ്റുകൾ ഇപ്പോൾ sysvinit മാറ്റിസ്ഥാപിക്കാൻ ലക്ഷ്യമിടുന്നു.
ഞാൻ 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 പ്രവർത്തനരഹിതമാക്കുക. systemd ട്വീക്ക് ചെയ്യുന്നതിനെക്കുറിച്ചും ഉപയോഗിക്കുന്നതിനെക്കുറിച്ചും Fedora ടീം ചില ഉപയോഗപ്രദമായ ഡോക്യുമെന്റേഷൻ പ്രസിദ്ധീകരിച്ചിട്ടുണ്ട്. അവർക്ക് ഒരു 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