Wednesday, September 10, 2014

ക്രോസ്സ് കമ്പൈലേഷൻ - 3

ലിനക്സ് റൂട്ട് ഫയൽ സിസ്റ്റത്തിലെ വിവിധ ഡയറക്ടറികളെക്കുറിച്ചും മറ്റും ഇവിടെ പറഞ്ഞിട്ടുണ്ട്. ആ ഭാഗം ആവശ്യമെങ്കിൽ ഒന്നുകൂടി വായിച്ച് നോക്കൂ. ഇതിനു പുറമേ ലിനക്സ് സിസ്റ്റം സ്റ്റാർട്ടപ്പിനെക്കുറിച്ചും ഇനിറ്റ് പ്രോഗ്രാമുകളെക്കുറിച്ചും ഉള്ള പോസ്റ്റുകൾ (1, 2, 3) കൂടി വായിക്കുന്നത് നന്നായിരിക്കും./bin, /sbin, /usr/bin തുടങ്ങിയ ഡയറക്ടറികളിൽ കാണുന്ന പ്രോഗ്രാമുകളുടെ സോഴ്സ് കോഡ് ഗ്നു കോർയൂട്ടിൽസ്, ലിനക്സ് യൂട്ടിൽസ് തുടങ്ങിയ പാക്കേജുകളിൽ നിന്ന് ലഭിക്കും. ls, cat, cp തുടങ്ങിയ അടിസ്ഥാന യൂട്ടിലിറ്റികൾ ഒക്കെ ഗ്നു കോർയൂട്ടിൽസിലും ps, fsck തുടങ്ങി സിസ്റ്റം അഡ്മിനിസ്ട്രേഷൻ യൂട്ടിലിറ്റികൾ ഒക്കെ ലിനക്സ് യൂട്ടിൽസ് പാക്കേജിലും ആയിരിക്കും ഉണ്ടാവുന്നത്. ഒരു ഡെസ്ക്‌ടോപ്പ് ലിനക്സ് സിസ്റ്റത്തിൽ ഇവക്കു പുറമേ നിരവധി പാക്കേജുകളും ഡെസ്ക്‌ടോപ്പ് എൻവയോണ്മെന്റും ഒക്കെ ഉണ്ടാവും. ആവശ്യമായ പാക്കേജുകൾ എല്ലാം അതാത് പാക്കേജുകളുടെ പേജിൽ നിന്ന് ഡൗൺലോഡ് ചെയ്ത് കമ്പൈൽ ചെയ്യാവുന്നതാണ്. ഈ പ്രോഗ്രാമുകളെ ഒക്കെ പ്രവർത്തിപ്പിക്കാൻ ആവശ്യമായ കമാന്റുകൾ നൽകാനും മറ്റുമായി ഒരു ഷെൽ പ്രോഗ്രാമും ആവശ്യമാണ്. bash, csh, sh, msh, ash തുടങ്ങി നിരവധി ഷെൽ പ്രോഗ്രാമുകൾ ലഭ്യമാണ്. ഇവക്കു പുറമേ നിർബന്ധമായി വേണ്ട മറ്റൊന്നാണ് ഇനിറ്റ് പ്രോഗ്രാം. അപ്‌സ്റ്റാർട്ട്, സിസ്റ്റംഡി, സിസ്‌വി ഇനിറ്റ് തുടങ്ങി ഏത് ഇനിറ്റ് പ്രോഗ്രാം വേണമെങ്കിലും തെരഞ്ഞെടുക്കുകയും അവക്ക് ആവശ്യമായ ക്രമീകരണ ഫയലുകൾ റൂട്ട് ഫയൽ സിസ്റ്റത്തിൽ സജ്ജീകരിക്കുകയും ചെയ്യാം. ഒരു ഇനിറ്റ് പ്രോഗ്രാം ഇല്ലെങ്കിൽ ബൂട്ടിങ്ങ് കഴിഞ്ഞ ശേഷം എന്ത് ചെയ്യണമെന്നറിയാതെ ലിനക്സ് കെർണൽ പേടിച്ച് പോകും. :)

