Friday, August 15, 2014

ലിനക്സ് കെർണൽ കമ്പൈലേഷൻ ഭാഗം -2

കെർണൽ കമ്പൈലേഷന് മുൻപേ കമ്പൈൽ ചെയ്യാനുള്ള പ്ലാറ്റ്‌‌ഫോമിനായുള്ള കോൺഫിഗ് ഫയൽ തയ്യാറാക്കേണ്ടതുണ്ട് എന്ന് കഴിഞ്ഞ ഭാഗത്തിൽ പറഞ്ഞിരുന്നല്ലോ. നിലവിലുള്ള പ്ലാറ്റ്‌‌ഫോമുകളിൽ മിക്കതിനും കെർണലിനുള്ളിൽ തന്നെ ഒരു മൂല‌‌ക്രമീകരണം ലഭ്യമായിരിക്കും. ഡെഫ്‌‌കോൺഫിഗ് ഫയലുകൾ എന്ന ചുരുക്കപ്പേരിൽ അറിയപ്പെടുന്ന ഇവ കെർണൽ സോഴ്സ് കോഡിലെ arch/<arch>/configs എന്ന ഡയറക്ടറിയിൽ ലഭ്യമായിരിക്കും. ഉദാഹരണത്തിന് നമ്മുടെ ഡെസ്ക്ടോപ്പ് കമ്പ്യൂട്ടറുകളിലും മറ്റും ഉപയോഗിച്ചിരിക്കുന്ന x86 എന്ന ആർക്കിട്ടെക്ചറിന്റെ ഡെഫ്‌‌കോൺഫിഗ് ഫയലുകൾ arch/x86/configs/ എന്ന ഡയറക്ടറിയിൽ കാണാം. ഒരു 32 ബിറ്റ് പ്രോസസ്സറിനായി കെർണൽ കമ്പൈൽ ചെയ്യുമ്പോൾ i386_defconfig എന്ന ഫയലും 64 ബിറ്റ് പ്രോസസ്സറിനായി കെർണൽ കമ്പൈൽ ചെയ്യുമ്പോൾ x86_64_defconfig എന്ന ഫയലും ആണ് ഉപയോഗിക്കേണ്ടത്. ഉപയോഗിച്ചുകൊണ്ടിരിക്കുന്ന കമ്പ്യൂട്ടറിനായി അതിൽ നിന്നു തന്നെ കെർണൽ കമ്പൈൽ ചെയ്യുന്നത് താരതമ്യേന എളുപ്പമുള്ള കാര്യമാണ്. അതിനായി ചെയ്യേണ്ട കാര്യങ്ങൾ ചുവടേ.

ഒരു ഉബുണ്ടു സിസ്റ്റത്തിൽ കെർണൽ കമ്പൈൽ ചെയ്ത് തുടങ്ങുന്നതിനു മുന്നേ ചില പാക്കേജുകൾ ഇൻസ്റ്റാൾ ചെയ്യേണ്ടതുണ്ട്. sudo apt-get install git-core libncurses5 libncurses5-dev libelf-dev build-essential എന്ന കമാന്റുപയോഗിച്ച് ആവശ്യമായ പാക്കേജുകൾ ഇൻസ്റ്റാൾ ചെയ്യാം.
1. കെർണൽ സോഴ്സ് കോഡ് ഡൗൺലോഡ് ചെയ്യുക
ഇതിനായി https://www.kernel.org/ ഇൽ ചെന്ന് എച്റ്റിറ്റിപി, എഫ്റ്റിപി, ആർസിങ്ക് പ്രോട്ടോക്കോളുകൾ ഉപയോഗിച്ചോ https://git.kernel.org/cgit/ ഇൽ നിന്ന് ഗിറ്റ് ഉപയോഗിച്ചോ കെർണൽ സോഴ്സ് ഡൗൺലോഡ് ചെയ്യാം. ആദ്യത്തെ രീതിയിൽ ഡൗൺലോഡ് ചെയ്യുമ്പോൾ കമ്പ്രസ്സ് ചെയ്ത ആർക്കൈവ് ഫയലുകൾ ആയിട്ടായിരിക്കും കെർണൽ സോഴ്സ് ലഭിക്കുന്നത്. അങ്ങനെ ആണെങ്കിൽ ടെർമിനലിൽ നിന്നും tar xf കമാന്റുപയോഗിച്ച് ആർക്കൈവിനെ വേർതിരിച്ചെടുക്കാം. ഉദാഹരണത്തിന്:‌ tar xf linux-3.16.1.tar.xz ഈ കമാന്റിനു ശേഷം linux-3.16.1 എന്ന ഡയറക്ടറി കറന്റ് ഡയറക്ടറിയിൽ കാണാം. ഈ ഡയറക്ടറിയിലേക്ക് വർക്കിങ്ങ് ഡയറക്ടറി മാറ്റുക. (cd linux-3.16.1)

