#!/bin/bash mainfunction="first_stage_mainfunction" first_stage_mainfunction () { if [ "$ROCK_BUILD_TARGET" != 1 ] ; then echo "$xpkg can only be built with ./scripts/Build-Target!" false fi initrd_config="$ROCKCFG_PKG_1ST_STAGE_INITRD" rootdir="$root" disksdir="$root/ROCK/target-finish" mkdir -p "$disksdir" targetdir="$disksdir/$initrd_config" cross_compile="" if [ "$ROCKCFG_CROSSBUILD" = "1" ] ; then cross_compile="`find ${root}/ROCK/tools.cross/ -name "*-readelf"`" cross_compile="${cross_compile##*/}" cross_compile="${cross_compile%%readelf}" fi initrdfs="ext2fs" block_size="" initrd_img="${disksdir}/$initrd_config.img" kernel="$( grep "[ =]$ROCKCFG_PKG_LINUX_DEFAULT " $base/config/$config/packages | cut -f6 -d" " )-rock" echo "Creating initrd data:" rm -rf ${targetdir} mkdir -p ${targetdir}/{dev,proc,sys,tmp,scsi,net,bin,sbin,etc,$multilib} cd ${targetdir} # this copies a set of programs and the necessary libraries into a # chroot environment # make mount not complain echo "/dev/root / auto defaults 0 0" > etc/fstab # supress udev uig/gid warnings cp -vp ${rootdir}/etc/{passwd,group} etc/ cp -vp ${rootdir}/$multilib/libnss_files.so.* $multilib/ echo "Creating some device nodes" mknod dev/ram0 b 1 0 mknod dev/null c 1 3 mknod dev/zero c 1 5 mknod dev/tty c 5 0 mknod dev/console c 5 1 # echo "Create checkisomd5 binary" # cp -r ${base}/misc/isomd5sum ${base}/build/${ROCKCFG_ID}/ # cat >${base}/build/${ROCKCFG_ID}/compile_isomd5sum.sh </dev/null | grep "(NEEDED)" | sed -e"s,.*Shared library: \[\(.*\)\],\1," | while read library ; do find ${libdirs} -name "${library}" 2>/dev/null | sed -e "s,^${rootdir},,g" | tr '\n' ' ' done } libs="${libs} `needed_libs bin/checkisomd5`" # /usr/lib/libgcc_s.so.1 is required for ARM, but not auto-detected if [ "$ROCKCFG_ARCH" = arm ] ; then libs="${libs} /usr/lib/libgcc_s.so.1" fi echo "Copying other files ... " for x in $confdir/$initrd_config/initrd_* ; do [ -f ${x} ] || continue while read file target ; do file="${rootdir}/${file}" [ -e ${file} ] || continue while read f ; do tfile=${targetdir}/${target}${f#${file}} [ -e ${tfile} ] && continue if [ -d ${f} -a ! -L ${f} ] ; then mkdir -p ${tfile} continue else mkdir -p ${tfile%/*} fi # without -R, cp would try to copy the contents of e.g. # /lib/udev/devices/zero cp -a "${f}" "${tfile}" ls -l "$tfile" file -L "${f}" | grep -q ELF || continue libs="${libs} `needed_libs ${f}`" done < <( find "${file}" ) done < <( grep -v "^[ ]*#" ${x} ) done echo "Copying and adjusting linuxrc scipt" cp -dp $confdir/linuxrc.sh sbin/init chmod +x sbin/init sed -i -e "s,^STAGE_2_BIG_IMAGE=\"2nd_stage.tar.gz\"$,STAGE_2_BIG_IMAGE=\"${ROCKCFG_SHORTID}/2nd_stage.tar.gz\"," \ -e "s,^STAGE_2_SMALL_IMAGE=\"2nd_stage_small.tar.gz\"$,STAGE_2_SMALL_IMAGE=\"${ROCKCFG_SHORTID}/2nd_stage_small.tar.gz\"," \ sbin/init for x in modprobe.static modprobe.static.old insmod.static insmod.static.old ; do if [ -f ${rootdir}/sbin/${x/.static/} ]; then rm -f bin/${x/.static/} cp -a ${rootdir}/sbin/${x/.static/} bin/ fi if [ -f ${rootdir}/sbin/$x ]; then rm -f bin/$x bin/${x/.static/} cp -a ${rootdir}/sbin/$x bin/ ln -sf $x bin/${x/.static/} fi done add_module_to_initrd() { # adds a module and all it's dependencies to the initrd module_name="${1}" parameter="${2}" module_name=${module_name/.ko/} # just in case, shouldn't be for dependant_module in `get_module_dependencies ${module_name} | sort | uniq` ; do module="`find ${rootdir}/lib/modules/${kernel} -name "${dependant_module}.o" -o -name "${dependant_module}.ko"`" [ -f "${targetdir}/${module}" ] && return # skip dupes echo "Adding ${module}." mkdir -p ${targetdir}/${module%/*} cp ${module} ${targetdir}/${module} done echo "/sbin/modprobe ${module_name} ${parameter}" >> ${targetdir}/etc/conf/kernel } echo "Copy scsi and network kernel modules." tmptar="`mktemp`" ; tar cfT ${tmptar} /dev/null mkdir -p lib/modules/${kernel} for x in $( cd ${rootdir} ; echo lib/modules/*/kernel/ drivers/{scsi,net} ) do [ -e "${rootdir}/${x}" ] && tar rf ${tmptar} -C ${rootdir} ${x} done tar xf ${tmptar} ; rm -f ${tmptar} rm -f lib/modules/[0-9]*/kernel/drivers/scsi/{st,scsi_debug}.{o,ko} rm -f lib/modules/[0-9]*/kernel/drivers/net/{dummy,ppp*}.{o,ko} [ -e lib/modules ] && find lib/modules -type f -exec $STRIP --strip-debug {} \; depmod -b ${targetdir} -F ${rootdir}/boot/System.map ${kernel} for x in lib/modules/*/kernel/drivers/{scsi,net}; do [ -d $x ] && ln -s ${x#lib/modules/} lib/modules/ done echo "Copying required libraries ... " while [ -n "${libs}" ] ; do oldlibs=${libs} libs="" for x in ${oldlibs} ; do [ -e ${targetdir}/${x} ] && continue mkdir -p ${targetdir}/${x%/*} cp -p ${rootdir}/${x} ${targetdir}/${x} ls -l ${rootdir}/${x} ${targetdir}/${x} file -L ${rootdir}/${x} | grep -q ELF || continue for y in `needed_libs ${rootdir}/${x}` ; do [ ! -e "${targetdir}/${y}" ] && libs="${libs} ${y}" done done done echo "Creating links for identical files ..." while read ck fn do # don't link empty files... if [ "${oldck}" = "${ck}" -a -s "${fn}" ] ; then echo "\`- Found ${fn#${targetdir}} -> ${oldfn#${targetdir}}." rm ${fn} ; ln -s /${oldfn#${targetdir}} ${fn} else oldck=${ck} ; oldfn=${fn} fi done < <( find ${targetdir} -type f | xargs md5sum | sort ) cd .. echo "Creating initrd filesystem image (${initrdfs}): " case "${initrdfs}" in cramfs) [ "${block_size}" == "" ] && block_size=4096 mkfs.cramfs -b ${block_size} ${targetdir} ${initrd_img} ;; ext2fs|ext3fs) [ "${block_size}" == "" ] && block_size=1024 block_count="$(( ( $( du -s $targetdir --block-size=$block_size | cut -f1 ) * 11 ) / 10 ))" echo "block_size=$block_size block_count=$block_count" tmpdir=`mktemp -d` ; mkdir -p ${tmpdir} echo "Creating temporary files in $tmpdir." dd if=/dev/zero of=${initrd_img} bs=${block_size} count=${block_count} &> /dev/null tmpdev="`losetup -f 2>/dev/null`" if [ -z "${tmpdev}" ] ; then for x in /dev/loop* /dev/loop/* ; do [ -b "${x}" ] || continue losetup ${x} 2>&1 >/dev/null || tmpdev="${x}" [ -n "${tmpdev}" ] && break done if [ -z "${tmpdev}" ] ; then echo "No free loopback device found!" rm -f ${tmpfile} ; rmdir ${tmpdir}; exit 1 fi fi echo "Using loopback device ${tmpdev}." losetup "${tmpdev}" ${initrd_img} echo "Writing initrd image file." mkfs.${initrdfs:0:4} -b ${block_size} -m 0 -q ${tmpdev} &> /dev/null mount -n -t ${initrdfs:0:4} ${tmpdev} ${tmpdir} rmdir ${tmpdir}/lost+found/ cp -a ${targetdir}/* ${tmpdir} umount -n ${tmpdir} echo "Removing temporary files." losetup -d ${tmpdev} rm -rf ${tmpdir} ;; esac echo "Compressing initrd image file." gzip -9 -c ${initrd_img} > ${initrd_img}.gz mv ${initrd_img%.img}{.img,}.gz }