മേൽപ്പറഞ്ഞ യൂട്ടിലിറ്റികളും ഷെൽ പ്രോഗ്രാമും ഒരു ഇനിറ്റ് പ്രോഗ്രാമും എല്ലാം ഒരൊറ്റ ബൈനറി ഫയലിൽ തന്നെ നൽകുന്ന ഒരു പാക്കേജ് ആണ് ബിസിബോക്സ് (BusyBox). മെമ്മറിയും സ്റ്റോറേജ് സ്ഥലവും മറ്റും പരിമിതമായ സാഹചര്യങ്ങൾ ഉള്ള എംബെഡ്ഡഡ് സിസ്റ്റങ്ങളിലും മറ്റും ഉപയോഗിക്കാൻ അനുയോജ്യമാണ് ബിസിബോക്സ്. എംബെഡ്ഡഡ് സിസ്റ്റങ്ങൾക്കായുള്ള സ്വിസ്സ് ആർമി നൈഫ് എന്ന് ഇതിനെ വിശേഷിപ്പിക്കാറുണ്ട്. ലിനക്സ് അധിഷ്ഠിത സിസ്റ്റങ്ങളിലും ബി എസ് ഡി പോലുള്ള മറ്റ് യൂണിക്സ് പോലെയുള്ള സിസ്റ്റങ്ങളിലും ഇത് പ്രവർത്തിക്കും. ബിസിബോക്സ് കമ്പൈൽ ചെയ്യുമ്പോൾ ടാർഗറ്റ് ഫയൽ സിസ്റ്റത്തിൽ ഏതൊക്കെ യൂട്ടിലിറ്റികൾ ആണ് വേണ്ടത് എന്ന് നമുക്ക് തെരഞ്ഞെടുക്കാൻ സാധിക്കും. കമ്പൈൽ ചെയ്ത് ഇൻസ്റ്റാൾ ചെയ്യുമ്പോൾ ഈ യൂട്ടിലിറ്റികൾ ഒക്കെ /bin/busybox എന്ന ഒറ്റ ഫയലിലേക്കുള്ള സോഫ്റ്റ് ലിങ്കുകൾ ആയി ഇൻസ്റ്റാൾ ചെയ്യാം. അല്ലെങ്കിൽ ഓരോ പ്രോഗ്രാമും പ്രവർത്തിപ്പിക്കാൻ അതിനോടൊപ്പം busybox എന്ന് ചേർക്കേണ്ടിവരും. ഉദാഹരണത്തിന് ls പ്രോഗ്രാമിനായി busybox ls എന്ന് ഉപയോഗിക്കണം. ബിസിബോക്സ് കമ്പൈൽ ചെയ്ത് ടാർഗറ്റ് ഫയൽ സിസ്റ്റത്തിലേക്ക് എങ്ങനെ ഇൻസ്റ്റാൾ ചെയ്യാം എന്ന് നോക്കാം.

ആദ്യം ബിസിബോക്സ് സോഴ്സ് കോഡ് മേലെ ഉള്ള ലിങ്കിൽ നിന്ന് ഡൗൺലോഡ് ചെയ്യുക. പിന്നെ അതിനെ എക്സ്ട്രാക്റ്റ് ചെയ്യുക. ഇതിനോടൊപ്പം എവിടെയെങ്കിലും ടാർഗറ്റ് ഫയൽ സിസ്റ്റത്തിലേക്കാവശ്യമായ ഡയറക്ടറി സ്ട്രക്ചർ ഉണ്ടാക്കാനായി ഒരു ഡയറക്ടറിയും ഉണ്ടാക്കണം.
mkdir rootfs
tar xf busybox-1.22.1.tar.bz2
cd busybox-1.22.1/
ഇനി നമുക്ക് ബിൽഡ് ആർക്കിട്ടെക്ചറും ക്രോസ്സ് കമ്പൈലറും ഒക്കെ ക്രമീകരിക്കണം. ലിനക്സ് കെർണലിനായി ഇത് ചെയ്തത് ഓർമ്മയുണ്ടാകുമല്ലോ. 
export ARCH=arm
export CROSS_COMPILE=>/opt/arm-2011.03/bin/arm-none-linux-gnueabi- 
(ഈ പ്രിഫിക്സ് നിങ്ങളുടെ ടൂൾ ചെയി ഇൻസ്റ്റാളേഷനനുസരിച്ച് മാറും).
ബിസിബോക്സും കെർണൽ കോൺഫിഗറേഷൻ എഡിറ്റർ പോലെ ഒരു നല്ല കോൺഫിഗറേഷൻ എഡിറ്റർ അടക്കമാണ് വരുന്നത്. ഇത് തുറക്കാൻ make menuconfig എന്ന കമാന്റ് ഉപയോഗിക്കാം.