2. ഒരു കോൺഫിഗ് ഫയൽ തെരഞ്ഞെടുക്കുക
ഇപ്പോൾ ഉപയോഗിക്കുന്ന സിസ്റ്റത്തിനായുള്ള ഡിഫാൾട്ട് കോൺഫിഗ് ഫയൽ തെരഞ്ഞെടുക്കാൻ എളുപ്പമാണ്. നിലവിലെ സിസ്റ്റം ടൈപ്പ് ഒക്കെ ഓട്ടോമാറ്റിക്കായി കണ്ടെത്തി ഒരു കോൺഫിഗ് ഫയൽ സെറ്റ് ചെയ്യാൻ make defconfig എന്ന കമാന്റ് ഉപയോഗിക്കാം. ചിത്രത്തിൽ കാണുന്നത് പോലെ ഒരു ഔട്ട്പുട്ട് കാണാൻ സാധിക്കും.
make defconfig
എന്റെ കമ്പ്യൂട്ടർ ഇപ്പോൾ പ്രവർത്തിക്കുന്നത് ഉബുണ്ടു 14.04 32 ബിറ്റ് വേർഷനിൽ ആണ്. അതിനാൽ i386_defconfig തെരഞ്ഞെടുക്കപ്പെട്ടതായി കാണാം. ഇനി 64 ബിറ്റ് വേർഷൻ ആണ് ഉപയോഗിക്കണ്ടതെങ്കിൽ കമാന്റ് make defconfig നു പകരം make x86_64_defconfig എന്ന കമാന്റ് ഉപയോഗിക്കാം. ഡെഫ്‌‌കോൺഫിഗ് ഫയലിന്റെ പേരാണ് make കമാന്റിനു ശേഷം ഉപയോഗിച്ചത് എന്ന് ശ്രദ്ധിക്കുമല്ലോ.

3. കെർണൽ കോൺഫിഗറേഷനിൽ മാറ്റങ്ങൾ ആവശ്യമാണെങ്കിൽ അത് ചെയ്യുക
ഇതിനായി ഒന്നിലധികം രീതികൾ ലഭ്യമാണ്. പുതിയ കെർണൽ വേർഷൻ പിന്തുണക്കുന്നവയുടെ ലിസ്റ്റ്:
  config          - Update current config utilising a line-oriented program
  nconfig         - Update current config utilising a ncurses menu based program
  menuconfig      - Update current config utilising a menu based program
  xconfig         - Update current config utilising a QT based front-end
  gconfig         - Update current config utilising a GTK based front-end
  oldconfig       - Update current config utilising a provided .config as base
  localmodconfig  - Update current config disabling modules not loaded
  localyesconfig  - Update current config converting local mods to core
  silentoldconfig - Same as oldconfig, but quietly, additionally update deps
  defconfig       - New config with default from ARCH supplied defconfig
  savedefconfig   - Save current config as ./defconfig (minimal config)
  allnoconfig     - New config where all options are answered with no
  allyesconfig    - New config where all options are accepted with yes
  allmodconfig    - New config selecting modules when possible
  alldefconfig    - New config with all symbols set to default
  randconfig      - New config with random answer to all options
  listnewconfig   - List new options
  olddefconfig    - Same as silentoldconfig but sets new symbols to their default value 


(make help എന്ന കമാന്റുപയോഗിച്ച് ഇത് കാണാൻ സാധിക്കും)

make കമാന്റിനൊപ്പം ഇതിലൊന്ന് ഉപയോഗിച്ച് കോൺഫിഗറേഷനിൽ മാറ്റങ്ങൾ വരുത്താം. xconfig, gconfig എന്നിവയിൽ മൗസും മറ്റും ഉപയോഗിച്ച് ആവശ്യമായവ തെരഞ്ഞെടുക്കാം. ഇതിനായി കൂടുതൽ പാക്കേജുകളും ഇൻസ്റ്റാൾ ചെയ്യേണ്ടതുണ്ട്. ncurses അടിസ്ഥാനമാക്കിയ മെനു അധിഷ്ഠിത menuconfig ടെർമിനലിൽ തന്നെ ഉപയോഗിക്കാവുന്ന ഒന്നാണ്. ഇതിനായി make menuconfig എന്ന കമാന്റ് ഉപയോഗിക്കുക.
പ്രധാന പേജ്
ഫയൽ സിസ്റ്റങ്ങൾ
മെനുകോ‌‌ൺഫിഗ് കമാന്റ് ഉപയോഗിക്കുമ്പോൾ ചിത്രത്തിൽ കാണുന്നത് പോലുള്ള മെനു ലഭിക്കും. ആരോ കീ ഉപയോഗിച്ച് മെനുവിലെ വ്യത്യസ്ത ഓപ്ഷനുകൾ തെരഞ്ഞെടുക്കാം. * എന്ന് അടയാളപ്പെടുത്തിയിരിക്കുന്നവ കെർണലിൽ സ്റ്റാറ്റിക്ക് ആയും M എന്ന് അടയാളപ്പെടുത്തിയവ മൊഡ്യൂൾ ആയും ആയിരിക്കും ബിൽഡ് ചെയ്യുക. അല്ലാത്തവ ഉൾപ്പെടുത്തില്ല. ---> കാണുന്നവയിൽ വച്ച് എന്റർ അമർത്തിയാൽ അതിലെ സബ് മെനു ലഭിക്കും. സ്പേസ് കീ ഉപയോഗിച്ച് M * [] ഓപ്ഷനുകൾ അടയാളപ്പെടുത്താം. അല്ലെങ്കിൽ * ലഭിക്കാൻ y, മൊഡ്യൂൾ ആയി ഉൾപ്പെടുത്താൻ M, ഒഴിവാക്കാൻ N എന്നീ ബട്ടണുകളും ഉപയോഗിക്കാം. കോൺഫിഗറേഷൻ സേവ് ചെയ്ത ശേഷം എക്സിറ്റ് ഓപ്ഷൻ തെരഞ്ഞെടുത്ത് ഈ പ്രോഗ്രാമിൽ നിന്ന് പുറത്ത് വരാം.

