Sunday, December 12, 2021

സെക്യൂർ ബൂട്ട്: MOK - മെഷീൻ ഓണർ കീ

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

ഈ കീകളും മൊഡ്യൂൾ സൈനിങ്ങും ഒക്കെ ക്രമീകരിക്കാനുള്ള നിരവധി‌‌ ഗൈഡുകൾ ലഭ്യമാണെങ്കിലും കൺവീനിയന്റായി വർക്ക് ചെയ്യിക്കാൻ വിഷമമണ്. മിക്ക ഗൈഡൂകളും പാസ്സ്ഫ്രേസുള്ള സൈനിങ്ങ് കീകൾ ആണ് സെറ്റപ്പ് ചെയ്യുന്നത്. അതുകൊണ്ട് ഓരോ തവണയും സൈൻ ചെയ്യാൻ പാസ്സ്‌വേർഡ് വേണം. ബാക്ക് ഗ്രൗണ്ടിൽ കമ്പൈലേഷനൊക്കെ നടക്കുന്ന കേസുകളിൽ, ലൈക്ക് കെർണൽ അപ്ഡേറ്റ്, എൻവിഡിയ ഡ്രൈവർ ഇൻസ്റ്റാളേഷൻ ഒക്കെ, ബിൽഡ് പരാജയപ്പെടാനും സ്റ്റക്ക് ആവാനും ഒക്കെ ഇത് കാരണമാകുകയും ചെയ്യും.

ഇതെല്ലാം പരിഗണിച്ച് രണ്ട് ദിവസം കുത്തിയിരുന്ന് ഉബുണ്ടു ഇതെങ്ങനെ ആണ് ചെയ്യുന്നത് എന്ന് മനസ്സിലാക്കി അതേ രീതിയിൽ കീ സെറ്റപ്പ് ചെയ്തു. എന്നാപ്പിനെൻ അതൊന്ന് ഡോക്യുമെൻ്റ് ചെയ്തേക്കാമെന്നും കരുതി. ഇത് ഡെബിയനിൽ മാത്രമല്ല, യു ഇ എഫ് ഐ സെക്യൂർ ബൂട്ട് എനേബിൾ ചെയ്തിരിക്കുന്ന ഏത് സിസ്റ്റത്തിലും പറ്റും.

ആദ്യമായി സെക്യൂർ ബൂട്ട് സെറ്റപ്പിനെ പറ്റി ഒരു പാരഗ്രാഫ്. യു ഇ എഫ് ഐ സെക്യൂർ ബൂട്ട് എനേബിൾഡായ സിസ്റ്റങ്ങളിൽ സൈൻഡ് ആയ ഓപ്പറേറ്റിങ്ങ് സിസ്റ്റങ്ങൾ മാത്രമേ ബൂട്ട് ചെയ്യാൻ പറ്റൂ. ഈ സിഗ്നേച്ചർ വെരിഫിക്കേഷനായുള്ള കീകൾ യു ഇ എഫ് ഐ ഫേംവെയറിൽ ആണ് ഉണ്ടായിരിക്കുന്നത്. ഓരോ ഓ ഇ എമ്മുകളും അവരുടെ കീകളും മൈക്രോസോഫ്റ്റിൻ്റെ കീകളും ഒക്കെ ഇതുപോലെ ഫേംവെയറിൽ ഉൾക്കൊള്ളിച്ചിരിക്കും. അതുകൊണ്ട് ഓ ഇ എം ഒപ്പിട്ട മൊഡ്യൂളുകളും മൈക്രോസോഫ്റ്റ് ഒപ്പിട്ട മൊഡ്യൂളുകളും ഒക്കെയേ ആ ഉപകരണങ്ങളിൽ ബൂട്ട് ചെയ്യാൻ പറ്റൂ. അപ്പോ ലിനക്സും മറ്റ് ഓപ്പറേറ്റിങ്ങ് സിസ്റ്റങ്ങളുമോ? അവർ തങ്ങളുടെ കീകൾ ഒന്നുകിൽ യു ഇ എഫ് ഐ ഫേംവെയറിൽ ഉൾപ്പെടുത്തണം. അല്ലെങ്കിൽ ഓ ഇ എമ്മുകളോടോ മൈക്രോസോഫ്റ്റിനോടോ തങ്ങളുടെ ഓപ്പറേറ്റിങ്ങ് സിസ്റ്റം ഇമേജുകൾ സൈൻ ചെയ്ത് തരാൻ പറയണം. ഓരോ പുതിയ കെർണൽ ഇമേജും റിലീസും ഇങ്ങനെ സൈൻ ചെയ്യാൻ പറ്റില്ല. അപ്പോൾ ചെയ്യുന്നത് മൈക്രോസോഫ്റ്റിനെക്കൊണ്ട് ഷിം (shim) യു ഇ എഫ് ഐ ഇമേജ് സൈൻ ചെയ്ത് വാങ്ങുകയാണ്. ഷിം ഇമേജിൽ കെർണൽ ഇമേജ് സൈൻ ചെയ്യാൻ ഉപയോഗിച്ച കീ ഉണ്ടാകും. സിസ്റ്റം ബൂട്ട് ചെയ്യുമ്പോൾ ആദ്യം യു ഇ എഫ് ഐ ഫേംവെയർ അതിലുള്ള കീ ഉപയോഗിച്ച് ഷിം സിഗ്നേച്ചർ വെരിഫൈ ചെയ്യും. എന്നിട്ട് ഷിമ്മിനെ ഓടാൻ സമ്മതിക്കും. ഷിം അതിലുള്ള കീ ഉപയോഗിച്ച് ഗ്രബ് ഇമേജ് വെരിഫൈ ചെയ്യും. എന്നിട്ട് ഗ്രബ്ബിൻ്റെ ഓടാൻ സമ്മതിക്കും. ഗ്രബ് കെർണൽ ഇമേജ് വായിച്ചെടുത്തിട്ട് ഷിമ്മിനോട് അതിനെ വാലിഡേറ്റ് ചെയ്യാൻ പറയും. ഷിം ഓകെ പറഞ്ഞാൽ ഗ്രബ് അതിനെ ഓടിക്കും.

ഇതുവരെ എല്ലാം ഓകെ, പക്ഷേ ഡെബിയനും ഫെഡോറയും ഒക്കെ കെർണൽ സൈൻ ചെയ്യാൻ ഉപയോഗിച്ച കീ അവരുടെ കയ്യിലല്ലേ ഉള്ളു. അത് ഡപ്പിയിൽ ഇരിക്കുന്നു. എനിക്ക് കിട്ടില്ല. അപ്പോ ഞാനൊരു കെർണൽ കമ്പൈൽ ചെയ്താൽ, അല്ലെങ്കിൽ ഒരു മൊഡ്യൂൾ ലോക്കലായി ബിൽഡ് ചെയ്താൽ എന്ത് ചെയ്യും? അത് ഓടില്ല. പക്ഷേ ഞാൻ കാശുകൊടുത്ത് വാങ്ങിയ കമ്പ്യൂട്ടറല്ലേ, എനിക്കൊരു വെലയുമില്ലേ! വെൽ, യു ഇ എഫ് ഐ സ്പെസിഫിക്കേഷനിൽ അതിനുള്ള വഴിയുണ്ട്. 

മൊതലാളി ഓവർ റൈഡ് അഥവാ മെഷീൻ ഓണർ കീ. (എം ഓ കെ).

ഞാൻ ഒരു കീ ക്രിയേറ്റ് ചെയ്യുന്നു. അനന്തരം ഞാൻ യു ഇ എഫ് ഐ ഫേംവെയറിനോട് പറയുന്നു,

“ഇത് എൻ്റെ കീ ആകുന്നു. ഇതിനെ നീ നിൻ്റെ മാറിലേയ്ക്ക് സ്വീകരിയ്ക്കുക, ഇനിവരുന്ന മൊഡ്യൂളുകൾ ഈ കീ കൊണ്ട് ഒപ്പിട്ടവയാണെങ്കിൽ അവയെ ഓടാൻ വിടുക”,

അപ്പോ ഫേംവെയർ ചോദിക്കും, “മൊതലാളീ, ഈ കീ മൊതളാളി ഉണ്ടാക്കിയ കീ തന്നെയാണോന്ന് ഞാനെങ്ങനെ ഉറപ്പിക്കും?”

അതിനിപ്പോ എന്ത് ചെയ്യും? കീ എൻറോൾ ചെയ്യുമ്പോ ഞാനൊരു പാസ്സ്‌വേർഡ് സെറ്റ് ചെയ്യും. അടുത്ത തവണ മെഷീൻ ഓണാക്കുമ്പോ ഫേം വെയർ ചോദിക്കും, “മൊതലാളീ, കീയൊരെണ്ണം വന്നിട്ടൊണ്ട്. ഞാൻ എടുക്കണോന്ന്”

അപ്പ ഞാൻ എടുക്കണന്ന് പറയും. അപ്പോ ഫേംവെയർ എന്നോട് എന്നാപ്പിന്നെ ആ പാസ്സ്‌വേർഡ് ഒന്ന് പറഞ്ഞേന്ന് പറയും. ഞാൻ പറയും. അതോടെ മോക് കീ എൻറോൾ ചെയ്യപ്പെടും. ഇനി എനിക്ക് മോക് കീ കൊണ്ട് എന്തും ഒപ്പിടാം. ആരും പരാതി പറയില്ല. എൻ്റെ കീ, എൻ്റെ മെഷീൻ.

മെഷീൻ ഓണർ കീയും ഡി കെ എം എസ് വഴിയുള്ള ഓട്ടോമാറ്റിക്ക് സൈനിങ്ങും എങ്ങനെ ക്രമീകരിക്കാം എന്നതിനെ പറ്റി:

ഉബുണ്ടുവിലെ shim-signed പാക്കേജിൽ update-secureboot-policy എന്നൊരു സ്ക്രിപ്റ്റ് ഉണ്ട്. ഡെബിയനിലെയും മറ്റും update-secureboot-policy യിൽ പുതിയ കീ തുടങ്ങിയ ഓപ്ഷനുകൾ ഇല്ല. ആകെ സെക്യൂർ ബൂട്ട് എനേബിൾ അല്ലെങ്കിൽ ഡിസേബിൾ ചെയ്യാനുള്ള ഓപ്ഷനുകളേ ഉള്ളു. എളുപ്പത്തിൽ ചെയ്യാവുന്ന കാര്യം, packages.ubuntu.com ഇൽ പോയി shim-signed പിന്നെ dkms എന്നിവയുടെ സോഴ്സ് ഡൗൺലോഡ് ചെയ്യുക. ഈ കമാൻ്റുകൾ ഒക്കെ ബാഷ് സ്ക്രിപ്റ്റുകൾ ആണ്. അവ വച്ച് നിങ്ങളുടെ സിറ്റത്തിൽ നിലവിലുള്ള അതേ ഫയലുകൾ റീപ്ലേസ് ചെയ്യുക, അല്ലെങ്കിൽ ചില്ലറ പണികൾ മാനുവലായി ചെയ്യുക.

ആദ്യമായി റൂട്ട് ആവുക

sudo -i
സിസ്റ്റത്തിലെ dkms കമാൻ്റ് ഏതാണെന്ന് ‘command -v dkms’ ഉപയോഗിച്ച് കണ്ടെത്തുക. മിക്കവാറും /usr/sbin/dkms എന്നായിരിക്കും കിട്ടുന്നത്. കിട്ടിയത് തുറന്ന് നോക്കുക. അതിൽ sign_build എന്ന ഫങ്ങ്ഷൻ കണ്ടെത്തുക. ഈ പാർട്ട് നിങ്ങളുടെ ഡി കെ എം എസിൽ ഇല്ലെങ്കിൽ ഉബുണ്ടുവിൻ്റെ ഡി കെ എം എസ് പാക്കേജിലെ ഡി കെ എം എസ് സ്ക്രിപ്റ്റ് വച്ച് ഇതിനെ റീപ്ലേസ് ചെയ്യുക. ഉണ്ടെങ്കിൽ ഏതാണ്ടിങ്ങനെ ആയിരിക്കും
[[ -x $(command -v kmodsign) && -d "/var/lib/shim-signed/mok/" ]] || return


ഇതിൽ kmodsign നിങ്ങളുടെ സിസ്റ്റത്തിൽ ഉണ്ടോന്ന് command -v kmodsign ഉപയോഗിച്ച് നോക്കുക. ഇല്ലെങ്കിൽ പേടിക്കണ്ട, അത് കെർണൽ സോഴ്സിലെ സൈൻ ഫയൽ കമാൻ്റ് തന്നെ ആണ്. കെർണൽ ബിൽഡിനാവശ്യമായ ഹെഡ്ഡറുകളും മറ്റും ഇൻസ്റ്റാൾ ചെയ്തിട്ടുണ്ടങ്കിൽ ആ ഫയൽ ഈ ലൊക്കേഷനിൽ കാണും.

/lib/modules/`uname -r`/build/scripts/sign-file


ഇനി ഡി കെ എം എസ്സിലെ സൈൻ ബിൽഡ് താഴെക്കാണുന്ന പോലെ ആക്കുക. മേലെ kmodsign ഒരു വേരിയബിൾ ആയി ഒന്ന് സെറ്റ് ചെയ്തേക്കുക.

kmodsign=/lib/modules/`uname -r`/build/scripts/sign-file

sign_build()
{
[[ -x $kmodsign && -d "/var/lib/shim-signed/mok/" ]] || return
local base_dir="$dkms_tree/$module/$module_version/$kernelver/$arch"
if type update-secureboot-policy >/dev/null 2>&1; then
echo $"Signing module:"
SHIM_NOTRIGGER=y update-secureboot-policy --new-key
for ko in `find "$base_dir/module/" -name "*.ko" -print`;
do
echo " - $ko"
$kmodsign sha512 \
/var/lib/shim-signed/mok/MOK.priv \
/var/lib/shim-signed/mok/MOK.der "$ko"
done
update-secureboot-policy --enroll-key
fi
}


അപ്പോ ഡി കെ എം എസ്സിൻ്റെ കാര്യം സെറ്റായി. ഇനി വേണ്ടത് സൈൻ ചെയ്യാനുള്ള കീയും അതിനെ ബയോസിൽ എൻറോൾ ചെയ്യലും ആണ്.

command -v update-secureboot-policy ഉപയോഗിച്ച് update-secureboot-policy എവിടെയാണെന്ന് കണ്ടെത്തുക. മിക്കവാറും /usr/sbin/update-secureboot-policy ആയിരിക്കും. തുറന്ന് നോക്കുക, അതിൽ താഴെപ്പറയുന്ന ഭാഗങ്ങൾ ഉണ്ടോ എന്ന്.

'--new-key')
create_mok
exit 0
;;