പ്രധാന പേജ്
ഇതിൽ ബിസിബോക്സ് സെറ്റിങ്ങ്സ് ഓപ്ഷൻ തെരഞ്ഞെടുത്താൽ താഴെ കാണുന്നതുപോലെ ഉള്ള മെനു ലഭിക്കും.

 ബിസിബോക്സ് സെറ്റിങ്ങ്സ് മെനു
ഇൻസ്റ്റാളേഷൻ ഓപ്ഷനുകൾ സെലക്റ്റ് ചെയ്താൽ താഴെക്കാണുന്ന മെനുവിലേക്ക് എത്തും. ഇതിലെ ബിസിബോക്സ് ഇൻസ്റ്റാളേഷൻ പ്രിഫിക്സ് എന്ന സ്ഥലത്ത് ചെന്ന് നേരത്തെ ഉണ്ടാക്കിയ ഡയറക്ടറിയുടെ മുഴുവൻ പാത്തും നൽകുക. ഈ ഡയറക്ടറിയിലേക്ക് ബിസിബോക്സ് കോപ്പി ചെയ്യപ്പെടുന്നതിനാണിത്.




ഇൻസ്റ്റാളേഷൻ ഓപ്ഷനുകൾ
ഇനി ബിസിബോക്സ് ബിൽഡ് ഓപ്ഷനിൽ ചെന്ന് ബിൽഡ് ബിസിബോക്സ് ആസ് എ സ്റ്റാറ്റിക് ബൈനറി എന്ന ഓപ്ഷൻ തെരഞ്ഞെടുക്കുക. നമ്മുടെ ടാർഗറ്റിൽ ഇത് ഉപകാരപ്രദമായിരിക്കും. റൺ‌ ടൈം ലൈബ്രറികളുടെ ഒന്നും സഹായമില്ലാതെ തന്നെ നാം ബിൽഡ് ചെയ്യുന്ന ബിസിബോക്സ് ബൈനറിക്ക് പ്രവർത്തിക്കാൻ സാധിക്കുന്നതിനു വേണ്ടിയാണിത്.

