#!/bin/sh # ---------------------------------------------------------------------------- # # Script to generate kernel packages separate from main system build # # Creation: 2010-03-06 starwarsfan # Last modified: $Id$ # # ---------------------------------------------------------------------------- set -e # Exit if any command exits with non-zero status . common.inc.sh doCleanup=true fetchPackages=true while [ $# -gt 0 ] do arg="$1" shift case "$arg" in '-udev127') # use the latest udev version for kernel 2.6.18 udev_version='127' ;; '-v') doVerbose=yes verbose='-v' ;; '--no-cleanup') doCleanup=false cleanup=$arg ;; '--no-fetch') fetchPackages=false ;; *) echo "Invalid parameter: $arg" exit 1 ;; esac done function cleanUp () { echo "Removing temporary files ..." rm -fr $tmp_path echo "Done." } function getModuleFile() { local driver=$1 local deepkernel_path=$2 grep "/$driver\.ko:" $deepkernel_path/modules.dep | sed 's/:.*//g' | sed 's#/lib/modules/#lib/modules/#g' } function createInitrd() { local kernel_version=$1 mkdir -p ${homeBaseDir}/initrd/$kernel_version cd ${homeBaseDir}/initrd/$kernel_version svn export -q --force $initrd_path ${homeBaseDir}/initrd/$kernel_version if [ -n "$udev_version" ] then echo " * add udev version ${udev_version}" svn export -q --force ${pathToAdmin}/udev/${udev_version} ${homeBaseDir}/initrd/$kernel_version fi cp -f ${old_pwd}/build ${homeBaseDir}/initrd/$kernel_version cp -f ${filelist_path}/filelist-initrd.txt $tmp_path for direntry in lib lib/modules lib/modules/$kernel_version do if ! grep -q "dir .*${direntry} .*0755 0 0" $tmp_path/filelist-initrd.txt then mkdir -p ${homeBaseDir}/initrd/${kernel_version}/${direntry} echo "dir ${direntry} 0755 0 0" >> $tmp_path/filelist-initrd.txt fi done cd $homeBaseDir/lib/modules/$kernel_version # Kernel modules to put in initrd: # add all ATA/SCSI/IDE kernel modules # message/ contains VMWare SCSI modules find . -type f -and '(' -path '*ata/*' -or -path '*scsi/*' -or -path '*/ide/*' -or -path '*message/*' -or -path '*md/*' -or -path '*virtio/*' -or -path '*cdrom/*' -or -path '*block/*' -or -path '*video/console/*' ')' | sed "s#^.##g" | while read module do if [ -n "$module" ] then tmpdir=`dirname $module` mkdir -p ${homeBaseDir}/initrd/${kernel_version}/lib/modules/${kernel_version}$tmpdir cp -f ${homeBaseDir}/lib/modules/${kernel_version}${module} ${homeBaseDir}/initrd/${kernel_version}/lib/modules/${kernel_version}${module} echo "file lib/modules/${kernel_version}${module} ${homeBaseDir}/initrd/${kernel_version}/lib/modules/${kernel_version}${module} 0644 0 0" >> $tmp_path/filelist-initrd-files.txt fi done for moduleName in $initrd_kernel_modules do module=`getModuleFile $moduleName ${homeBaseDir}/lib/modules/$kernel_version` if [ -z "$module" ] then echo " ### The module $moduleName doesn't exist" continue else tmpdir=`dirname $module` mkdir -p ${homeBaseDir}/initrd/${kernel_version}/$tmpdir cp -f ${homeBaseDir}/${module} ${homeBaseDir}/initrd/${kernel_version}/${module} echo "file $module ${homeBaseDir}/initrd/${kernel_version}/${module} 0644 0 0" >> $tmp_path/filelist-initrd-files.txt fi done # create all directory entries now cd ${homeBaseDir}/initrd/${kernel_version}/lib/modules find . -type d | sed "s#^.##g" | while read direntry do if [ -n "$direntry" ] then if ! grep -q "dir .*lib/modules${direntry} .*0755 0 0" $tmp_path/filelist-initrd.txt then echo "dir lib/modules${direntry} 0755 0 0" >> $tmp_path/filelist-initrd.txt fi fi done # append all directory entries first! cat $tmp_path/filelist-initrd-files.txt >> $tmp_path/filelist-initrd.txt rm -f $tmp_path/filelist-initrd-files.txt # add all map files: for modfile in modules.alias modules.ccwmap modules.dep modules.ieee1394map \ modules.inputmap modules.isapnpmap modules.ofmap modules.order \ modules.pcimap modules.seriomap modules.symbols modules.usbmap do if [ -e "${homeBaseDir}/lib/modules/${kernel_version}/$modfile" ] then cp -f ${homeBaseDir}/lib/modules/${kernel_version}/$modfile ${homeBaseDir}/initrd/${kernel_version}/lib/modules/${kernel_version} echo "file lib/modules/${kernel_version}/$modfile ${homeBaseDir}/initrd/${kernel_version}/lib/modules/${kernel_version}/$modfile 0644 0 0" >> $tmp_path/filelist-initrd.txt fi done # debug output: #cp -f ${tmp_path}/filelist-initrd.txt /tmp/filelist-initrd.txt cd ${homeBaseDir}/initrd/${kernel_version} /sbin/depmod -e -b ${homeBaseDir}/initrd/${kernel_version} ${kernel_version} $gen_init_cpio ${tmp_path}/filelist-initrd.txt | gzip -9 > ${tmp_path}/${kernel_version}/boot/initrd-${kernel_version}.gz rm -f ${tmp_path}/filelist-initrd.txt cd $old_pwd } # ---------------------------------------------------------------------------- # Create eisfair version number out of kernel number # A version like '2.6.24-27-386' is converted to '2.6.024027', so this version # can be used directly on the version tag. # The resulting string is available on $eisfairPackageVersion # ---------------------------------------------------------------------------- determineEisfairPackageVersion () { local kernelVersion=$1 # Given is something like 2.6.24-27-386 local major=${kernelVersion/.*} # Remove first period and rest: 2 local minor=`echo $kernelVersion | cut -d . -f 2` # 6 local bugfix=${kernelVersion/*.} # Remove everything till last period: 24-27-386 local bugfixHigh=${bugfix/-*} # Remove first dash and rest: 24 local bugfixLow=${bugfix/-/.} # Replace first dash with period: 24.27-386 bugfixLow=${bugfixLow/*.} # Remove everything till period: 27-386 bugfixLow=${bugfixLow/-*} # Remove fist dash and rest: 27 local newBugfix=`expr $bugfixHigh \* 1000 + $bugfixLow` eisfairPackageVersion="${major}.${minor}.${newBugfix}" } trap 'echo "Aborting ..."' INT TERM trap cleanUp EXIT echo " - Checking boot scripts for syntax errors" sh -n $initrd_path/init mkdir -p ${svnInstallAdmin}/output/kernel rm -rf ${homeBaseDir}/initrd if $fetchPackages then fetchKernelBinaries.sh $verbose --no-cleanup fi #mkkernel.sh $verbose folderIdx=1 while read kernelversion type do echo "$kernelversion" | grep -q '^#' && continue mkdir -p ${tmp_path}/$kernelversion/boot determineEisfairPackageVersion $kernelversion echo " - Creating $kernelversion initrd archive" createInitrd $kernelversion # ------------------------------------------------------------------------ # Copy and extract server kernel image files # ------------------------------------------------------------------------ echo " - Creating ${kernelversion} kernel package" cd ${tmp_path}/$kernelversion tar -xzf $baseDir/kernel-${kernelversion}.tar.gz rm -f ${tmp_path}/$kernelversion/boot/config* # copy eisfair package files svn export -q --force ${pathToAdmin}/kernel-$type ${tmp_path}/$kernelversion sed "s||${kernelversion}|" -i ${tmp_path}/$kernelversion/tmp/install.sh chmod 0755 ${tmp_path}/$kernelversion/tmp/* sed -e "s|(2.6.[0-9][0-9]-[0-9][0-9]-[a-z0-9\-]*)|(${kernelversion})|" -i ${tmp_path}/$kernelversion/var/install/packages/eiskernel-$type sed -e "s|.*\$|${eisfairPackageVersion}|" -i ${tmp_path}/$kernelversion/var/install/packages/eiskernel-$type # rm -f ${svnInstallAdmin}/output/kernel/eiskernel-$type.tar.gz rm -rf ${svnInstallAdmin}/output/kernel/$folderIdx mkdir ${svnInstallAdmin}/output/kernel/$folderIdx # tar -cz -P --exclude=.svn --group=0 --owner=0 --transform="s|\./|/|g" -f ${svnInstallAdmin}/output/kernel/eiskernel-${kernelversion}.tar.gz . tar -cz --exclude=.svn --group=0 --owner=0 -f ${svnInstallAdmin}/output/kernel/$folderIdx/eiskernel-$type.tar.gz * sha1sum=`sha1sum -b ${svnInstallAdmin}/output/kernel/$folderIdx/eiskernel-$type.tar.gz | cut -d' ' -f1` sed "s||${sha1sum}|" ${tmp_path}/$kernelversion/var/install/packages/eiskernel-$type \ > ${svnInstallAdmin}/output/kernel/$folderIdx/eiskernel-$type.tar.gz.info folderIdx=$((folderIdx+1)) done < $kernelVersions if $doCleanup then rm -rf ${baseDir}/boot rm -rf ${baseDir}/initrd/ rm -rf ${baseDir}/kernel-* rm -rf ${baseDir}/lib fi