ഉണ്ടെങ്കിലും ഇല്ലെങ്കിലും ഈ സെറ്റപ്പ് ചെയ്യണം. ആദ്യം /usr/lib/shim/mok/openssl.cnf എന്ന ഫയൽ ഉണ്ടാക്കി അതിൽ താഴെയുള്ള സാധനങ്ങൾ ഇടണം.

HOME = /var/lib/shim-signed/mok
RANDFILE = /var/lib/shim-signed/mok/.rnd

[ req ]
distinguished_name = req_distinguished_name

x509_extensions = v3_ca
string_mask = utf8only

[ req_distinguished_name 

[ v3_ca ]
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid:always,issuer
basicConstraints = critical,CA:FALSE

# We use extended key usage information to limit what this auto-generated
# key can be used for.
#
# codeSigning: specifies that this key is used to sign code.
#
# 1.3.6.1.4.1.2312.16.1.2: defines this key as used for module signing
# only. See https://lkml.org/lkml/2015/8/26/741.
#
extendedKeyUsage = codeSigning,1.3.6.1.4.1.2312.16.1.2
nsComment = "OpenSSL Generated Certificate"



പിന്നെ
mkdir -p /var/lib/shim-signed/mok/

ഇനി,

Update-secureboot-policy യിൽ നേരത്തെ പറഞ്ഞ സാധനങ്ങൾ ഉണ്ടായിരുന്നെങ്കിൽ,

# update-secureboot-policy --new-key
# update-secureboot-policy --enroll-key

ഒരു പാസ്സ്‌വേർഡ് ചോദിക്കും. ഒരെണ്ണം സെറ്റ് ചെയ്യുക, ഓർത്ത് വയ്ക്കുക. ഇല്ലായിരുന്നെങ്കിൽ, ഒരു എം ഓ കെ ഉണ്ടാക്കുക,

# export SB_KEY="/var/lib/shim-signed/mok/MOK.der"
# export SB_PRIV="/var/lib/shim-signed/mok/MOK.priv"
# openssl req -config /usr/lib/shim/mok/openssl.cnf \
-subj "/CN=`hostname -s | cut -b1-31` Secure Boot Module Signature key" \
-new -x509 -newkey rsa:2048 \
-nodes -days 36500 -outform DER \
-keyout "$SB_PRIV" \
-out "$SB_KEY"

ഉണ്ടാക്കിയ കീ എൻറോൾ ചെയ്യുക,

# mokutil --import "$SB_KEY"

ഒരു പാസ്സ്‌വേർഡ് ചോദിക്കും. ഒരെണ്ണം സെറ്റ് ചെയ്യുക, ഓർത്ത് വയ്ക്കുക. സിസ്റ്റം റീസ്റ്റാർട്ട് ചെയ്യുക. ഇപ്പോൾ എംഓകെ എൻറോൾ ചെയ്യാനുള്ള ഓപ്ഷൻ കാണിക്കും. അത് സെലക്റ്റ് ചെയ്യുക, ചോദിക്കുമ്പോ നേരത്തേ സെറ്റ് ചെയ്ത പാസ്സ്‌വേർഡ് കൊടുക്കുക. അത്രേയുള്ളു.

ഇനി ഡി കെ എം എസ് ഉപയോഗിച്ച് വേണ്ട മൊഡ്യൂളുകളൊക്കെ ബിൽഡ് ചെയ്ത് ഉപയോഗിക്കാം.

അനുബന്ധ വായന:

  1. https://edk2-docs.gitbook.io/understanding-the-uefi-secure-boot-chain/additional_secure_boot_chain_implementations/machine_owner_key_mok
  2. https://en.wikipedia.org/wiki/Dynamic_Kernel_Module_Support
  3. https://edk2-docs.gitbook.io/understanding-the-uefi-secure-boot-chain/secure_boot_chain_in_uefi/uefi_secure_boot
  4. https://github.com/rhboot/shim

Thursday, August 19, 2021

പെർസിസ്റ്റൻ്റ് മെമ്മറി - pmem


വിവരസാങ്കേതികവിദ്യയുടെ സാധ്യതകളും ഉപയോഗ മേഖലകളും കഴിഞ്ഞ ഏതാനും വർഷങ്ങൾക്കുള്ളിൽ വിസ്‌മയകരമായ അതിരുകളിലേയ്ക്കും അകലങ്ങളിലേയ്ക്കും ആണ് വളർന്നത്. ചിത്രം വരയ്ക്കുകയും ബിസിനസ്സ് കണക്കുകൾ സൂക്ഷിക്കുകയും ടൈപ്പ് ചെറ്റിങ്ങ് ചെയ്യുകയും തുടങ്ങിയ അടിസ്ഥാന ഉപയോഗങ്ങളിൽ നിന്നും കമ്പ്യൂട്ടറുകളും മറ്റ് ഉപകരണങ്ങളും നിത്യജീവിതത്തിൻ്റെ ഭാഗമാകുകയും സമസ്തമേഖലകളിലേയ്ക്കും കടന്നുകയറുകയും ചെയ്തിരിക്കുന്നു. ജോലിയും വിനോദവും വിശ്രമവും കമ്പ്യൂട്ടറിൻ്റെ മുന്നിൽ തന്നെ ആയെന്ന് പറയാം.

കൂടുതൽ മേഖലകളീലേയ്ക്ക് കമ്പ്യൂട്ടറുകൾ കടന്നുചെന്നപ്പോൾ അവയ്ക്ക് കൈകാര്യം ചെയ്യണ്ട വിവരങ്ങളുടെ അളവിലും ആയിരക്കണക്കിനു മടങ്ങ് വളർച്ചയാണ് ഉണ്ടായത്. 32 ജിബി എങ്കിലും സ്റ്റോറേജ് സൗകര്യം ഇല്ലാത്ത മൊബൈൽ ഫോൺ ഇന്ന് ആര് വാങ്ങാനാണ്. കമ്പ്യൂട്ടറുകളുടെ എല്ലാം അടിസ്ഥാന ദൗർബല്യം - കൈകാര്യം ചെയ്യേണ്ട വിവരം എന്തുമാകട്ടെ, അതിനെ ഓർമ്മയിൽ സൂക്ഷിച്ചേ പറ്റൂ - എന്നതാണ്. ഒരു സിനിമ കാണണമെങ്കിൽ അതിനെ സ്റ്റോറേജിൽ സൂക്ഷിക്കണം, അല്ലെങ്കിൽ ഇൻ്റർനെറ്റിൽ നിന്ന് സ്ട്രീം ചെയ്യണം. അതാത് സമയത്ത് സ്ക്രീനിൽ കാണിക്കുന്ന വിവരങ്ങൾ മാത്രമല്ല, സ്ട്രീം ചെയ്ത് വരുന്ന എൻകോഡ് ചെയ്യപ്പെട്ട വിവരങ്ങളും അതിനെ ഡീകോഡ് ചെയ്ത വിവരങ്ങളും എല്ലാം ആ സമയത്ത് മെമ്മറിയിൽ ഉണ്ടാവണം. ഒരു സിനിമ കാണുന്ന സമയത്ത് വളരെ കുറച്ച് വിവരങ്ങൾ മാത്രമേ ഇങ്ങനെ മെമ്മറിയിൽ സൂക്ഷിക്കേണ്ടതുള്ളു. പക്ഷേ ബിഗ് ഡാറ്റാ അനാലിസിസ്, ഡാറ്റബേസുകൾ പോലുള്ളവ കൈകാര്യം ചെയ്യുമ്പോൾ വളരെയധികം വിവരങ്ങൾ മെമ്മറിയിൽ സൂക്ഷിക്കേണ്ടിവരും.

കമ്പ്യൂട്ടറുകളിൽ നാല് തരം മെമ്മറി സംവിധാനങ്ങൾ ആണുള്ളത്.

1. സിപിയു രെജിസ്റ്ററുകൾ

2. സിപിയു കാഷ് മെമ്മറി

3. പ്രധാന മെമ്മറി - റാം

4. സെക്കൻ്ററി മെമ്മറി - ഹാർഡ് ഡിസ്ക്

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

 ഏറ്റവും വേഗത്തിൽ സിപിയുവിന് ലഭ്യമാകുന്ന വിവരങ്ങൾ സിപിയു രെജിസ്റ്ററുകളിൽ ഉള്ള വിവരങ്ങൾ ആണ്. ഒരു കമ്പ്യൂട്ടറിൽ ഏതാനും ബൈറ്റുകൾ മാത്രമായിരിക്കും ഇത്തരത്തിൽ ഉള്ള മെമ്മറി. ഒരു ബൈറ്റ് രേഖപ്പെടുത്താനുള്ള ചെലവ് ഏറ്റവും കൂടുതലും ഇതിൽ തന്നെ ആണ്.

സിപിയു രെജിസ്റ്ററുകൾ കഴിഞ്ഞാൽ ഏറ്റവും വേഗതയുള്ളത് സിപിയു കാഷ് മെമ്മറിയ്ക്കാണ്. ഓരോ സിപിയുവിനും ആധുനിക കമ്പ്യൂട്ടർ സിസ്റ്റങ്ങളിൽ ഒരു കാഷ് മെമ്മറി കൂടി കാണും. റാമിൽ നിന്ന് വിവരങ്ങൾ സിപിയുവിന് കിട്ടാനുള്ള താമസം സിപിയുവിനെ അതിൻ്റെ പ്രവർത്തനം തുടർച്ചയായി ചെയ്യുന്നതിൽ നിന്നും തടയാറുണ്ട്. അതുകൊണ്ട് സിപിയുവിന് കൂടെക്കൂടെ ആവശ്യം വരുന്ന വിവരങ്ങൾ കാഷ് മെമ്മറിയിൽ സൂക്ഷിക്കുകയും അത് സിപിയുവിന് വേഗത്തിൽ ലഭ്യമാക്കുകയും ചെയ്യുന്നു. കാഷ് മെമ്മറിയുടെ ഉപയോഗം മറ്റ് പല പ്രശ്നങ്ങളും ഉണ്ടാക്കാറുണ്ട്. ഒന്നിലധികം പ്രോസസ്സറുകൾ ഉള്ള സിസ്റ്റങ്ങൾ കാഷ് കൊഹറൻ്റ് അല്ലെങ്കിൽ (cache coherent) അതിനെ കൈകാര്യം ചെയ്യാൻ സോഫ്റ്റ് വെയറിന് കൂടുതൽ അധ്വാനിക്കേണ്ടിവരും.

കാഷ് മെമ്മറിയെക്കാൾ വേഗത കുറവായിരിക്കും റാമിന്. ഓരോ ബൈറ്റ് സ്റ്റോറേജിനും ഉള്ള വിലയും താരതമ്യേന കുറവായിരിക്കും. 4, 8, 16, 32, 64, 128, 256 ജിബി വലിപ്പത്തിൽ ഉള്ള റാം മെമ്മറി മൊഡ്യൂളുകൾ (DRAM DIMM) ലഭ്യമാണ്. വലിപ്പം കൂടുന്തോറും വിലയും കൂടും. റാമിൽ നിന്ന് സിപിയുവിന് വിവരങ്ങൾ ലഭ്യമാകാൻ എടുക്കുന്ന താമസം (latency) ശരാശരി 14 നാനോ സെക്കൻ്റുകൾ ആണ്. 

മേൽപ്പറഞ്ഞ മെമ്മറി മൊഡ്യൂളുകൾ എല്ലാം വോളറ്റൈൽ ആണ്. അതായത് കരണ്ട് പോയാൽ അതിലുള്ള വിവരങ്ങൾ എല്ലാം പോകും. സിപിയുവിനെ സംബധിച്ചിടത്തോളം ഈ മെമ്മറികൾ ലോഡ് - സ്റ്റോർ ഓപ്പറേഷനുകൾ വഴി ആണ് വായിക്കപ്പെടുകയും എഴുതപ്പെടുകയും ചെയ്യുന്നത്. അവ ബൈറ്റ് അഡ്രസ്സിബിൾ ആണ്. ഏത് ബൈറ്റിനെയും സ്വതന്ത്രമായി വായിക്കാനും മാറ്റം വരുത്താനും സാധിക്കും. ഇവ സാധാരണഗതിയിൽ സിപിയുവുമായി ആശയവിനിമയം നടത്തുന്നത് സിപിയുവിൻ്റെ അഡ്രസ്സ് ബസ്സ് വഴിയാണ്. രെജിസ്റ്ററുകളും കാഷ് മെമ്മറിയും സിപിയുവുമായി നേരിട്ട് ഘടിപ്പിച്ചിരിക്കും. റാം മൊഡ്യൂളൂകൾ നോർത്ത് ബ്രിഡ്ജ്/സിസ്റ്റം ഏജൻ്റ് വഴിയും. ഈ സിസ്റ്റം ഏജൻ്റ് മതർബോർഡിലെ ചിപ്സെറ്റിൻ്റെ ഭാഗം ആയിരിക്കും. സിപിയു ഒരു മെമ്മറി ലൊക്കേഷനെ വായിക്കാൻ/എഴുതാൻ ശ്രമിക്കുമ്പോൾ അത് ഏത് ഉപകരണത്തിൻ്റെ അഡ്രസ്സ് ആണ് എന്ന് മനസ്സിലാക്കി ആ ഉപകരണത്തിലേയ്ക്ക് വഴിതിരിച്ച് വിടുന്നത് ഈ യന്ത്രഭാഗം ആണ്.  അഡ്രസ്സ് ബസ്സിൽ ഘടിപ്പിച്ചിരിക്കുന്ന ഉപകരണങ്ങൾക്ക് സിപിയുവുമായി വളരെ ഉയർന്ന വേഗതയിൽ ആശയവിനിമയം നടത്താൻ സാധിക്കും.

ബാക്കിയുള്ള മെമ്മറി സെക്കൻ്ററി സ്റ്റോറേജ് അധവാ ഹാർഡ് ഡിസ്ക് ആണ്. ടേപ്പ്, ഫ്ളോപ്പി, സിഡി, എസ് എസ് ഡി ഒക്കെ ഈ വിഭാഗത്തിൽ പെടും. ഇവ ATA, SATA, PCIe, USB, M2 തുടങ്ങി വിവിധതരം സംവിധാനങ്ങൾ വഴിയാണ് സിപിയുവുമായി ആശയവിനിമയം നടത്തുന്നത്. അതിനാൽ തന്നെ മറ്റ് മെമ്മറികളെ അപേക്ഷിച്ച് ഇവ ഒച്ചുകളായിരിക്കും. ടേപ്പുമായി താരതമ്യം ചെയ്താൽ എസ് എസ് ഡി കൾ വളരെ വേഗതയുള്ളവയാണ്. മില്ലി സെക്കൻ്റുകളിൽ ആയിരിക്കും ഇവയുടെ ലേറ്റൻസി. ഇത് നാനോസെക്കൻ്റ് ലേറ്റൻസി ഉള്ള റാമിനെക്കാൾ എത്ര വേഗത കുറഞ്ഞതാണ് എൻ ഊഹിക്കാമല്ലോ. പക്ഷേ ഇവയുടെ വില വളരെ കുറവാണ്. 1 ടിബി കപ്പാസിറ്റിയുള്ള ഡിസ്കിൻ്റെ വില മിക്കവാറും 8 ജിബി കപ്പാസിറ്റി ഉള്ള റാമിൻ്റെ വിലയെക്കാൾ കുറവാണല്ലോ. സെക്കൻ്ററി സ്റ്റോറേജ് ഡിവൈസുകൾ നോൺവോളറ്റൈൽ അഥവാ പെർസിസ്റ്റൻ്റ് ആണ്. വൈദ്യുതി നിലച്ചാലും ഇതിലെ വിവരങ്ങൾ നഷ്ടമാകുന്നില്ല.

സെക്കൻ്ററി സ്റ്റോറേജ് ഉപകരണങ്ങളുമായി സിപിയു ആശയവിനിമയം നടത്തുന്നത് ഐ - ഓ ഓപ്പറേഷനുകൾ വഴിയാണ്. ഇത് പോർട്ട് ഐഓ അല്ലെങ്കിൽ മെമ്മറി മാപ്പ്ഡ് ഐ ഓ ആവാം. പക്ഷേ റാമിലെ ലോഡ് - സ്റ്റോർ രീതിയുമായി താരതമ്യപ്പെടുത്തുമ്പോൾ വേഗത കുറഞ്ഞതും കൂടുതൽ ഉപകരണങ്ങൾ ഉൾപ്പെട്ടതും ആയ ഓപ്പറേഷനുകൾ ആയിരിക്കും ഇവ. ഉദാഹരണത്തിന് യു എസ് ബി വഴി ഘടിപ്പിക്കപ്പെട്ട ഡിസ്കുമായി സിപിയുവിന് സംസാരിക്കണമെങ്കിൽ അത് ആദ്യം യു എസ് ബി കണ്ട്രോളറിൽ ചെല്ലണം, അവിടന്ന് ഡിസ്കിന് മനസ്സിലാകുന്ന രീതിയിലേയ്ക്ക് വിവരങ്ങൾ മാറ്റി ഡിസ്കിലേയ്ക്ക് അയയ്ക്കണം. തിരികെ കിട്ടുന്ന വിവരങ്ങൾ യു എസ് ബി രീതിയിൽ ആക്കി തിരിച്ച് അയയ്ക്കണം. ഇതിനു പുറമേ ഇവ ബ്ളോക്ക് അഡ്രസ്സിബിൾ ഡിവൈസുകൾ ആണ്. റാം ബൈറ്റ് അഡ്രസ്സിബിൾ ആണ്. ഇവയിലെ ഓരോ ബൈറ്റുകളും പ്രത്യേകമായി എഴുതാനും വായിക്കാനും സാധിക്കും. എന്നാൽ ബ്ലോക്ക് അഡ്രസ്സിബിൾ ഡിവൈസുകളിൽ ഒരു മുഴുവൻ ബ്ളോക്ക് വായിക്കുകയും എഴുതുകയും വേണം. സാധാരണ ഒരു ബ്ലോക്കിൻ്റെ വലിപ്പം 512 ബൈറ്റ് മുതൽ 4 കിലോബൈറ്റ് വരെ ആകാം. ഒരു ബൈറ്റിൽ മാറ്റം വരുത്താൻ ഒരു ബ്ളോക്ക് മൊത്തം വായിച്ച് അതിലെ ആവശ്യമായ ബൈറ്റ് മാറ്റം വരുത്തി ആ ബ്ലോക്ക് മൊത്തമായി തിരികെ എഴുതണം.

വലിയ സ്കെയിലിൽ ഉള്ള സിസ്റ്റങ്ങളിലേയ്ക്ക് വരുമ്പോൾ, അവയിൽ മിക്കപ്പോളും 16, 32, 64 ചിലപ്പോൾ അതിലും കൂടുതൽ സിപിയുകൾ ഉണ്ടായിരിക്കും. അവയ്ക്ക് എല്ലാം കൂടി ടെറാബൈറ്റ് കണക്കിൽ റാമും. ഇത് വളരെ ചെലവേറിയ ഒരു സെറ്റപ്പാണ്. പക്ഷേ വലിയ സെർവറുകളിൽ, ബിഗ് ഡാറ്റ അനാലിസിസ് നടത്തുന്നവ, വെബ് ആപ്ലിക്കേഷനുകൾ പ്രവർത്തിക്കുന്നവ, ഡാറ്റാബേസുകൾ ഉള്ളവയിൽ ഒക്കെ ഇതിനെക്കാൾ കൂടുതൽ മെമ്മറി ആവശ്യമായി വരും. ഗിഗാബൈറ്റുകൾ വലിപ്പമുള്ള ഒരു ഡാറ്റാബേസിൻ്റെ പകുതി ഭാഗമെങ്കിലും റാമിൽ അല്ലെങ്കിൽ അഥവാ ഹാർഡ് ഡിസ്ക് കൂടെക്കൂടെ ആക്സസ്സ് ചെയ്യണ്ട വന്നാൽ പെർഫോമൻസിനെ അത് കാര്യമായി ബാധിക്കും. പക്ഷേ അത്രയും റാം ആവശ്യമായി വന്നാൽ ചെലവ് കുത്തനെ കൂടും. ഈ സാഹചര്യം പരിഗണിച്ചാണ് പെർസിസ്റ്റൻ്റ് മെമ്മറി ടെക്നോളജികൾ നിലവിൽ വന്നത്.

SNIA (Storage Networking Industry Association) ആണ് പെർസിസ്റ്റൻ്റ് മെമ്മറി അഥവാ പി-മെം ഉമായി ബന്ധപ്പെട്ട സ്റ്റാൻഡേർഡുകൾ കൈകാര്യം ചെയ്യുന്നത്. പി-മെം റാമിനെക്കാൾ വേഗത അല്പം കുറഞ്ഞ (100 കണക്കിന് നാനോ സെക്കൻ്റുകൾ ലേറ്റൻസി), എന്നാൽ ചെലവ് വളരെ കുറഞ്ഞ മെമ്മറി മൊഡ്യൂളുകൾ ആണ്. ഇവ സാധാരണ 128, 256, 512 ജിബി വലിപ്പങ്ങളിൽ ആണ് വരുന്നത്. ഇവയെ പെർസിസ്റ്റൻ്റ് മെമ്മറി എന്ന് പറയാൻ കാരണം കരണ്ട് പോയാൽ ഇതിലെ ഉള്ളടക്കം നഷ്ടപ്പെടില്ല എന്നതുകൊണ്ടാണ്. ഒരു ഹാർഡ് ഡിസ്കിൽ എന്നപോലെ. ഇവയെ എൻവിഡിം (NVDIMM ) എന്നും പറയാറുണ്ട്. DIMM മൊഡ്യൂളുകൾ വോളറ്റൈൽ ആണല്ലോ.

പി-മെം മൊഡ്യൂളുകൾ സിപിയുവിൻ്റെ അഡ്രസ്സ് ബസ്സിൽ ആണ് ഘടിപ്പിക്കുന്നത്. അതിനാൽ തന്നെ വളരെയധികം വേഗത്തിൽ അവയ്ക്ക് സിപിയുവുമായി ആശയവിനിമയം നടത്താൻ സാധിക്കുന്നു. അഡ്രസ്സ് ബസ്സിൽ ആയതിനാൽ സിപിയു ഇവയുമായി ലോഡ് - സ്റ്റോർ രീതിയിൽ ആണ് ആശയവിനിമയം നടത്തുന്നത്. ഇടയിൽ സിസ്റ്റം ഏജൻ്റ് അല്ലാതെ മറ്റ് ഉപകരണങ്ങളുടെ ആവശ്യമില്ല. മെമ്മറി മാപ്പ്ഡ് രീതിയിൽ ആണെങ്കിൽ മെമ്മറി മാനേജ്മെൻ്റ് യൂണിറ്റ് കൂടി ഇതിൽ കക്ഷിചേരും. 

എൻവി - ഡിം മൊഡ്യൂളുകൾ സാധാരണ താഴെക്കൊടുത്ത രീതിയിൽ ആയിരിക്കും സിപിയുവുമായി ഘടിപ്പിക്കുന്നത്



ഒരു ഡ്യുവൽ ചാനൽ അഡ്രസ്സ് ബസ്സിൽ റാമിനൊപ്പം തന്നെ ഇവ ഘടിപ്പിക്കപ്പെട്ടിരിക്കുന്നു. മൊഡ്യൂളുകൾ രണ്ടിലധികം ഉണ്ടാവാം. 

2 വ്യത്യസ്ത രീതികളിൽ എൻവി - ഡിം മൊഡ്യൂളുകൾ പ്രവർത്തിക്കുന്നു. ഈ സംവിധാനം ഉള്ള കമ്പ്യൂട്ടറുകളിലെ ബയോസിൽ ഏത് രീതിയിലാണ് ഇവ പ്രവർത്തിക്കുന്നത് എന്ന് തെരഞ്ഞെടുക്കാനുള്ള സംവിധാനം ഉണ്ടായിരിക്കും.

1. മെമ്മറി മോഡ്

2. ആപ്പ് ഡയറക്റ്റ് മോഡ്

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

ആപ്പ് ഡയറക്റ്റ് മോഡിൽ ആണെങ്കിൽ ഇവ പെർസിസ്റ്റൻ്റ് സ്റ്റോറേജായി പ്രവർത്തിക്കുന്നു. ഒരു ഹാർഡ് ഡിസ്ക് പോലെ. പക്ഷേ ലോഡ് - സ്റ്റോർ രീതിയിൽ ആയിരിക്കും പ്രവർത്തിക്കുന്നത്. അത് വഴി ഓരോ ബൈറ്റുകളും വായിക്കാനും എഴുതാനും സാധിക്കുന്നു. ആപ്ലിക്കേഷന് ഒരു ബൈറ്റിൽ മാറ്റം വരുത്താൻ ഒരു ബ്ലോക്ക് മുഴുവൻ വായിക്കേണ്ടതായി വരില്ല. എഴുതേണ്ടതായും. ഇതിനു പുറമേ നാനോ സെക്കൻ്റ് സമയം മാത്രമേ വിവരങ്ങൾ കൈമാറ്റം ചെയ്യാൻ ആവശ്യമുള്ളു. ഇങ്ങനെ ഹാർഡ് ഡിസ്കിൻ്റെ വലിപ്പത്തിലുള്ളത്ര മെമ്മറി റാമിൻ്റെ വേഗതയിൽ കൈമാറ്റം ചെയ്യാൻ സാധിക്കുമ്പോളും റാമിനെക്കാൾ വളരെ കുറഞ്ഞ ചെലവ് മാത്രമേ വരുന്നുള്ളു. അതുകൊണ്ട് തന്നെ സെർവറുകളിൽ ഇപ്പോൾ ഈ മെമ്മറി വളരെ സാധാരണയായി ഉപയോഗിച്ചുവരുന്നു.

ഇൻ്റലിൻ്റെ 3ഡിഎക്സ് പോയിൻ്റ് ടെക്നോളജി ഉപയോഗിക്കുന്ന ഓപ്റ്റേൻ മെമ്മറി മൊഡ്യൂളുകളെക്കാൾ വേഗത കൂടുതലാണ് എൻവി - ഡിം മൊഡ്യൂളുകൾക്ക്. ഒപ്റ്റേൻ മെമ്മറി മൊഡ്യൂളുകൾ ഇൻ്റൽ പ്രോസസ്സറുകൾക്കൊപ്പമേ പ്രവർത്തിക്കുകയുള്ളു. പക്ഷേ എൻവി - ഡിം മൊഡ്യൂളുകൾക്ക് ഇത്തരം പരിധികൾ ഒന്നും ഇല്ല.

ആപ്പ് ഡയറക്റ്റ് മോഡിൽ പി-മെം മൊഡ്യൂളുകൾ കാര്യക്ഷമമായി ഉപയോഗിക്കാനുള്ള ലൈബ്രറികൾ ഓപ്പൺ സോഴ്സ് ആയി ലഭ്യമാണ്. https://pmem.io/pmdk/libpmem/ ഇൽ കൂടുതൽ വിവരങ്ങൾ കാണാം. കൂടുതൽ വായനയ്ക്ക് https://en.wikipedia.org/wiki/NVDIMM

Thursday, December 19, 2019

ഡാറ്റാ റിക്കവറി ഭാഗം 2


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

ഡിസ്ക് കറപ്ഷൻ ഹാർഡ്‌വെയർ തകരാറോ ഫയൽ സിസ്റ്റം തകരാറോ ആകാം. ഹാർഡ്‌വെയർ തകരാർ പല തലങ്ങളിൽ ഉള്ളതും ആവാം. ചെലപ്പോൾ ഡിസ്ക് മുഴുവനായി ഡിറ്റക്റ്റ് ചെയ്യപ്പെടാതിരിക്കും. അല്ലെങ്കിൽ ഡിസ്കിലെ ഫയൽ സിസ്റ്റം മെറ്റാഡാറ്റ ഉള്ള ഭാഗം ഓപ്പറേറ്റിങ്ങ് സിസ്റ്റത്തിന് വായിക്കാൻ കഴിയാതെ ഇരിക്കാം. ചെലപ്പോൾ ഫയൽ എഴുതപ്പെട്ടിരിക്കുന്ന ബ്ലോക്കുകൾ തന്നെ വായിക്കാൻ സാധിക്കാതെ വരാം. ആദ്യത്തെ കേസിൽ ഒരു സാധാരണ ഉപയോക്താവിന് ചെയ്യാൻ സാധിക്കുന്ന കാര്യങ്ങൾക്ക് പരിമിതി ഉണ്ട്. ഡിസ്കിലെ ഇലക്ട്രോണിക്ക് സർക്യൂട്ടുകൾക്ക് ആണ് പ്രശ്നമെങ്കിൽ ഇത് റീപ്ലേസ് ചെയ്താൽ ഡിസ്കിലെ ഡാറ്റ വീണ്ടെടുക്കാൻ സാധിക്കും. മാഗ്നറ്റിക് സിലിണ്ടറുകൾക്ക് തകരാറ് വരാൻ സാധ്യത കുറവാണ്. രണ്ടാമത്തെ കേസിൽ ഫയൽ സിസ്റ്റം മെറ്റാഡാറ്റ ഡിസ്കിന്റെ വലിപ്പത്തിനനുസരിച്ച് ഒന്നിലധികം സ്ഥലങ്ങളിൽ രേഖപ്പെടുത്തിയിരിക്കും. മിക്കവാറും സാഹചര്യങ്ങളിൽ ബാക്കപ്പ് മെറ്റാഡാറ്റ ഉപയോഗിച്ച് ഈ പ്രശ്നം പരിഹരിക്കാൻ സാധിക്കും. മൂന്നാമത്തെ കേസിൽ ഒന്നോ അതിലധികമോ ഫയലുകൾക്ക് മാത്രമായിരിക്കും പ്രശ്നം. ഈ കേസിൽ ആ ഫയലുകൾ വീണ്ടെടുക്കാൻ ഉള്ള സാധ്യത കുറവാണ്.
ഫയൽ സിസ്റ്റം തകരാറുകൾ ആണ് ഉള്ളതെങ്കിൽ അതിന്റെ റിക്കവറിക്ക് നിരവധി ഓപ്ഷനുകൾ ഉണ്ട്. മിക്കവാറും നിങ്ങളൂടെ ഡിസ്ക് കണക്റ്റ് ചെയ്യുമ്പോൾ തന്നെ ചെറീയ തകരാറുകൾ ആണെങ്കിൽ ഇത് സ്കാൻ ചെയ്ത് ഫിക്സ് ചെയ്യണോ എന്ന് ചോദിച്ചുള്ള ഡയലോഗ് ബോക്സ് കാണാം. സ്കാൻ ആൻഡ് ഫിക്സ് സെലക്റ്റ് ചെയ്താൽ തന്നെ മിക്കവാറും ആ പ്രശ്നം പരിഹരിക്കപ്പെടും. ചെലപ്പോൾ ഡിസ്ക് ആക്സസ്സ് ചെയ്യാൻ സാധിക്കുന്നില്ല, ഫോർമാറ്റ് ചെയ്യണം എന്നായിരിക്കും ഡയലോഗ് ബോക്സിൽ. ഒരു കാരണവശാലും ഫോർമാറ്റ് ഓപ്ഷൻ സെലക്റ്റ് ചെയ്യാതിരിക്കുക. ഡിസ്കിന്റെ തകരാർ ശ്രദ്ധയിൽ പെട്ടാൽ അതിലേക്കുള്ള റൈറ്റ് ഓപ്പറേഷനുകൾ പരമാവധി കുറയ്ക്കുക എന്നതാണ് ആദ്യപടി. ഫയൽ സിസ്റ്റം പ്രശ്നങ്ങൾ ഉള്ളതായി ഓപ്പറേറ്റിങ്ങ് സിസ്റ്റം പറയുകയോ ഫയലുകൾ കാണാതിരിക്കുകയോ ഒക്കെ ചെയ്യുന്ന കേസുകളിൽ ഡിസ്കിലേക്ക് ഫയലുകൾ ഒന്നും കോപ്പി ചെയ്യാതിരിക്കുക.

ഫയൽ സിസ്റ്റം കറപ്ഷൻ കേസിൽ ആദ്യം ശ്രമിക്കേണ്ടത് ഫയൽ സിസ്റ്റം എററുകൾ ശരിയാക്കാനാണ്. ഇതിനായി ഫയൽ സിസ്റ്റം റിപ്പയർ യൂട്ടിലിറ്റികൾ ഉപയോഗിക്കണം. വിൻഡോസ് FAT/NTFS ഫയൽ സിസ്റ്റങ്ങൾക്ക് ആദ്യം ഉപയോഗിക്കേണ്ടത് chkdsk ആണ്. ഇത് വിൻഡോസ് സിസ്റ്റങ്ങളിൽ എല്ലാം ഉണ്ടായിരിക്കും. അഡ്മിനിസ്ട്രേറ്റർ ആയി കമാന്റ് പ്രോംപ്റ്റ് അല്ലെങ്കിൽ വിൻഡോസ് പവർ ഷെല്ല് തുറന്നിട്ട് അതിൽ chkdsk <drive letter>: /f , ഇവിടെ ഡ്രൈവ് ലെറ്റർ ഏത് പാർട്ടീഷ്യനെ ആണോ ചെക്ക് ചെയ്യണ്ടത്, അതിന്റെ ഡ്രൈവ് ലെറ്റർ ആണ്. പല കേസുകളിലും ഇത് ഫയൽ സിസ്റ്റം പ്രശ്നങ്ങൾ പരിഹരിക്കുകയും ഡിസ്ക് പഴയത് പോലെ ഉപയോഗ്യയോഗ്യമാകുകയും ചെയ്യും. ചില കേസുകളിൽ ഇത് പ്രവർത്തികാതെ വരാറുണ്ട്. അങ്ങനെയുള്ള അവസരങ്ങളിൽ സൗജന്യ സോഫ്റ്റ്‌വെയർ ആയ ടെസ്റ്റ് ഡിസ്ക് ഉപയോഗിക്കാം. (https://www.cgsecurity.org/wiki/TestDisk_Download). Chkdsk പരാജയപ്പെടുന്ന അവസരങ്ങളീൽ ടെസ്റ്റ്ഡിസ്ക് ഉപയോഗിച്ച് MFT എങ്ങനെ റിപ്പയർ ചെയ്യാം എന്നതിനെ പറ്റി ഡീറ്റെയിൽഡ് ആയ വിവരണം ഇവിടെ ഉണ്ട്. https://www.cgsecurity.org/wiki/Advanced_NTFS_Boot_and_MFT_Repair. ചില സാഹചര്യങ്ങളിൽ ഡിസ്കിലെ പാർട്ടീഷ്യൻ ടേബിൾ ആണ് തകരാറിലായതെങ്കിൽ ഡ്രൈവുകൾ ആയി ഈ ഡിസ്ക് ഡിറ്റക്റ്റ് ചെയ്യപ്പെടാതെ വരും. അങ്ങനെയുള്ള സാഹചര്യങ്ങളിൽ testdisk ലെ പാർട്ടീഷ്യൻ ടേബിൾ സ്കാനർ ഉപയോഗിക്കാം. ഇത് ഡിസ്കിൽ മുഴുവൻ ഫയൽ സിസ്റ്റങ്ങൾക്ക് വേണ്ടി സ്കാൻ ചെയ്യുകയും ഡിറ്റക്റ്റ് ചെയ്ത ഫയൽ സിസ്റ്റങ്ങൾ ലിസ്റ്റ് ചെയ്യുകയും ചെയ്യും. ഇതിൽ നഷ്ടമായ പാർട്ടീഷ്യനുകൾ എല്ലാം കാണിക്കുന്നുണ്ടെങ്കിൽ ആ വിവരം മാസ്റ്റർ ബൂട്ട് റെക്കോർഡിൽ അപ്‌ഡേറ്റ് ചെയ്യുകയും ഡിസ്ക് വീണ്ടും ഉപയോഗ്യയോഗ്യമാക്കുകയും ചെയ്യാം. പാർട്ടീഷ്യനുകൾ ഡിറ്റക്റ്റ് ചെയ്യുകയും ഫയൽ സിസ്റ്റങ്ങൾ കറപ്റ്റ് ആയിരിക്കുകയും ചെയ്യുന്ന സാഹചര്യങ്ങളിൽ ആണ് chkdsk ഉപയോഗിക്കേണ്ടത്.

ലിനക്സിലെ  EXT2/3/4 പോലുള്ള ഫയൽ സിസ്റ്റങ്ങൾ ആണെങ്കിൽ fsck പ്രോഗ്രാം ആണ് സ്കാൻ ആൻഡ് ഫിക്സ് ചെയ്യാൻ ഉപയോഗിക്കേണ്ടത്. ഇവിടെയും ഡിസ്കിലെ പാർട്ടീഷ്യനുകൾ ഡിറ്റക്റ്റ് ചെയ്യപ്പെടുന്നില്ലെങ്കിൽ ആദ്യം ടെസ്റ്റ് ഡിസ്ക് ഉപയോഗിച്ച് എം ബി ആർ റിക്കവറി, പാർട്ടീഷ്യൻ ടേബിൾ റിക്കവറി എന്നിവയ്ക്ക് ശ്രമിക്കണം. ബാക്കപ്പ് സൂപ്പർ ബ്ലോക്കുകൾ ഉപയോഗിച്ച് ഫയൽ സിസ്റ്റം റിക്കവർ ചെയ്യാനുള്ള വഴികളും വിശദമായ ഡാറ്റാ റിക്കവറി ഓപ്ഷനുകളും https://help.ubuntu.com/community/DataRecovery ഇവിടെ കാണാം.

ഫയൽ സിസ്റ്റം റിക്കവറി പൂർണ്ണമായും പരാജയപ്പെടുന്നിടത്ത് പിന്നെ ഡീപ് സ്കാൻ/അൺ ഡിലീറ്റ് തുടങ്ങിയ ഓപ്ഷനുകളേ ബാക്കിയുള്ളു. ഇതിനായി മേലത്തെ ലിങ്കിൽ ഉള്ള ടൂളുകളോ അല്ലെങ്കിൽ നിങ്ങളൂടെ ഓപ്പറേറ്റിങ്ങ് സിസ്റ്റത്തിന് അനുയോജ്യമായ ടൂളുകളോ ഉപയോഗിക്കാം. എന്റെ വ്യകതിപരമായ റെക്കമെന്റേഷൻ വിൻഡോസിൽ ആണെങ്കിൽ EaseUS Data Recovery Wizard ഉപയോഗിക്കാൻ ആണ്. ഇത് ഒരു സൗജന്യ സോഫ്റ്റ്‌വെയർ അല്ല. ഡിസ്കിലെ ഫെയിലിയർ ഹാർഡ്വെ‌യർ പ്രശ്നമാണോ എന്നുറപ്പില്ലാത്ത സാഹചര്യങ്ങളിൽ ഡാറ്റാ റിക്കവറി സാധ്യത പരമാവധി ആക്കാനും വേഗത്തിലുള്ളതാക്കാനും ഡിസ്ക് ഇമേജ് എടുത്ത് അതിൽ സേർച്ച് ചെയ്യുന്ന മെത്തേഡ് ഉണ്ട്. പക്ഷേ വലിയ സൈസുള്ള ഡിസ്ക് ആണെങ്കിൽ ഇത് വളരെ സമയമെടുക്കുന്ന ഒരു പ്രക്രിയ ആണ്. മാത്രമല്ല ഡിസ്ക് സൈസിന്റെ അത്രയും ഫ്രീ സ്പേസ് ഈ ഡിസ്ക് ഇമേജ് സൂക്ഷിക്കാനായി സജ്ജമാക്കേണ്ടതുണ്ട്. 500ജിബി ഒക്കെ ഉള്ള ഡിസ്കുകൾ ആണെങ്കിൽ ഇതൊരു നല്ല ഓപ്ഷൻ ആണ്. ഡിസ്ക് ഇമേജ് എടുത്താൽ പിന്നീടുള്ള സ്കാൻ ഓപ്പറേഷനുകൾ ഒക്കെ വളരെ വേഗതയാർന്നതായിരിക്കും. കൂടാതെ റിക്കവർ ചെയ്ത് കിട്ടുന്ന ഫയലുകൾ ശേഖരിക്കാൻ ആ ഡിസ്ക് തന്നെ ഫോർമാറ്റ് ചെയ്ത് ഉപയോഗിക്കുകയും ചെയ്യാം. അല്ലെങ്കിൽ മറ്റൊരു ഹാർഡ് ഡിസ്ക് കണക്റ്റ് ചെയ്ത് അതിലേക്ക് വേണം റിക്കവർ ചെയ്ത ഫയലുകൾ ശേഖരിക്കാൻ. റിക്കവർ ചെയ്തുകൊണ്ടിരിക്കുന്ന ഡിസ്കിലേക്ക് തന്നെ ഒരു കാരണവശാലും റിക്കവർ ചെയ്ത ഫയലുകൾ സേവ് ചെയ്യരുത്. ഇത് എല്ലായ്പ്പോഴും വളരെ സമയമെടുക്കുന്ന വളരെയധികം ക്ഷമ ആവശ്യമുള്ള സംഗതി ആണ്. ഈയടുത്ത് ഒരു 2 ടിബി ഡിസ്ക്, 2.0 യു എസ് ബി വഴി കണക്റ്റ് ചെയ്തത് മുഴുവൻ സ്കാൻ ചെയ്യാൻ മാത്രം 11 മണിക്കൂർ എടുത്തു. ആ ഡിസ്ക് ഉണ്ടാക്കിയ കാലം മുതൽ അതിൽ വന്ന് പോയതായ ഫയലുകൾ മുഴുവൻ ലിസ്റ്റ് ചെയ്യപ്പെടുകയും ചെയ്തു. ഇതിൽ മിക്കതും പൂർണ്ണമായും റിക്കവറബിൽ ആയിരിക്കുകയില്ല. അതിൽ നിന്ന് 1 ടിബി യോളം ഫയലുകൾ റിക്കവർ ചെയ്യാം ഏതാണ്ട് 10 മണിക്കൂർ എടുത്തു. അതെല്ലാം തിരികെ കോപ്പി ചെയ്യാം മറ്റൊരു 10 മണിക്കൂറും.

ഇങ്ങനെയുള്ള സാഹചര്യങ്ങളിൽ ആണ് ഡാറ്റ ഓർഗനൈസ് ചെയ്ത് വയ്ക്കുന്നതിന്റെ പ്രസക്തി. ഉദാഹരണത്തിന് കറപ്റ്റായ ഒരു ഫയൽ സിസ്റ്റത്തിൽ ഫോട്ടോകളും വീഡിയോകളും പാട്ടുകളും മാത്രമാണെന്നിരിക്കട്ടെ. സ്കാൻ ചെയ്യുമ്പോൾ തന്നെ ഈ ഫിൽട്ടറുകൾ തെരഞ്ഞെടുത്താൽ റിക്കവറി ടൂളിന് അറിയുന്ന നൂറുകണക്കിന് ഫയൽ ഫോർമാറ്റുകളിൽ നിന്ന് ഈ ടൈപ്പുകളെ മാത്രം മാച്ച് ചെയ്ത് നോക്കിയാൽ മതിയാകും. ഓരോ ബ്ലോക്കും വായിച്ച് അവിടെ ടൂളിന് പരിചയമുള്ള 200 ഫോർമാറ്റുകളുടെ വിവരങ്ങൾ എന്തെങ്കിലും ഉണ്ടോ (ഫയൽ സിഗ്നേച്ചർ/മാജിക്ക് നമ്പർ: https://en.wikipedia.org/wiki/Magic_number_(programming), https://en.wikipedia.org/wiki/List_of_file_signatures) എന്ന് നോക്കുന്നതിന് പകരം പത്തോ ഇരുപതോ എണ്ണം മാത്രം നോക്കിയാൽ മതിയാകും. ഇത് ഈ സ്കാനിങ്ങ് വേഗത എത്രകണ്ട് വർദ്ധിപ്പിക്കും എന്ന് ചിന്തിക്കാമല്ലോ.

വാൽ: ഡാറ്റാ റിക്കവറി എല്ലായ്പ്പോഴും കാര്യക്ഷമമോ പൂർണ്ണമോ ആകണം എന്നില്ല. അതുകൊണ്ട് ബാക്കപ്പ് ശീലമാക്കൂ. 

Sunday, November 24, 2019

ഹാർഡ് ഡിസ്ക്, പാർട്ടീഷ്യൻ, ഫയൽ സിസ്റ്റം, ഡാറ്റാ റിക്കവറി - 1


പൊതുജനോപകാരപ്രദമായി ഡാറ്റ ഓർഗനൈസേഷനെ പറ്റിയും ബെസ്റ്റ് പ്രാക്റ്റീസുകളെ പറ്റിയും ഫസ്റ്റ് എയ്ഡുകളെ പറ്റിയും അല്പം എഴുതാമെന്ന് കരുതി. രണ്ട് ഭാഗമായി ആണ് ഞാൻ ഇത് ചിട്ടപ്പെടുത്തിയിരിക്കുന്നത്. ആദ്യഭാഗം ഡാറ്റാ ഓർഗനൈസേഷൻ ബെസ്റ്റ് പ്രാക്റ്റീസുകളും ഇതെല്ലാം നോക്കിയിട്ടും ഡാറ്റ നഷ്ടമായാൽ എന്തൊക്കെ ചെയ്യാമെന്നത് രണ്ടാം ഭാഗവും.

പുതിയ കമ്പ്യൂട്ടറോ അഡീഷണൽ/എക്സ്റ്റേർണൽ ഡിസ്കുകളോ ഒക്കെ വാങ്ങുമ്പോൾ പൊതുവേ ആളുകൾ അതിനെ പാർട്ടീഷ്യൻ ചെയ്യാൻ ഒന്നും മെനക്കെടാറില്ല. പാർട്ടീഷ്യനിങ്ങോ? അതേ, അങ്ങനെ ഒരു സംഭവം ഉണ്ട്. വീട് മുഴുവൻ ഒരു മുറിയായി പണിയുന്നതിന് പകരം കിച്ചണും ബെഡ്റൂമും സ്റ്റോർ റൂമും ഒക്കെ വേറെ വേറെ ആയി ഭിത്തികെട്ടി തിരിച്ച് ഓരോന്നിനും യോജിക്കുന്ന സാധനങ്ങൾ മാത്രം അതാത് മുറികളിൽ ഇടുന്ന പരിപാടി. മിക്സി ബെഡ്റൂമിൽ വയ്ക്കുന്നതിൽ തെറ്റൊന്നും ഇല്ല. അങ്ങനെ ചെയ്താൽ അതുകൊണ്ട് ഉണ്ടാകുന്ന ബുദ്ധിമുട്ടുകൾ ആലോചിച്ച് നോക്കൂ. വീടിപ്പോ എയർബിഎൻബിയിൽ ആർക്കേലും കൊടുത്താൽ അവർ ഒരു ജ്യൂസുണ്ടാക്കാൻ മിക്സി അടുക്കളയിലും ഹോളിലും ഒക്കെ അന്വേഷിച്ച് മടുത്ത് അവസാനം എന്നാൽ കിടന്നേക്കാൻ എന്ന് കരുതി ബെഡ്റൂമിൽ വരുമ്പോ അവിടെ മിക്സി ഇരിക്കുന്നത് കാണുമ്പോ ഉള്ള ആ ഒരു ഫീലിങ്ങും മറ്റും. ഡെസ്ക്ടോപ്പിൽ ഫയലുകളൊക്കെ വലിച്ചു വാരി ഇടാതെ വിവിധ ഫോൾഡറുകൾ ഉണ്ടാക്കി അതിൽ അടുക്കി വയ്ക്കുന്ന ആളുകളും ഉണ്ട്. പക്ഷേ അതുകൊണ്ട് ഒരു റിക്കവറി/ഓർഗനൈസേഷൻ പോയിന്റ് ഓഫ് വ്യൂവിൽ നിന്ന് വലിയ മെച്ചമൊന്നും ഇല്ല. കാരണം മിക്കവാറും കേസുകളിൽ ഡെസ്ക്ടോപ്പ് എന്നത് നിങ്ങളുടെ ഓപ്പറേറ്റിങ്ങ് സിസ്റ്റം ഉള്ള പാർട്ടീഷ്യനിലെ തന്നെ ഒരു ഫോൾഡർ ആണ്. (ഹോം ഡയറക്റ്ററിക്കായി പ്രത്യേക പാർട്ടീഷ്യൻ ഉള്ള ആളുകൾക്ക് ഇത് ബാധകമല്ല). ഇങ്ങനെ ഒരു സാഹചര്യത്തിൽ നിങ്ങളുടെ ഓപ്പറേറ്റിങ്ങ് സിസ്റ്റം പ്രവർത്തിക്കാതെ ആയാൽ കമ്പനി നൽകുന്നതോ മൈക്രോസോഫ്റ്റ് നൽകുന്നതോ ആയ റിക്കവറി ഉപയോഗിക്കുമ്പോളോ ഓപ്പറേറ്റിങ്ങ് സിസ്റ്റം റീഇൻസ്റ്റാൾ ചെയ്യുമ്പോളോ ഒക്കെ ഈ ഫയലുകൾ എല്ലാം കൂടി ആണ് നഷ്ടമാകുന്നത്. ഇറ്റ് ഈസ് ഇൻക്യൂറബിൾ. (ഒരെഫക്റ്റിന് വേണ്ടീ).

അപ്പോൾ ഒരു ബെസ്റ്റ് പ്രാക്റ്റീസ്, ഓൾവേയ്സ് പാർട്ടീഷ്യൻ യുവർ ഡിസ്ക്സ്. നിങ്ങൾ ഒരു വിൻഡോസ് ഉപയോക്താവാണെന്നിരിക്കട്ടെ. വിൻഡോസ് 10 ഒരു സ്റ്റാൻഡേർഡ് ഇൻസ്റ്റാളേഷൻ കഴിഞ്ഞാൽ ഡിസ്കിൽ ഉപയോഗിക്കപ്പെടുന്നത് ഏതാണ്ട് 35 ജിബി ആണ്. ഓഫീസ് അടക്കം. ഇനി നിരവധി പ്രോഗ്രാമുകൾ കൂടി ഇൻസ്റ്റാൾ ചെയ്താലും 100 ജിബിയുടെ മുകളിൽ സ്ഥലമൊന്നും വേണ്ടിവരില്ല. (അങ്ങനെ ഒരു ഗാർഹിക ഉപയോക്താവിന് വേണ്ടിവരുന്നുണ്ടെങ്കിൽ നിങ്ങൾ ഒരു കൺസൾട്ടന്റിനെ കാണുന്നത് നല്ലതായിരിക്കും). അപ്പോൾ വിൻഡോസ് ഉള്ള സി ഡ്രൈവിനെ ഒരു 100 ജിബി ആയി ചെറുതാക്കിയാൽ (ഡിസ്ക് മാനേജ്‌മെന്റ് കൺസോളിൽ ഷ്രിങ്ക് പാർട്ടീഷ്യൻ ഓപ്ഷൻ ഉപയോഗിക്കാം) ബാക്കി ഉള്ള സ്ഥലത്ത് ഒന്നിലധികം പാർട്ടീഷ്യനുകൾ ആവശ്യാനുസരണം ഉണ്ടാക്കാവുന്നതാണ്.

പാട്ടുകൾക്കും വീഡിയോകൾക്കും ഒക്കെയായി ഒന്ന്, ഡോക്യുമെന്റുകൾക്കും ഫോട്ടോകൾക്കും ഒക്കെയായി വേറൊരെണ്ണം, സോഫ്റ്റ്‌വെയറുകൾ/ബൈനറി ഫയലുകൾക്കായി മറ്റൊരെണ്ണം എന്നിങ്ങനെ പാർട്ടീഷ്യൻ ചെയ്യുന്നത് മറ്റൊരു നല്ല പ്രാക്റ്റീസ് ആണ്. ഇതിന്റെ കാരണം റിക്കവറി ഭാഗം വരുമ്പോൾ വിശദമായി തന്നെ പറയാം. സിമ്പിളായി ബെറ്റർ ഓർഗനൈസേഷൻ എന്നതിനപ്പുറം ഇതുകൊണ്ട് പല മെച്ചങ്ങളും ഉണ്ട്. പിന്നെ യൂസറിന്റെ ഹോം ഡയറക്റ്ററിയിലെ ഡൗൺലോഡ്സ് ഫോൾഡർ, ഇതിനായി മറ്റൊരു പാർട്ടീഷ്യനിൽ ഒരു ഫോൾഡർ ഉണ്ടാക്കി ബ്രൗസർ സെറ്റിങ്ങ്സിൽ പോയി ഡൗൺലോഡുകൾ ഒക്കെ അവിടെ സേവ് ചെയ്യാൻ പറയുന്നത് മറ്റൊരു നല്ല ശീലം ആണ്. എന്തെങ്കിലും കാരണവശാൽ ഓപ്പറേറ്റിങ്ങ് സിസ്റ്റം റീഇൻസ്റ്റാൾ ചെയ്യേണ്ടി വന്നാൽ ആകെ സി ഡ്രൈവ് മാത്രം ക്ലീനപ്പ്/ഫോർമാറ്റ് ചെയ്യുക, സോഫ്റ്റ്‌വെയറുകൾ റീഇൻസ്റ്റാൾ ചെയ്യുക. മറ്റ് ഫയലുകളോ ഡൗൺലോഡുകളോ ഒന്നും നഷ്ടപ്പെടുന്നില്ല. ലിനക്സ് മെഷീനുകൾക്ക് ആണെങ്കിൽ '/' ന് ഒരു 50 ജിബി, ഡെസ്ക്ടോപ്പും ഡൗൺലോഡ്സും ഒക്കെ ഉള്ള /home  ന് ഒരു 100 ജിബി അങ്ങനെ ആണ് എന്റെ രീതി. പുതിയ വേർഷൻ വരുമ്പോൾ ഞാൻ അപ്ഗ്രേഡ് ചെയ്യാൻ നിൽക്കാറില്ല. ക്ലീൻ ഇൻസ്റ്റാൾ ചെയ്യും. പക്ഷേ /home ഫോർമാറ്റ് ചെയ്യാത്തതിനാൽ ഡെസ്ക്ടോപ്പ് ഫയലുകളോ സെറ്റിങ്ങുകളോ ഒന്നും വീണ്ടും ചെയ്യേണ്ട ആവശ്യവും വരാറില്ല.

പാർട്ടീഷ്യൻ, ഫോർമാറ്റിങ്ങ്, ഫയൽ സിസ്റ്റം തുടങ്ങിയവയെ പറ്റി -

ഒരു ഹാർഡ് ഡിസ്കിനെ പല വലിപ്പത്തിലുള്ള ചെറിയ ഭാഗങ്ങളായി വിഭജിക്കുന്ന പരിപാടി ആണ് പാർട്ടീഷ്യനിങ്ങ്. ഓരോ ഭാഗവും ഓരോ പാർട്ടീഷ്യൻ ആയിരിക്കും. ഈ ഡിസ്ക് ഒരു വിൻഡോസ് സിസ്റ്റത്തിൽ ഘടിപ്പിച്ചാൽ അത് ഓരോന്നും ഓരോ ഡ്രൈവുകൾ ആയി കാണപ്പെടും, D: E: അങ്ങനെ. ലിനക്സ് സിസ്റ്റത്തിലോ മാക്കിലോ ആണെങ്കിൽ /dev/sda1, /dev/sda2, /dev/ada1, /dev/sdb1 അങ്ങനെ അങ്ങനെ ഡിസ്ക് എങ്ങനെ സിസ്റ്റവുമായി ബന്ധിപ്പിച്ചിരിക്കുന്നു എന്നതിനനുസരിച്ച് മാറി വരുന്ന പേരുകളിൽ ആയിരിക്കും. ഡിസ്കിലെ പാർട്ടീഷ്യനുകളെ പറ്റിയുള്ള വിവരങ്ങൾ ഡിസ്കിന്റെ ആദ്യഭാഗത്ത് രേഖപ്പെടുത്തിയിരിക്കും. ഇതിന് പല രീതികൾ നിലവിലുണ്ട്. ഈയടുത്ത കാലം വരെ മാസ്റ്റർ ബൂട്ട് റെക്കോർഡ് (എം ബി ആർ) സ്കീമുകൾ ആയിരുന്നു വ്യാപകമായി ഉപയോഗിക്കപ്പെട്ടിരുന്നത്. ബയോസ് യു ഇ എഫ് ഐ യ്ക്ക് വഴിമാറിയതോടെ എം ബി ആർ ജി പി റ്റി സ്കീമുകൾക്ക് വഴിമാറി. എം ബി ആർ സ്കീമിൽ പരമാവധി നാല് പ്രൈമറി പാർട്ടീഷ്യനുകൾ മാത്രമേ ഉണ്ടാക്കാൻ സാധിക്കുമായിരുന്നുള്ളു. കൂടുതൽ വേണമെങ്കിൽ എക്സ്റ്റൻഡഡ് പാർട്ടീഷ്യനുകൾ ഉണ്ടാക്കുകയും അതിൽ ലോജിക്കൽ പാർട്ടീഷ്യനുകൾ ഉണ്ടാക്കുകയും വേണമായിരുന്നു. ജിപിറ്റി സ്കീമിൽ ഈ നിബന്ധനകൾ ഇല്ല.

ഓപ്പറേറ്റിങ്ങ് സിസ്റ്റത്തിന് ഈ പാർട്ടീഷ്യനുകളിൽ ഫയലുകൾ സൂക്ഷിക്കാനോ അതിലുള്ള ഫയലുകൾ വായിക്കുകയോ വേണമെങ്കിൽ ആ ഫയലുകൾ ഡിസ്കിൽ എവിടെയാണ് ഉള്ളത്,അതിന്റെ പേരെന്താണ്, അതിന്റെ വലിപ്പം എത്രയാണ്, അത് ആർക്കൊക്കെ വായിക്കാനുള്ള അനുവാദം ഉണ്ട് എന്നൊക്കെ ഉള്ള കാര്യങ്ങൾ അറിയേണ്ടതുണ്ട്. ഇത് ഫോൾഡറുകളുടെ കാര്യമല്ല, മറിച്ച് ഡിസ്കിനുള്ളിൽ ഫിസിക്കലായി ഫയലുകൾ എവിടെയാണുള്ളത് എന്ന് അറിയേണ്ടതുണ്ട്. ഡിസ്കിനുള്ളിലെ സ്ഥലങ്ങൾ സിലിണ്ടറുകളും സെക്റ്ററുകളും ബ്ലോക്കുകളും ആയി വിഭജിക്കപ്പെട്ടിരിക്കുന്നു. ഈ സിലിണ്ടർ, സെക്ടർ തുടങ്ങിയവ മാഗ്നറ്റിക് ഡിസ്കുകളുടെ കാലത്ത് വന്നവ ആണെങ്കിലും ആധുനിക സോളിഡ് സ്റ്റേറ്റ് ഡിവസുകളിലും ഈ മാതൃക തന്നെ ആണ് പിന്തുടരുന്നത്. ഇതിനെപ്പറ്റി കൂടുതൽ അറിയാൻ https://mymalayalamlinux.blogspot.com/2012/08/1.html  ഒന്ന് ഓടിച്ച് വായിക്കൂ. ഡിസ്ക് ഏറെക്കുറെ ഫുൾ ആണെങ്കിൽ അതിലേക്ക് ഒരു വലിയ ഫയൽ കോപ്പി ചെയ്യുന്ന സമയത്ത് ആ ഫയൽ തുടർച്ചയായ ബ്ലോക്കുകളിൽ തന്നെ ആയിരിക്കണം സൂക്ഷിക്കപ്പെടുക എന്ന് നിർബന്ധമില്ല. ഒരു ജിബി വലിപ്പമുള്ള ഫയലും ഡിസ്കിൽ തുടർച്ചയയി ഒരു ജിബിയ്ക്ക് ആവശ്യമായ ബ്ലോക്കുകളും ഇല്ലെങ്കിൽ ആ ഫയൽ ഡിസ്കിൽ പല സ്ഥലത്തായി ആയിരിക്കും സേവ് ചെയ്യപ്പെടുക. ഇതിനെ ഫ്രാഗ്‌മെന്റേഷൻ എന്ന് പറയും. ഫയലുകൾ വല്ലാതെ ഫ്രാഗ്‌മെന്റഡ് ആണെങ്കിൽ അത് ഡിസ്കിൽ നിന്ന് വായിക്കുന്ന വേഗതയെ ബാധിക്കുകയും മൊത്തത്തിൽ പെർഫോമൻസ് കുറയ്ക്കുകയും ചെയ്യും. ഡീഫ്രാഗ്മെന്റേഷൻ പ്രോഗ്രാമുകൾ  ഒരു സമയത്ത് വളരെ പോപ്പുലർ ആയിരുന്നു. അപ്പോ ഈ വിവരങ്ങൾ ഒക്കെ രേഖപ്പെടുത്തുന്ന ഫോർമാറ്റിനെ ആണ് ഫയൽ സിസ്റ്റം എന്ന് പറയുന്നത്. ഒരു പാർട്ടീഷ്യൽ ഏത് ഫയൽ സിസ്റ്റം ആണ് ഉപയോഗിക്കുന്നത് എന്ന വിവരം ആ പാർട്ടീഷ്യന്റെ തുടക്കത്തിൽ രേഖപ്പെടുത്തിയിരിക്കും. ഓപ്പറേറ്റിങ്ങ് സിസ്റ്റത്തിന് ഇത് കാണുമ്പോൾ ബാക്കി ഫയലുകൾ കാണാൻ എവിടെ നോക്കണം, പെർമിഷൻസ് എവിടെ ആയിരിക്കും ഫയലുകളുടെ ലിസ്റ്റിന് എവിടെ നോക്കണം, ഫ്രാഗ്മെന്റഡ് ഫയലിന്റെ പീസുകൾ എവിടെയൊക്കെ ആണ് എന്ന കാര്യങ്ങളെല്ലാം മനസ്സിലാകും. ഫയൽ സിസ്റ്റം ഡ്രൈവറുകൾ ആണ് ഓപ്പറേറ്റിങ്ങ് സിസ്റ്റത്തിന് ഇക്കാര്യം പറഞ്ഞ് കൊടുക്കുന്നത്. ഒരു വാലിഡായ ഫയൽ സിസ്റ്റം ഇല്ലെങ്കിൽ ആ ഡ്രൈവ് ഉപയോഗിക്കാൻ സിസ്റ്റത്തിന് സാധിക്കില്ല. യു എസ് ബി ഡിസ്കുകൾ ഒക്കെ കണക്റ്റ് ചെയ്യുമ്പോൾ യു നീഡ് റ്റു ഫോർമാറ്റ് ദ ഡ്രൈവ് എന്നൊരു മെസ്സേജ് ചെലപ്പോളെങ്കിലും കണ്ടിരിക്കും. ഒരു പാർട്ടീഷ്യനിൽ  ഏതെങ്കിലും വാലിഡായ ഫയൽ സിസ്റ്റം സജ്ജമാക്കുന്ന പ്രക്രിയയെ ആണ് ഫോർമാറ്റിങ്ങ് എന്ന് പറയുന്നത്. നിലവിൽ ആ പാർട്ടീഷ്യനിൽ ഉള്ള ഫയലുകളെ പറ്റി ഉള്ള വിവരങ്ങൾ ഈ പ്രക്രിയയിൽ നഷ്ടമാകും. അതുകൊണ്ടാണ് ഒരു ഡിസ്ക് ഫോർമാറ്റ് ചെയ്ത് കഴിഞ്ഞാൽ അതിലുണ്ടായിരുന്ന ഫയലുകൾ നഷ്ടമാകുന്നത്. ഈ നഷ്ടമായ ഫയലുകളെ വീണ്ടെടുക്കാൻ സാധിക്കും.

FAT16, FAT32, NTFS, exFAT, EXT4, BTRFS, ZFS തുടങ്ങി നിരവധി ഫയൽ സിസ്റ്റങ്ങൾ ഉണ്ട്. ഇതിൽ എൻ റ്റി എഫ് എസ്, എക്സ് ഫാറ്റ് തുടങ്ങിയവ മൈക്രോസോഫ്റ്റിന്റെ പ്രൊപ്രൈറ്ററി ഫയൽ സിസ്റ്റങ്ങൾ ആണ്. വിൻഡോസ് ഇൻസ്റ്റാൾ ചെയ്യാൻ എൻ റ്റി എഫ് എസ് ഫയൽ സിസ്റ്റമുള്ള പാർട്ടീഷ്യൻ ആവശ്യമാണ്. ഇതിൽ FAT ഫയൽ സിസ്റ്റങ്ങളിലെ സൂക്ഷിക്കാവുന്ന ഫയലിന്റെ പരമാവധി വലിപ്പം 4 ജിബി ആണ്. അതുകൊണ്ട് തന്നെ അതിലും വലിപ്പമുള്ള ഫയലുകൾ ഫാറ്റ് സിസ്റ്റം ഉപയോഗിക്കുന്ന പെൻഡ്രൈവുകളിലേക്കോ മെമ്മറി കാർഡുകളിലേക്കോ കോപ്പി ചെയ്യാൻ സാധിക്കില്ല. അവിടെ മറ്റ് ഫയൽ സിസ്റ്റങ്ങൾ ഉപയോഗിക്കേണ്ടി വരും. വിൻഡോസിലും ലിനക്സിലും മാക്കിലും നന്നായി പിന്തുണയ്ക്കപ്പെടുന്ന ഒരു ഫയൽ സിസ്റ്റം ആണ് exFAT. അതുകൊണ്ട് പോർട്ടബിളായ ഡിസ്കുകൾ ഈ ഫയൽ സിസ്റ്റം ഉപയോഗിച്ച് ഫോർമാറ്റ് ചെയ്താൽ അത് മിക്കവാറും എല്ലാ ഉപകരണങ്ങിലുലും ഉപയോഗിക്കാൻ പറ്റും. ലിനക്സിൽ NTFS നന്നായി പിന്തുണയ്ക്കപ്പെടുന്നുണ്ട്. അതുകൊണ്ട് ലിനക്സിലും വിൻഡോസിലും ഉപയോഗിക്കാൻ ആണെങ്കിൽ ഇത് നല്ലൊരു ഓപ്ഷനാണ്. ലിനക്സ് സിസ്റ്റങ്ങളിൽ മാത്രം ഉപയോഗിക്കാൻ EXT4/3/2 ഒക്കെ ഉപയോഗിക്കാം. ഈ ഫയൽ സിസ്റ്റങ്ങൾ വിൻഡോസിൽ തേർഡ് പാർട്ടി പ്രോഗ്രാമുകൾ ഉപയോഗിച്ച് പ്രവർത്തിപ്പിക്കാൻ സാധിക്കും.

ഓരോ തവണയും പുതിയ ഫയലുകൾ കോപ്പി ചെയ്യപ്പെടുമ്പോളും മറ്റും ആ ഫയലിനെ പറ്റി ഉള്ള വിവരങ്ങൾ ഫയൽ സിസ്റ്റത്തിന്റെ റെക്കോർഡുകളിൽ രേഖപ്പെടുത്തേണ്ടതുണ്ട്. ഇതിനെ ഫയൽ സിസ്റ്റം മെറ്റാഡാറ്റ എന്ന് പറയാം. ഈ മെറ്റാഡാറ്റ അടിസ്ഥാനമാക്കി ആണ് ഫയലിനെ പറ്റിയുള്ള വിവരങ്ങൾ ഓപ്പറേറ്റിങ്ങ് സിസ്റ്റം മനസ്സിലാക്കുന്നത്. എൻ റ്റി എഫ് എസ്സിൽ ഇത് എം എഫ് റ്റി - മാസ്റ്റർ ഫയൽ ടേബിൾ എന്നും എക്സ്റ്റൻഡഡ് ഫയൽ സിസ്റ്റങ്ങളിൽ സൂപ്പർ ബ്ലോക്കുകൾ എന്നും ഒക്കെ അറിയപ്പെടുന്നു. ഈ മെറ്റാഡാറ്റയ്ക്ക് കേട് സംഭവിച്ചാൽ സിസ്റ്റത്തിന് ഫയൽ സിസ്റ്റം മനസ്സിലാക്കാൻ സാധിക്കാതെ വരും. അത് സംഭവിക്കുന്നതിന്റെ തീവ്രതയ്ക്കനുസരിച്ച് ചിലപ്പോൾ ചില ഫയലുകൾ മാത്രം, ചിലപ്പോൾ മുഴുവൻ ഫയലുകളും ആക്സസ്സ് ചെയ്യാൻ സാധിക്കാതെ വരും.ഫയൽ സിസ്റ്റം കറപ്റ്റ് ആയി എന്ന് പറയാം. ഇത് സംഭവിക്കുന്നതിന്റെ കാരണങ്ങൾ ഹാർഡ്‌വെയർ തകരാറുകൾ ആവാം. അല്ലെങ്കിൽ മുഴുവനാകാത്ത ഓപ്പറേഷനുകൾ. ഹാർഡ് ഡിസ്കുകൾ അടങ്ങുന്ന സെക്കന്ററി സ്റ്റോറേജ് ഉപകരണങ്ങൾ താരതമ്യേന വേഗത കുറഞ്ഞവയാണ്. സിപിയുവും മെയിൻ മെമ്മറിയും ഒക്കെ ഇവയെക്കാൾ വളരെ വേഗത്തിൽ ഡാറ്റ കൈമാറ്റം ചെയ്യും. അപ്പോൾ ഡിസ്കിലേയ്ക്ക് എഴുതേണ്ടിവരുന്ന അവസരങ്ങളിൽ ആ പ്രക്രിയ വേഗത്തിലാക്കാൻ ബഫറുകൾ/കാഷേ കൾ ഉപയോഗിക്കും. ശരിക്കും ഡിസ്കിലേക്ക് ഉടനേ എഴുതാതെ തൽക്കാലം മെമ്മറിയിലേക്ക് തന്നെ എഴിതിയിട്ട് പിന്നീട് സൗകര്യം പോലെ ഡിസ്കിലേക്ക് എഴുതുക ആണ് പതിവ്. ഇനി ഡിസ്കിലേക്ക് എഴുതിയാൽ തന്നെ അതിൽ ഹാർഡ്‌വെയർ ബഫറുകൾ കാണും. അതിൽ നിന്ന് ബ്ലോക്കിലേയ്ക്കുള്ള ആ ഫൈനൽ റൈറ്റ് പിന്നെയും താമസിച്ചായിരിക്കും നടക്കുക. ഇതിനിടയിൽ പവർ നഷ്ടപ്പെട്ടാൽ, ഡിസ്ക് ഊരിയെടുത്താൽ ഒക്കെ ഡാറ്റ കറപ്ഷൻ ഉണ്ടാകാം. ആധുനിക സോളിഡ് സ്റ്റേറ്റ് സ്റ്റോറേജ് ഡിവസുകളിൽ ഈ താമസങ്ങൾ ഒക്കെ വളരെ കുറവാണ്. അതിനാൽ തന്നെ അവയിൽ ഇതുപോലെ ഉള്ള പ്രശ്നങ്ങളും കുറവായിരിക്കും. പക്ഷേ അവയുടെ വില വളരെ കൂടുതൽ ആണ്.

എന്തെങ്കിലും കാരണം കൊണ്ട് ഈ മെറ്റാഡാറ്റ തകരാറിലായാൽ ഡിസ്കിലെ ഫയലുകൾ തിരികെ കിട്ടാനും ഇത് പരിഹരിക്കാനും എന്തൊക്കെ ചെയ്യാൻ സാധിക്കും എന്ന കാര്യം അടുത്ത ഭാഗത്തിൽ.

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

Monday, September 08, 2014

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

ഒരു ഡെസ്ക്ടോപ്പ് കമ്പ്യൂട്ടറിനാവശ്യമായ ലിനക്സ് കെർണൽ കമ്പൈൽ ചെയ്യുകയും പ്രവർത്തിപ്പിക്കുകയും ചെയ്യുന്ന വിധം കഴിഞ്ഞ പോസ്റ്റുകളിൽ പറഞ്ഞിരുന്നല്ലോ. ഇനി ഒരു ആം പ്രോസസ്സർ അധിഷ്ഠിത കമ്പ്യൂട്ടറിനായി ലിനക്സ് കെർണൽ എങ്ങനെ കമ്പൈൽ ചെയ്യാം എന്ന് പരിശോധിക്കാം. എനിക്ക് പരിചിതമായ പ്ലാറ്റ്‌ഫോം എന്ന നിലയിൽ ആണ് ARM തിരഞ്ഞെടുത്തത്. വിശദീകരണങ്ങൾ പരമാവധി ജെനറിക് ആക്കി ഏത് ആർക്കിട്ടെക്ചറിനും ആവശ്യമായ കെർണൽ ഇമേജ് തയ്യാറാക്കാൻ കഴിയുന്ന രൂപത്തിലാക്കാനും ഇതിനു പിന്നിലെ വിശദാംശങ്ങൾ പരമാവധി വ്യക്തമാക്കാനും ശ്രദ്ധിക്കാം. വേർസാറ്റൈൽ എക്സ്പ്രസ്സ് എന്ന ആം അധിഷ്ഠിത ഡെവലപ്പ്‌മെന്റ് ബോർഡിനായി ലിനക്സ് കെർണൽ കമ്പൈൽ ചെയ്യാൻ നോക്കാം. ഈ ബോർഡ് qemu ഇമുലേറ്ററിൽ നല്ല രീതിയിൽ പിന്തുണക്കപ്പെട്ടിരിക്കുന്നതിനാൽ നമ്മുടെ കമ്പ്യൂട്ടർ ഉപയോഗിച്ച് തന്നെ നാം തയ്യാറാക്കിയ ലിനക്സ് കെർണൽ പരീക്ഷിക്കുകയും ചെയ്യാം. ഡെക്സ്ടോപ്പ് കമ്പ്യൂട്ടറിനായി കെർണൽ കമ്പൈൽ ചെയ്തപ്പോൾ അതിനാവശ്യമായ റൂട്ട് ഫയൽ സിസ്റ്റം അതേ കമ്പ്യൂട്ടറിൽ തന്നെ ഉണ്ടാകുമെന്ന വിശ്വാസത്തിൽ ആ ഭാഗം വിശദീകരിച്ചിരുന്നില്ല. ഇവിടെ ഒരു ലിനക്സ് അധിഷ്ഠിത സിസ്റ്റം ഉപയോഗിക്കാൻ അവശ്യം വേണ്ട കമാന്റുകൾ ഒക്കെ ഉൾക്കൊള്ളുന്ന ഒരു റൂട്ട് ഫയൽ സിസ്റ്റവും എങ്ങനെ തയ്യാറാക്കാം എന്ന് പരിശോധിക്കാം. 

ലിനക്സ് കെർണൽ സി പ്രോഗ്രാമ്മിങ്ങ് ഭാഷയിലും അസംബ്ലി ഭാഷകളിലും ആയിട്ടാണ് എഴുതപ്പെട്ടിരിക്കുന്നത്. ഓരോ ആർക്കിട്ടെക്ചറീനും അവയുടേതായ അസംബ്ലി ഭാഷ ഉണ്ട്. എന്നാൽ സി ഭാഷ പൊതുവായുള്ളതാണ്. സി ഭാഷ പോർട്ടബിൾ ആണെന്ന് പറയുന്നതിലെ കാരണം ഒരേ സി പ്രോഗ്രാം തന്നെ വിവിധ പ്ലാറ്റ്ഫോമുകളിൽ പ്രവർത്തിപ്പിക്കാം എന്നുള്ളതാണ്. ഏതെങ്കിലും ഒരു പ്ലാറ്റ്ഫോമിൽ മാത്രം ലഭ്യമായ പ്രത്യേക സൗകര്യങ്ങൾ ഒന്നും നേരിട്ട് ഉപയോഗിക്കാത്തിടത്തോളം കാലം ഒരേ സി പ്രോഗ്രാമിനെ തന്നെ ഓരോ പ്ലാറ്റ്ഫോമിനും ഉള്ള കമ്പൈലർ ഉപയോഗിച്ച് കമ്പൈൽ ചെയ്ത് ആ പ്ലാറ്റ്ഫോമിൽ ഉപയോഗിക്കാൻ സാധിക്കും. ലിനക്സ് കെർണലിലെ ആർക്കിട്ടെക്ചർ ഡിപ്പൻഡന്റും ഇൻഡിപ്പെൻഡന്റും ആയ ഭാഗങ്ങളെപ്പറ്റി ഈ പോസ്റ്റിൽ പറഞ്ഞിട്ടുണ്ട്. ആർക്കിട്ടെക്ചർ ഇൻഡിപ്പെൻഡന്റ് ആയ ഭാഗങ്ങൾ (എല്ലാ ആർക്കിട്ടെക്ചറുകൾക്കും പൊതുവായുള്ളവ) എല്ലാം സി യിൽ തന്നെ ആണ് എഴുതപ്പെട്ടിട്ടുള്ളത്. ആർക്കിട്ടെക്ചർ ഡിപ്പൻഡന്റ് ആയ ഭാഗങ്ങളിൽ ചിലതൊക്കെ ആ ആർക്കിട്ടെക്ചറിന്റെ അസംബ്ലി ഭാഷയിലും. എളുപ്പത്തിൽ പറഞ്ഞാൽ ഒരു ആർക്കിട്ടെക്ചറിനായുള്ള സി കമ്പൈലർ ഉപയോഗിച്ച് ലിനക്സ് കെർണൽ കമ്പൈൽ ചെയ്താൽ കെർണൽ ആ ആർക്കിട്ടെക്ചറിൽ ഉപയോഗിക്കാൻ സാധിക്കും. പ്രായോഗികമായി കാര്യങ്ങൾ ഇത്ര ലളിതമല്ല. 

ലിനക്സ് കെർണലിൽ നിരവധി ആർക്കിട്ടെക്ചറുകൾക്ക് ഉള്ള പിന്തുണ ഉണ്ട്. ഇതിൽ പലഭാഗങ്ങളും അതാത് ആർക്കിട്ടെക്ചറുകളുടെ അസംബ്ലി ഭാഷയിൽ എഴുതപ്പെട്ടവ ആയിരിക്കും. x86 അസംബ്ലി ഭാഷ ARM അസംബ്ലറിനു മനസ്സിലാവില്ല. മറിച്ചും. അപ്പോൾ ആം പ്രോസസ്സറിനായി ആം കമ്പൈലർ ഉപയോഗിച്ച് ലിനക്സ് കെർണൽ കമ്പൈൽ ചെയ്യുമ്പോൾ x86 ആർക്കിട്ടെക്ചറീനു മാത്രമായിള്ള ഭാഗങ്ങൾ കമ്പൈൽ ചെയ്യപ്പെടാൻ പാടില്ല. ഒരു ആർക്കിട്ടെക്ചറിനായി കെർണൽ കമ്പൈൽ ചെയ്യുമ്പോൾ ആ ആർക്കിട്ടെക്ചറിനു മാത്രമായുള്ള ഭാഗങ്ങളും പൊതുവായ ഭാഗങ്ങളും മാത്രമാണ് കമ്പൈൽ ചെയ്യപ്പെടേണ്ടത്. മറ്റ് ആർക്കിട്ടെക്ചറുകൾക്കായുള്ള ഭാഗങ്ങൾ ഒഴിവാക്കടുകയും വേണം. ഇത്തരം കാര്യങ്ങൾ നാം സ്വയം ചെയ്യേണ്ട ആവശ്യമില്ല. ലിനക്സ് കെർണൽ കമ്പൈലേഷൻ make പ്രോഗ്രാം ഉപയോഗിച്ചാണ് നടത്തപ്പെടുന്നത് എന്ന് നേരത്തേ പറഞ്ഞിട്ടുണ്ടല്ലോ. ഒരു ആർക്കിട്ടെക്ചർ തെരഞ്ഞെടുക്കുന്ന സമയത്ത് നിർവ്വചിക്കപ്പെടുന്ന ഷെൽ എൻവയോണ്മെന്റ് വേരിയബിളുകളുടെ മൂല്യത്തിന്റെ അടിസ്ഥാനത്തിൽ make പ്രോഗ്രാം വിവിധ മേക്ക് ഫയലുകൾ പരിശോധിച്ച് കമ്പൈൽ ചെയ്യപ്പെടേണ്ട ഭാഗങ്ങൾ തെരഞ്ഞെടുത്തുകൊള്ളും.

കമ്പൈലേഷൻ ആരംഭിക്കാൻ നമുക്ക് ആദ്യം ലിനക്സ് സോഴ്സ് കോഡ് വേണം. അത് എങ്ങനെ ലഭിക്കും എന്ന കാര്യം ഇവിടെ പറഞ്ഞിരിക്കുന്നത് നോക്കൂ. ഇനി വേണ്ടത് ഒരു ആം ക്രോസ്സ് കമ്പൈലർ ആണ്. ഞാൻ സാധാരണയായി ഉപയോഗിക്കുന്നത് മെന്റർ ഗ്രാഫിക്സിന്റെ ഫ്രീ ടൂൾചെയിൻ ആണ്. ലിനാരോയുടെ ടൂൾചെയിനും ഉപയോഗിക്കാം. ടൂൾ ചെയിനിൽ എന്തൊക്കെ ഉൾപ്പെട്ടിരിക്കുന്നു എന്ന് കഴിഞ്ഞ പോസ്റ്റിൽ പറഞ്ഞിരുന്നല്ലോ. ഈ പ്രോഗ്രാമുകളുടെ പേരും കമാന്റും ചുവടെ ചേർക്കുന്നു.
  1. സി കമ്പൈലർ/കമ്പൈലർ ഡ്രൈവർ - gcc (സി കമ്പൈലർ കമാൻഡ് സാധാരണയായി cc1 എന്നായിരിക്കും. gcc കമാൻഡ് അതിന്റെ പ്രവർത്തിപ്പിച്ചുകൊള്ളും‌)
  2. പ്രീ പ്രോസസ്സർ - cpp
  3. ലിങ്കർ/ലോഡർ - ld
  4. ഒബ്ജക്റ്റ് കോപ്പി - objcopy
  5. സ്ട്രിപ് - strip
  6. അസംബ്ലർ - as
  7. ആർക്കൈവർ - ar
  8. ഡീബഗ്ഗർ - gdb
ഈ കമാൻഡുകൾ തന്നെ ടൂൾ ചെയിനിനനുസരിച്ച് വ്യത്യാസപ്പെട്ടിരിക്കും. ഹോസ്റ്റ് കമ്പൈലറും ടാർഗറ്റ് ക്രോസ്സ് കമ്പൈലറും തമ്മിൽ മാറിപ്പോകാതിരിക്കാൻ ഈ പേരുമാറ്റം സഹായിക്കുന്നു. ടൂൾ ചെയിനുകൾക്ക് പേരിടാൻ പൊതുവേ അവലംബിച്ചിരിക്കുന്ന രീതി arch-vendor-(os-)abi എന്നാണ്. arch - ആർക്കിട്ടെക്ചർ (arm, x86, ppc, sh), vendor - ടൂൾ ചെയിൽ നൽകുന്ന കമ്പനി (മിക്കവാറും ഫ്രീ ടൂൾചെയിനുകൾക്ക് ഇത് none എന്നായിരിക്കും), os - ടൂൾചെയിൻ ഏതെങ്കിലും ഓപ്പറേറ്റിങ്ങ് സിസ്റ്റത്തെ പിന്തുണക്കുന്നുണ്ടോ എന്നത്, abi - ആപ്ലിക്കേഷൻ ബൈനറി ഇന്റർഫേസ്. മെന്റർ ഗ്രാഫിക്സ് ടൂൾചെയിനിന്റെ പേര് മിക്കവാറൂം arm-none-linux-gnueabi എന്നായിരിക്കും (മറ്റ് പേരുകളിലും ഉണ്ട്). ഈ ടൂൾ ചെയിൻ ഇൻസ്റ്റാൾ ചെയ്താൽ arm-none-linux-gnueabi-gcc, arm-none-linux-gnueabi-ld, arm-none-linux-gnueabi-as, arm-none-linux-gnueabi-strip തുടങ്ങിയ പ്രോഗ്രാമുകൾ ലഭ്യമാകും. (മുകളിൽ പറഞ്ഞിരിക്കുന്ന പ്രോഗ്രാം കമാൻഡുകൾക്കൊപ്പം arm-none-linux-gnueabi- എന്ന് ചേർത്താൽ മതി. ഇതിലെ arm-none-linux-gnueabi- യെ നമുക്ക് ടൂൾ ചെയിൻ പ്രിഫിക്സ് എന്ന് വിളിക്കാം). ടൂൾ ചെയിൻ സിസ്റ്റത്തിൽ ഇൻസ്റ്റാൾ ചെയ്താൽ ആ പാത്ത് അടക്കം ടൂൾ ചെയിൻ പ്രിഫിക്സിൽ ചേർക്കാം. അല്ലെങ്കിൽ ടൂൾ ചെയിന്റെ bin ഡയറക്ടറി PATH വേരിയബിളിൽ ചേർക്കണം. മെന്റർ ഗ്രാഫിക്സ് ടൂൾ ചെയിൻ ഒരു ഇൻസ്റ്റാളർ അടക്കമാണ് വരുന്നത്. ഉബുണ്ടു പാക്കേജ് മാനേജറിൽ തന്നെ ആം ടൂൾ ചെയിൻ ലഭ്യമാണ്. പേരിൽ മാറ്റങ്ങൾ ഉണ്ടാവാം. ഞാൻ ടൂൾ ചെയിൻ ഇൻസ്റ്റാൾ ചെയ്തിരിക്കുന്നത് /opt/arm-2011.03/bin/ എന്ന ഡയറക്ടറിയിൽ ആണ്. /opt/arm-2011.03/ എന്ന ഡയറക്ടറിയിൽ arm-none-linux-gnueabi, bin, ib, libexec, share എന്നീ ഡയറക്ടറികൾ കാണാം. ഇതിൽ bin ഡയറക്ടറിയിൽ ടൂൾചെയിനിലെ വിവിധ പ്രോഗ്രാമുകൾ കാണും‌. ഇവിടെ arm-none-linux-gnueabi- എന്ന പേരിൽ തുടങ്ങുന്ന വിവിധ ഫയലുകൾ. ഇൻസ്റ്റാളേഷൻ പാത്ത് അടക്കം എന്റെ സിസ്റ്റത്തിലെ ടൂൾ ചെയിൻ പ്രിഫിക്സ് /opt/arm-2011.03/bin/arm-none-linux-gnueabi- എന്നായിരിക്കും.

ഇനി കെർണൽ കമ്പൈലേഷൻ ആരംഭിക്കാം. ആദ്യം നമ്മൾ arm ആർക്കിട്ടെക്ചറിനുള്ള കെർണൽ ആണ് കമ്പൈൽ ചെയ്യാൻ ഉദ്ദേശിക്കുന്നത് എന്ന് സിസ്റ്റത്തോട് പറയണം. പിന്നെ അതിനായി ഉപയോഗിക്കേണ്ട ടൂൾ ചെയിൻ ഏതാണെന്നും. അതിനായി ARCH, CROSS_COMPILE എന്നീ വേരിയബിളുകൾ ഉപയോഗിക്കുന്നു. ഇവയ്ക് മൂല്യങ്ങൾ ഒന്നും പ്രതിപാദിക്കാതെ make കമാൻഡ് ഉപയോഗിക്കുമ്പോൾ അത് നിലവിലെ സിസ്റ്റത്തിനാവശ്യമായ മൂല്യങ്ങൾ ഈ വേരിയബിളുകൾക്ക് സ്വയം നൽകും. അതിനാൽ കഴിഞ്ഞ തവണ നമുക്ക് ഇക്കാര്യം ചെയ്യേണ്ടി വന്നില്ല. ഇതൊഴികെ ബാക്കി കാര്യങ്ങളിൽ ഒന്നും മാറ്റമില്ല. ഉപയോഗിക്കേണ്ട കമാന്റുകൾ ചുവടെ ചേർക്കുന്നു.

1. ടാർഗറ്റ് ആർക്കിട്ടെക്ചർ സജ്ജീകരിക്കുക - export ARCH=arm
2. ടൂൾ ചെയിൻ പ്രിഫിക്സ് സജ്ജീകരിക്കുക - export CROSS_COMPILE=/opt/arm-2011.03/bin/arm-none-linux-gnueabi- (അവസാനത്തെ - പ്രധാനമാണ്. അതുപോലെ ഇത് ടൂൾ ചെയിൻ ഇൻസ്റ്റാളേഷനനുസരിച്ച് മാറും എന്നും ഓർക്കുക)
3. ടാർഗറ്റ് കെർണൽ കോൺഫിഗറേഷൻ തെരഞ്ഞെടുക്കുക - ആം പ്രോസസ്സറിനുള്ള കോൺഫിഗറേഷനുകൾ ഒക്കെ arch/arm/configs എന്ന ഡയറക്ടറിയിൽ ആയിരിക്കും ഉണ്ടാവുക. ARCH=arm എന്ന് സെറ്റ് ചെയ്തിരിക്കുന്നതിനാൽ ഈ പാത്ത് മുഴുവനായി പ്രതിപാദിക്കേണ്ട ആവശ്യമില്ല. നമുക്കാവശ്യമുള്ള കോൺഫിഗ് ഫയൽ vexpress_defconfig ആണ്. ഇത് സെറ്റ് ചെയ്യാൻ make vexpress_defconfig
4. ഇനി കെർണൽ ബിൽഡ് ചെയ്യാൻ make zImage, make bzImage, make all ഏതെങ്കിലും ഒരു കമാന്റ് ഉപയോഗിക്കുക. -j ഓപ്ഷനും ഉപയോഗിക്കാം.

ഈ നാലു സ്റ്റെപ്പുകൾ ആണ് ഏത് ആർക്കിട്ടെക്ചറിനുള്ള കെർണൽ കമ്പൈൽ ചെയ്യാൻ ആണെങ്കിലും ഉപയോഗിക്കേണ്ടത്. ക്രോസ്സ് കമ്പൈലേഷൻ അല്ലെങ്കിൽ ആദ്യത്തെ രണ്ട് സ്റ്റെപ്പുകളും ആവശ്യമില്ല. മൂന്നാമത്തെ സ്റ്റെപ്പ് make defconfig എന്ന് മാത്രം മതിയാവുകയും ചെയ്യും. make menuconfig ഉപയോഗിച്ച് കോൺഫിഗറേഷനിൽ മാറ്റങ്ങൾ വരുത്തുകയും ആവാം. ബിൽഡ് പൂർണ്ണമായിക്കഴിഞ്ഞാൽ കെർണൽ ഇമേജ് arch/arm/boot ഡയറക്ടറിയിൽ നിന്നും കോപ്പി ചെയ്യാം.

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

ക്രോസ്സ് കമ്പൈലേഷൻ, ക്രോസ്സ് ഡെവലപ്പ്‌‌മെന്റ്‌‌

ലിനക്സ് കെർണൽ ഡെസ്ക്ടോപ്പ് കമ്പ്യൂട്ടറുകളിൽ മാത്രമല്ല പ്രവർത്തിക്കുക എന്ന് പറഞ്ഞിട്ടുണ്ടല്ലോ. ഓരോ സിസ്റ്റങ്ങളിലും പ്രവർത്തിക്കുന്നതിനായി ആ സിസ്റ്റത്തിനു വേണ്ടി ലിനക്സ് കെർണൽ കമ്പൈൽ ചെയ്യേണ്ടതുണ്ട്. കെർണൽ കമ്പൈലേഷൻ നടത്താൻ വലിയ മോശമല്ലാത്ത ഒരു കമ്പ്യൂട്ടർ സിസ്റ്റം ആവശ്യമാണ്. കെർണൽ സോഴ്സ് കോഡ് സൂക്ഷിക്കാൻ ആവശ്യമായ ഡിസ്ക് സ്പേസ്, കമ്പൈലറിനു പ്രവർത്തിക്കാൻ ആവശ്യമായ റാം, കമ്പൈലേഷൻ പ്രക്രിയ അത്യാവശ്യം വേഗത്തിൽ നടത്താനാവശ്യമായ പ്രോസസ്സിങ്ങ് ശക്തി ഒക്കെ ഇതിനായി വേണം. ലിനക്സ് അധിഷ്ഠിതമായ ഒരു ഓപ്പറേറ്റിങ്ങ് സിസ്റ്റത്തിനൂ പ്രവർത്തിക്കാൻ സാധാരണ‌‌ഗതിയിൽ ആവശ്യമായതിനെക്കാൾ അല്പം കൂടിയ സാഹചര്യങ്ങൾ ഇതിന് ആവശ്യമാണ്. മറ്റൊരു പ്രധാന ആവശ്യം ആ ഉപകരണത്തിൽ പ്രവർത്തിക്കാനായി കമ്പൈൽ ചെയ്യപ്പെട്ട ഒരു കമ്പൈലറും വേണം. ഈ ആവശ്യങ്ങൾ ഒക്കെ എളുപ്പത്തിൽ സാധിക്കുന്നവയല്ല. അതുകൊണ്ട് ഇതൊക്കെ സാധാരണ ഉണ്ടാവുന്ന ഒരു ഡെസ്ക്ടോപ്പ് കമ്പ്യൂററോ‌ മറ്റോ ഉപയോഗിച്ച് ഇക്കാര്യങ്ങൾ ചെയ്യുന്നതായിരിക്കും എളുപ്പം.

ക്രോസ്സ് ഡെവലപ്പ്മെന്റ് പറയുന്നത് ഒരു പ്ലാറ്റ്ഫോമിനാവശ്യമായ പ്രോഗ്രാമുകളും മറ്റും തയ്യാറാക്കുന്നതിന് മറ്റൊരു കമ്പ്യൂട്ടർ ഉപയോഗിക്കുന്നതിനാണ്. ഇതിൽ ഡെവലപ്പ്‌‌മെന്റിനായി ഉപയോഗിക്കുന്ന കമ്പ്യൂട്ടറിനെ ഹോസ്റ്റ് എന്നും ഏത് ഉപകരണത്തിനായാണോ ഡെവലപ്പ്‌‌മെന്റ് നടത്തുന്നത് അതിനെ ടാർഗറ്റ് എന്നും വിളിക്കുന്നു. ടാർഗറ്റ് ഉപകരണത്തിന് അനുയോജ്യമായ പ്രോഗ്രാമുകൾ തയ്യാറാക്കുന്നതിനാവശ്യമായ ഹോസ്റ്റ് കമ്പ്യൂട്ടറിൽ പ്രവർത്തിക്കുന്ന പ്രോഗ്രാമുകൾ ക്രോസ്സ് ഡെവലപ്പ്‌‌മെന്റിന് ആവശ്യമാണ്. ഇവയെ മൊത്തത്തിൽ ക്രോസ്സ് കമ്പൈലേഷൻ ടൂൾചെയിൻ എന്ന് വിളിക്കുന്നു. ഒരു ടൂൾചെയിനിൽ കുറഞ്ഞത് ഒരു കമ്പൈലർ, ലിങ്കർ, ലോഡർ, അസ്സംബ്ലർ, പ്രീ പ്രോസസ്സർ, ബൈനറി ഫയലുകളിൽ വിവിധ രീതികളിലുള്ള മാറ്റങ്ങൾ വരുത്താനാവശ്യമായ പ്രോഗ്രാമുകൾ, ഏത് പ്രോഗ്രാമിങ്ങ് ഭാഷയുടെ കമ്പൈലർ ആണോ ആ ഭാഷയുടെ അടിസ്ഥാന ലൈബ്രറി ഫയലുകൾ എന്നിവ ഉണ്ടായിരിക്കും. 

ഒരു ചങ്ങലയിലെ കണ്ണികൾ പോലെ ഒന്നിനോടൊന്ന് ബന്ധപ്പെട്ട് ഒന്നിനു ശേഷം ഒന്നായി പ്രവർത്തിക്കുന്ന പ്രോഗ്രാമുകളുടെ കൂട്ടം എന്ന അർഥത്തിൽ ആണ് ഇതിനെ ടൂൾചെയിൻ എന്ന് പറയുന്നത്. ഒരു സി പ്രോഗ്രാമിനെ അതിന്റെ സോഴ്സ് കോഡിൽ നിന്ന് എക്സിക്യൂട്ടബിൾ ആക്കി മാറ്റുന്നത് പ്രീപ്രോസസ്സർ, കമ്പൈലർ, അസംബ്ലർ, ലിങ്കർ എന്നീ പ്രോഗ്രാമുകൾ അവയെ പരാമർ‌ശിച്ചിരിക്കുന്ന ക്രമത്തിൽ പ്രവർത്തിച്ചാണ്. സാധാരണ നാം ഉപയോഗിക്കുന്ന ജിസിസി കമ്പൈലറിലെ gcc കമാന്റ് ഒരു കമ്പൈലർ ഡ്രൈവർ പ്രോഗ്രാം ആയിരിക്കും. മേൽപ്പറഞ്ഞ പ്രോഗ്രാമുകളെ ആ ക്രമത്തിൽ പ്രവർത്തിപ്പിക്കുകയാണ് ഈ കമാന്റിന്റെ ധർമ്മം.

ഉപയോഗിക്കുന്ന പ്ലാറ്റ്ഫോമിനനുസരിച്ച് ജിസിസി അധിഷ്ഠിതമായ സൗജന്യ ടൂൾ ചെയിനുകൾ വിവിധ ഇടങ്ങളിൽ നിന്നും ലഭ്യമാണ്. ലിനാരോ, മെന്റർ ഗ്രാഫിക്സ് തുടങ്ങിയവർ ARM പ്രോസസ്സറിനാവശ്യമായ ബൈനറികൾ നിർമ്മിക്കാൻ സാധിക്കുന്ന x86 അധിഷ്ഠിത കമ്പ്യൂട്ടറുകളിൽ പ്രവർത്തിക്കുന്ന ടൂൾ‌ ചെയിനുകൾ ലഭ്യമാക്കുന്നുണ്ട്. 

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

ആൻഡ്രോയിഡ് ഇമുലേറ്റർ QEMU എന്ന ഇമുലേറ്റർ അടിസ്ഥാനമാക്കി നിർമ്മിക്കപ്പെട്ടിട്ടുള്ളതാണ്. ലിനക്സ് അധിഷ്ഠിത സിസ്റ്റങ്ങളിൽ നിന്ന് x86, ARM തുടങ്ങി നിരവധി ആർക്കിട്ടെക്ചറുകളെ ഇമുലേറ്റ് ചെയ്യാൻുപയോഗിക്കാവുന്നതും വളരെ ശക്തവും പ്രവർത്തനക്ഷമവും ഉപകാരപ്രദവും ആയ ഒരു പ്രോഗ്രാമാണ് ഇത്. ഉബുണ്ടു, ഫെഡോറ തുടങ്ങി എല്ലാ പ്രധാന ലിനക്സ് ഡിസ്ട്രിബ്യൂഷനുകളിലും പാക്കേജ് മാനേജറുകൾ വഴി ഇത് ഇൻസ്റ്റാൾ ചെയ്യാൻ സാധിക്കും. 

x86 ആർക്കിട്ടെക്ചർ ഇമുലേറ്റ് ചെയ്യാൻ (പ്രധാനമായും IA32) ഉപയോഗിക്കാവുന്ന മറ്റൊരു ഇമുലേറ്ററാണ് Bochs. x86 ആർക്കിട്ടെക്ചർ അധിഷ്ഠിതമായ ഒരു കമ്പ്യൂട്ടർ മുഴുവനും ഉൾക്കൊള്ളിച്ചിരിക്കുന്ന ഒരു സോഫ്റ്റ്‌വെയർ ആണ് ഇത് എന്ന് പറയാം. ബയോസും എല്ലാം ഇതിൽ ഉൾക്കൊള്ളിച്ചിട്ടുണ്ട്. ഡോസ്, വിൻഡോസ്, ലിനക്സ് ഒക്കെ ഇതിൽ പ്രവർത്തിപ്പിക്കാം. 

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

QEMU പാക്കേജിലെ qemu-system-arm കമാന്റ് ഉപയോഗിച്ച് അതിൽ നിർവ്വചിക്കപെട്ടിട്ടുള്ള നിരവധി ആം അധിഷ്ഠിത ഡെവലപ്പ്മെന്റ് പ്ലാറ്റ്ഫോമുകൾ ഹാർഡ്‌വെയർ ഇല്ലാതെ തന്നെ ഉപയോഗിക്കാൻ സാധിക്കും. വേർസാറ്റൈൽ എക്സ്പ്രസ്സ്, ബീഗിൾ ബോർഡ്, നോകിയ എൻ800, എൻ810 ടാബ്ലറ്റുകൾ, ക്യൂബി ബോർഡ് തുടങ്ങി നിരവധി മെഷീനുകൾ ഇതിന്റെ പുതിയ പതിപ്പിൽ ലഭ്യമാണ്. ഇതിലൊന്നിൽ ഒരു മുഴുവൻ ലിനക്സ് സിസ്റ്റം സജ്ജമാക്കി പ്രവർത്തിപ്പിക്കുന്നത് എങ്ങനെയെന്ന് നമുക്ക് അടുത്ത ഭാഗത്തിൽ പരിശോധിക്കാം. ക്രോസ്സ് കമ്പൈലേഷൻ, റൂട്ട് ഫയൽ സിസ്റ്റം തയ്യാറാക്കൽ, കമാന്റ് ലൈൻ പരാമീറ്ററുകൾ, ബൂട്ടിങ്ങ്, കൺസോൾ ഒക്കെ വിശദമായി മനസ്സിലാക്കാൻ ഇത് സഹായകമായിരിക്കും.

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 ഡയറക്റ്ററിയിലേക്ക് കോപ്പി ചെയ്ത ശേഷം ബൂട്ട് ലോഡറിന്റെ കോൺഫിഗറേഷൻ ഫയലിൽ ഈ ഇമേജിന്റെ പാത്ത് ചേർത്താലും മതി.

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

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