ബിൽഡ് ഓപ്ഷനുകൾ
ഇതുപോലെ തന്നെ ക്രോസ്സ് കമ്പൈലർ പ്രിഫിക്സിൽ ചെന്ന് സിസ്റ്റത്തിൽ ഇൻസ്റ്റാൾ ചെയ്തിട്ടുള്ള ക്രോസ്സ് കമ്പൈലർ പ്രിഫിക്സും ചേർക്കുക. ആവശ്യമാണെങ്കിൽ മറ്റ് ഓപ്ഷനുകൾ പരിശോധിച്ച് ആവശ്യമായ യൂട്ടിലിറ്റികൾ ചേർക്കുകയും ആവശ്യമില്ലാത്തവ ഒഴിവാക്കുകയും ചെയ്യുക. ഇനി സെറ്റിങ്ങ്സിൽ നിന്ന് പുറത്തു വന്ന് അത് സേവ് ചെയ്യുക. ബിസിബോക്സ് ബിൽഡ് ചെയ്യാനായി make കമാന്റ് ഉപയോഗിക്കുക. അത് പൂർത്തിയായാൽ make install ഉപയോഗിക്കുക. ഇനി ഇൻസ്റ്റാളേഷൻ പ്രിഫിക്സ് ആയി സെറ്റ് ചെയ്ത ഡയറക്ടറിയിൽ പോയി നോക്കിയാൽ അവിടെ bin, sbin, usr എന്നീ ഡയറക്ടറികളും linuxrc എന്ന സോഫ്റ്റ്‌ലിങ്കും കാണാം. bin ഡയറക്ടറിയിൽ busybox ബൈനറി കാണാം. ./bin/busybox എന്ന കമാന്റ് വഴി ഈ പ്രോഗ്രാം എക്സിക്യൂട്ട് ചെയ്യാൻ ശ്രമിച്ചാൽ ഒരു എറർ ആയിരിക്കും ലഭിക്കുക. -bash: ./bin/busybox: cannot execute binary file: Exec format error. എന്തുകൊണ്ടാണ് ഈ എറർ ലഭിക്കുന്നത് എന്ന് ഊഹിക്കാമോ? മറ്റൊരു സിപിയു ആർക്കിട്ടെക്ചറിൽ പ്രവർത്തിക്കാനായി തയ്യാറാക്കപ്പെട്ട ഒരു എക്സിക്യൂട്ടബിൾ ഫയൽ ആണിത്. file  കമാന്റ് ഉപയോഗിച്ച് പരിശോധിച്ചാൽ bin/busybox: ELF 32-bit LSB  executable, ARM, EABI5 version 1 (SYSV), statically linked, for GNU/Linux 2.6.16, stripped എന്ന് കാണാൻ സാധിക്കും. നമ്മുടെ സിസ്റ്റത്തിൽ /bin ഇൽ ഉള്ള ഏതെങ്കിലും ഫയലിനെ ഇങ്ങനെ പരിശോധിച്ചാൽ /bin/ls: ELF 32-bit LSB  executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24 എന്നായിരിക്കും കാണുക. ഈ രണ്ട് ഫയലുകളുടെയും രീതിയിലുള്ള വ്യത്യാസങ്ങൾ മനസ്സിലായിക്കാണുമല്ലോ.