4. കെർണൽ ബിൽഡ് ചെയ്യുക
ഇതിനായി make കമാന്റ് ഉപയോഗിക്കാം. മേക്ക് പ്രോഗ്രാമിന് ഒന്നിലധികം ത്രെഡുകൾ ആയി പ്രവർത്തിക്കാൻ സാധിക്കും. സ്വതന്ത്രമായ ഫയലുകളെ ഒരേ സമയം വെവ്വേറെ കമ്പൈൽ ചെയ്യാൻ സാധിക്കും. ഇതുവഴി ഒരുപാട് സമയം ലാഭിക്കാൻ കഴിയും. കെർണൽ ബിൽഡ് ചെയ്യുമ്പോൾ നൂറുകണക്കിനു ഫയലുകൾ കമ്പൈൽ ചെയ്യേണ്ടതുണ്ട് എന്ന് ഓർക്കണം. എത്ര ത്രെഡുകൾ പ്രവർത്തിപ്പിക്കണം എന്നത് നിർദ്ദേശിക്കാനായി -j ഓപ്ഷൻ ഉപയോഗിക്കാം. രണ്ട് സി പി യു ഉള്ള ഒരു സിസ്റ്റത്തിൽ 2 ത്രെഡുകൾ ഉപയോഗിക്കാം. ആകെ ലഭ്യമായ സി പി യുകളുടെ എണ്ണം മനസ്സിലാക്കാൻ cat /proc/cpuinfo എന്ന കമാന്റ് ഉപയോഗിക്കാം. 4 സി പി യുകൾ ഉണ്ടെങ്കിൽ make -j4 എന്ന് ഉപയോഗിക്കാവുന്നതാണ്.

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

6. ബിൽഡ് ചെയ്ത കെർണൽ ഇമേജ് ഇൻസ്റ്റാൾ ചെയ്യുക
സൂപ്പർ യൂസർ ആയി make install കമാന്റ് ഉപയോഗിച്ച് ഇത് ചെയ്യാം. sudo make install എന്നായിരിക്കും മുഴുവൻ കമാന്റ്. അല്ലെങ്കിൽ ബിൽഡ്‌ പൂർണ്ണമായ ശേഷം arch/x86/boot/bzImage അല്ലെങ്കിൽ zImage തുടങ്ങിയ കമ്പ്രസ്സ് ചെയ്ത കെർണൽ ഇമേജുകളോ vmlinux എന്ന കമ്പ്രസ്സ് ചെയ്യാത്ത കെർണൽ ഇമേജോ /boot ഡയറക്റ്ററിയിലേക്ക് കോപ്പി ചെയ്ത ശേഷം ബൂട്ട് ലോഡറിന്റെ കോൺഫിഗറേഷൻ ഫയലിൽ ഈ ഇമേജിന്റെ പാത്ത് ചേർത്താലും മതി.

കമ്പ്യൂട്ടർ റീസ്റ്റാർട്ട് ചെയ്യുമ്പോൾ ബൂട്ട് ലോഡറിൽ നിന്ന് പുതിയ കെ‌‌ർണൽ ഇമേജ് തെരഞ്ഞെടുത്ത് അത് ബൂട്ട് ചെയ്ത് ടെസ്റ്റ് ചെയ്യാം.

ഇനി ഇപ്പോൾ ഉപയോഗിക്കുന്ന കമ്പ്യൂട്ടറിനല്ലാതെ മറ്റൊരു ആർക്കിട്ടെക്ചറിൽ ഉള്ള മറ്റൊരു ഉപകരണത്തിനായി കെർണൽ കമ്പൈൽ ചെയ്യുന്ന രീതി നോക്കാം. ക്രോസ്സ് കമ്പൈലേഷൻ എന്നാണ് ഈ രീതിയുടെ പേര്. ഫോണുകളിലും മറ്റും ഉപയോഗിക്കുന്ന കെർണലുകൾ അവയിൽ തന്നെ കമ്പൈൽ ചെയ്യാൻ സാധിക്കില്ലല്ലോ. അപ്പോൾ മറ്റൊരു കമ്പ്യൂട്ടർ തന്നെ ഉപയോഗിക്കണം. ഇതിനെപ്പറ്റി അടുത്ത ഭാഗത്തിൽ.