നമ്മുടെ റൂട്ട് ഫയൽ സിസ്റ്റത്തിൽ ആവശ്യമായ പ്രോഗ്രാമുകൾ ചേർത്ത് കഴിഞ്ഞു. പക്ഷേ ഇതു പോര. ഒരു ഡെസ്ക്ടോപ്പ് കമ്പ്യൂട്ടറിലെ റൂട്ട് ഫയൽ സിസ്റ്റം നോക്കിയാൽ അതിൽ നിരവധി ഡയറക്ടറികൾ കാണാൻ സാധിക്കും. അവയിൽ ചിലതൊക്കെ അത്യാവശ്യമാണ്. അതിൽ പ്രധാനപ്പെട്ട ഒന്നാണ് /lib ഡയറക്ടറി. പ്രോഗ്രാമുകൾക്ക് പ്രവർത്തിക്കാൻ ആവശ്യമായ റൺ‌ ടൈം സി ലൈബ്രറികളും കെർണൽ മൊഡ്യൂളുകളും ഒക്കെ ഈ ഡയറക്ടറിയിൽ ആണ് ഉണ്ടായിരിക്കുക. കെർണൽ കമ്പൈൽ ചെയ്യുമ്പോൾ ഏതെങ്കിലും ഓപ്ഷൻ മൊഡ്യൂൾ ആയി ക്രമീകരിച്ചിട്ടുണ്ടെങ്കിൽ കെർണൽ ബിൽഡ് കഴിയുമ്പോൾ മൊഡ്യൂളുകളും കമ്പൈൽ ചെയ്യേണ്ടതുണ്ട്. ഇതിന് make modules കമാന്റ് ഉപയോഗിക്കാം. കെർണൽ സോഴ്സ് ഡയറക്ടറിയിൽ നിന്ന് കെർണൽ കമ്പൈലേഷൻ ക്രമീകരണങ്ങൾ ഒക്കെ ചെയ്ത ശേഷമാണ് ഈ കമാന്റ് നൽകേണ്ടത്. ഇനി export INSTALL_MOD_PATH=<നേരത്തെ തയ്യാറാക്കിയ ഡയറക്ടറീ> എന്ന് കൊടുത്തതിനു ശേഷം make modules_install എന്ന കമാന്റ് നൽകിയാൽ കെർണൽ മൊഡ്യൂളുകൾ ഒക്കെ ഇതിൽ lib/modules/ എന്ന ഡയറക്ടറിയിലേക്ക് കോപ്പി ചെയ്യപ്പെടും. ഷെയേർഡ് ലൈബ്രറികൾ ഉപയോഗിക്കുന്ന പ്രോഗ്രാമുകൾക്ക് പ്രവർത്തിക്കുന്ന സമയത്ത് ഈ ലൈബ്രറികൾ ആവശ്യമാണ്. ബിസിബോക്സ് സ്റ്റാറ്റിക് ആയി ബിൽഡ് ചെയ്തതിനാൽ അതിന് റൺ ടൈം ലൈബ്രറികൾ ഒന്നും ആവശ്യമില്ല. എന്നാലും മറ്റു പ്രോഗ്രാമുകൾക്കായി ഈ ലൈബ്രറികളും ടാർഗറ്റ് ഫയൽ സിസ്റ്റത്തിൽ വേണം. ഈ ലൈബ്രറികൾ നമ്മുടെ ക്രോസ്സ് കമ്പൈലർ ടൂൾ ചെയിനിൽ നിന്ന് കോപ്പി ചെയ്താൽ മതി. ഇതിന് ടൂൾ ചെയിൻ ഇൻസ്റ്റാളേഷൻ പാത്തിൽ പോയി നോക്കുക arm-none-linux-gnueabi/ bin/ lib/ libexec/ share/ എന്നീ ഡയറക്ടറികൾ അവിടെ കാണും. അതിൽ arm-none-linux-gnueabi/libc/lib/ എന്ന ഡയറക്ടറിയിലെ ഫയലുകൾ എല്ലാം കോപ്പി ചെയ്ത് നമ്മുടെ ടാർഗറ്റ് ഡയറക്ടറിയിൽ lib/ എന്ന ഡയറക്ടറിയിൽ ഇടുക. 

ഇനി നമുക്ക് ബാക്കി ഡയറക്ടറികൾ ഉണ്ടാക്കണം. ടാർഗറ്റ് ഡയറക്ടറിയിൽ ചെന്ന് mkdir dev /dev/pts proc sys var var/log etc etc/init.d എന്ന കമാന്റ് ഉപയോഗിക്കുക. കൂടുതൽ ഡയറക്ടറികൾ ചേർക്കണമെങ്കിൽ അവയും ചേർക്കാം. ഇനി കൺസോളിനായി ഒരു ഡിവൈസ് നോഡ് ഉണ്ടാക്കണം. /dev/ ഡയറക്ടറിയിൽ ഉള്ള പ്രത്യേക തരം ഫയലുകൾ ആണ് ഡിവൈസ് നോഡുകൾ. mknod കമാന്റ് ഉപയോഗിച്ചാണ് ഇവ ഉണ്ടാക്കേണ്ടത്. ഇതിനായി mknod dev/console c 5 1 എന്ന കമാന്റ് നൽകുക. c കാരക്റ്റർ സ്പെഷ്യൽ ഫയലിനെയും 5 മേജർ നമ്പറിനെയും 1 മൈനർ നമ്പറിനെയും സൂചിപ്പിക്കുന്നു.

ഇനി വേണ്ടത് സിസ്റ്റം ബൂട്ട് ചെയ്യുമ്പോൾ എങ്ങനെ പെരുമാറണമെന്നും മറ്റും ക്രമീകരിക്കാനായുള്ള ഫയലുകൾ തയ്യാറാക്കുകയാണ്. ഈ ഫയലുകൾ etc ഡയറക്ടറീയിൽ ആണ് ഉണ്ടാവുന്നത്. ആദ്യം ബൂട്ടിങ്ങ് സമയത്ത് ഏതൊക്കെ ഫയൽ സിസ്റ്റങ്ങൾ മൗണ്ട് ചെയ്യണ്ടം എന്ന് ക്രമീകരിക്കുന്ന fstab ഫയൽ ഉണ്ടാക്കാം.  <file system> <mount point>   <type>  <options> <dump>  <pass> എന്നിങ്ങനെ ആണ് ഈ ഫയലിലെ ഓരോ വരികളിലും വിവരങ്ങൾ ക്രമീകരിക്കേണ്ടത്. ഒരു ടെക്സ്റ്റ് എഡിറ്ററിൽ etc/fstab എന്ന ഫയൽ ഉണ്ടാക്കി അതിൽ ചുവടെ ഉള്ള വരികൾ ചേർക്കുക.
proc     /proc     proc     defaults     0     0
none     /dev/pts     devpts     mode=0622     0     0
യൂസർ ലോഗിൻ യൂട്ടിലിറ്റികൾക്കായി താഴെപ്പറയുന്ന ഫയലുകൾ തയ്യാറാക്കി അതിൽ അവയോടൊപ്പം നൽകിയിരിക്കുന്ന വിവരങ്ങൾ ചേർക്കുക.
etc/group ഇൽ root:x:0:root
etc/passwd ഇൽ root::0:0:root:/root:/bin/ash 
etc/hosts ഇൽ 127.0.0.1     localhost
ഈ ഫയലുകളെപ്പറ്റി ഉള്ള വിവരങ്ങൾ മാനുവൽ പേജുകളിൽ ലഭ്യമാണ്. ഒന്നിലധികം യൂസർമാർ, ഗ്രൂപ്പുകൾ, പാസ്സ്വേർഡ് എന്നിവ വരുമ്പോൾ ഈ ഫയലുകൾ ഇനിയും സങ്കീർണ്ണമാകും. നിങ്ങളുടെ സിസ്റ്റത്തിൽ ഉള്ള ഇതേ ഫയലുകൾ തുറന്ന് നോക്കിയാൽ ഒരു ഏകദേശ രൂപം കിട്ടും. 

കെർണൽ അതിന്റെ പ്രാഥമികമായ ക്രമീകരണങ്ങൾ എല്ലാം പൂർത്തിയാക്കിയ ശേഷം ഇനിറ്റ് പ്രോഗ്രാമിനെ പ്രവർത്തിപ്പിക്കും. പിന്നെ അങ്ങോട്ടുള്ള കാര്യങ്ങളുടെ എല്ലാം നിയന്ത്രണം ഇനിറ്റ് പ്രോഗ്രാമിനായിരിക്കും. നമ്മുടെ ഫയൽ സിസ്റ്റത്തിലെ ഇനിറ്റ് പ്രോഗ്രാം /sbin/init ആണ്. ഈ ബിസിബോക്സ് ഇനിറ്റ് പ്രോഗ്രം etc/inittab എന്ന ഫയലിൽ നിന്നാണ് അതിന്റെ ക്രമീകരണങ്ങൾ വായിക്കുന്നത്. സിസ്റ്റം സ്റ്റാർട്ട് ചെയ്യുമ്പോളും ഷട്ട് ഡൗൺ ചെയ്യുമ്പോളും ഒക്കെ എന്തൊക്കെ ചെയ്യണം എന്നും ഓരോ റൺ ലെവലിലും എന്ത് കാര്യങ്ങളാണ് ചെയ്യണ്ടത് എന്നും ഒക്കെയുള്ള വിവരങ്ങൾ ഈ ഫയലിൽ കാണും. ഈ ഫയലുകൾ മിക്കവാറും വളരെ സങ്കീർണ്ണമായവ ആയിരിക്കും. ചുവടെ കൊടുത്തിരിക്കുന്ന ഫയൽ അത്യാവശ്യം വേണ്ട കാര്യങ്ങൾ മാത്രം ചെയ്യുന്നു. etc/inittab

::sysinit:/etc/init.d/rcS 
# /bin/ash
#
# സീരിയൽ കൺസോളിൽ ഒരു ഷെൽ പ്രോഗ്രാം ആരംഭിക്കുക
console::askfirst:-/bin/ash
# ഇനിറ്റ് പ്രോഗ്രാം റീസ്റ്റാർട്ട് ചെയ്യപ്പെട്ടാൽ ചെയ്യേണ്ടത്
::restart:/sbin/init
# റീബൂട്ടിങ്ങ് സമയത്തും CTRL+ALT+Delete കീ അമർത്തപ്പെടുന്ന സമയത്തും ചെയ്യേണ്ടത്
::ctrlaltdel:/sbin/reboot
::shutdown:/bin/umount -a -r

ഇതിൽ ആദ്യത്തെ വരിയിൽ പറഞ്ഞിരിക്കുന്ന sysinit ഉള്ള ലൈൻ /etc/init.d/rcS എന്ന ഷെൽ സ്ക്രിപ്റ്റ് സിസ്റ്റം സ്റ്റാർട്ടപ്പിൽ റൺ ചെയ്യണം എന്നാണ് പറയുന്നത്. പ്രവർത്തനമാരംഭിക്കുമ്പോൾ ചെയ്യേണ്ട കാര്യങ്ങൾ ഒക്കെ നമുക്ക് etc/init.d/rcS എന്ന സ്ക്രിപ്റ്റ് ഫയലിൽ തന്നെ ചേർക്കാം. താഴെക്കൊടുത്തിരിക്കുന്ന കാര്യങ്ങൾ ഈ ഫയലിൽ ചേർക്കുക.

#!/bin/sh 

HOSTNAME="MyLinuxSystem"
hostname $HOSTNAME

# Prints execution status.
status ()
{
    if [ $1 -eq 0 ] ; then
        echo "[SUCCESS]"
    else
        echo "[FAILED]"
    fi
}

# Print some messages
echo ""
echo "    Kernel release : `uname -s` `uname -r`"
echo ""

# Mount /proc
echo -n " Mounting /proc             : "
mount -n -t proc /proc /proc
status $? 1

# Mount /sys
echo -n " Mounting /sys              : "
mount -n -t sysfs sysfs /sys
status $? 1

# Mount /dev
echo -n " Mounting /dev              : "
mount -n -t tmpfs mdev /dev
status $? 1

# Set /sbin/mdev as hotplug handler
echo -n " Enabling hot-plug          : "
echo "/sbin/mdev" > /proc/sys/kernel/hotplug
status $? 0

mdev -s
status $? 0

echo -n " Mounting other filesystems : "
mount -a
status $? 0

# Set PATH
export PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin

# Start programs
echo -n " Starting syslogd           : "
/sbin/syslogd
status $? 0

echo ""
echo "System initialization now complete"
echo "" 

സിസ്റ്റം പ്രവർത്തിക്കാൻ അത്യാവശ്യം വേണ്ട കാര്യങ്ങൾ മാത്രമേ ഇതിൽ ചെയ്യുന്നുള്ളു. കൂടുതൽ കാര്യങ്ങൾ ആവശ്യമാണെങ്കിൽ അവയും ചേർക്കാവുന്നതാണ്. ഇവിടെ ഹോട്ട് പ്ലഗ് മാനേജർ ആയി /sbin/mdev എന്ന പ്രോഗ്രാം സെറ്റ് ചെയ്തിട്ടുണ്ട്. /dev/ ഡയറക്ടറിയിൽ വേണ്ട മറ്റു ഫയലുകളെ കൈകാര്യം ചെയ്യാൻ ഈ പ്രോഗ്രാമിന് ആവശ്യമായ ക്രമീകരണങ്ങൾ etc/mdev.conf എന്ന ഫയലിൽ ചേർക്കണം. ഓരോ ഫയലുകളും നിർമ്മിക്കപ്പെടുമ്പോൾ അവയുടെ അനുവാദങ്ങൾ എന്തായിരിക്കണം എന്ന് ചേർത്തിരിക്കുന്നു.
console     0:5 0600
nfs         0:5 0770
null        0:0 0777
rtc         0:0 0666
tty         0:5 0660
tty0*       0:5 0660
tty1*       0:5 0660
tty2*       0:5 0660
tty3*       0:5 0660
tty4*       0:5 0660
tty5*       0:5 0660
tty6*       0:5 0660
ttyS*       0:5 0640
ttyAMA*     0:5 0640
urandom     0:0 0444
zero        0:0 0666
ഇപ്പോ അത്യാവശ്യമുള്ള ഫയലുകൾ ഒക്കെ ആയി. ഇനി ഈ ഡയറക്ടറി സ്ട്രക്ചറിനെ മൊത്തം ഒരു ഡിസ്ക് ഇമേജ് ആക്കി മാറ്റണം. എന്നിട്ട് ആ ഇമേജിനെ ഒരു റാംഡിസ്ക് ഇമേജ് ആയി കെർണലിനു നൽകാം. റാംഡിസ്ക് ഇമേജുകൾ cpio ആർക്കൈവുകൾ ആയിട്ടാണ് ഇപ്പോൾ തയ്യാറാക്കപ്പെടുന്നത്. ഈ ഇമേജുകൾ മെമ്മറിയിൽ നിന്ന് തന്നെ ഒരു ഡിസ്ക് പോലെ പ്രവർത്തിക്കും. പക്ഷേ അതിലേക്ക് എഴുതപ്പെടുന്നത് ഒന്നും സിസ്റ്റം റീസ്റ്റാർട്ട് ചെയ്തു കഴിഞ്ഞാൽ അവിടെ ഉണ്ടാകില്ല. റാംഡിസ്കിനു പകരം ഒരു ഡിസ്ക് ഇമേജ് ഉപയോഗിക്കുന്നത് എങ്ങനെ എന്നും റാം ഡിസ്കുകൾ എന്തിന് ഉപയോഗിക്കുന്നു എന്നും വിശദമായി പിന്നീട് എഴുതാം. റാംഡിസ്ക് ഇമേജ് ഉണ്ടാക്കുന്നതിനായി നമ്മൾ ഉണ്ടാക്കിയ ഡയറക്ടറിയിലെ ഫയലുകൾ ഓരോന്നും cpio കമാന്റുപയോഗിച്ച് ആർക്കൈവ് ചെയ്ത് ആ ഇമേജിനെ gzip ഉപയോഗിച്ച് കമ്പ്രസ്സ് ചെയ്യുകയാണ് വേണ്ടത്. ഇതിനായി ഡയറക്ടറിയിൽ നിന്നും ഈ കമാന്റ് ഉപയോഗിക്കാം.
find . | cpio --quiet -H newc -o | gzip -9 -n > ../ramdisk.img
ഇനി ഡയറക്ടറിയിൽ നിന്നും പുറത്ത് വന്നാൽ അവിടെ ramdisk.img എന്ന ഫയൽ കാണാൻ സാധിക്കും.
ഇപ്പോൾ ടാർഗറ്റ് ഡിവൈസിനായുള്ള കെർണൽ ഇമേജും റാംഡിസ്ക് ഇമേജും തയ്യാറായി. സാധാരണഗതിയിൽ ഇവ ടാർഗറ്റ് ഡിവൈസിൽ ഫ്ലാഷ് ചെയ്യുകയോ നെറ്റ്‌വർക്ക് ഫയൽ സിസ്റ്റം വഴി അതിൽ ലഭ്യമാക്കുകയോ ഒക്കെയാണ് ചെയ്യുന്നത്. നമുക്ക് qemu ഇമുലേറ്റർ ഉപയോഗിച്ച് ഇവയെ എങ്ങനെ പ്രവർത്തിപ്പിച്ച് നോക്കാം എന്ന് അടുത്ത ഭാഗത്തിൽ പരിശോധിക്കാം.

സ്റ്റാർട്ടപ്പ് സ്ക്രിപ്റ്റുകൾക്ക് നന്ദി: http://processors.wiki.ti.com/index.php/Creating_a_Root_File_System_for_Linux_on_OMAP35x

1 comment:

  1. Good Blog.. Great Effort.. Wish you all the best

    ReplyDelete