--- trunk/mkinitrd/mkinitrd.sh 2005/12/03 19:52:07 293 +++ trunk/mkinitrd/mkinitrd.sh 2005/12/06 21:38:12 302 @@ -1,5 +1,5 @@ #!/bin/bash -# $Header: /home/cvsd/magellan-cvs/magellan-src/mkinitrd/mkinitrd.sh,v 1.4 2005-12-03 19:52:07 niro Exp $ +# $Header: /home/cvsd/magellan-cvs/magellan-src/mkinitrd/mkinitrd.sh,v 1.6 2005-12-06 21:38:12 niro Exp $ # mkinitrd # @@ -55,7 +55,7 @@ modulefile=/etc/modules.conf rc=0 -IMAGESIZE=8000 +IMAGESIZE=4000 PRESCSIMODS="sd_mod" fstab="/etc/fstab" @@ -391,6 +391,8 @@ --allow-missing) allowmissing=yes ;; --noresume) noresume=1 ;; --help) usage -n ;; + --initramfs) IMAGE_TYPE=initramfs ;; + --loopback) IMAGE_TYPE=loopback ;; *) if [ -z "${target}" ] then @@ -407,6 +409,9 @@ shift done +# enforce loopback method as default +[[ -z ${IMAGE_TYPE} ]] && IMAGE_TYPE=loopback + if [ -z "${target}" -o -z "${kernel}" ] then usage @@ -445,7 +450,7 @@ ############################## ####### get modules ########## -echo "Creating initramfs" +echo "Creating ${IMAGE_TYPE} initrd image" modulefile=/etc/modprobe.conf for n in ${PREMODS} @@ -645,10 +650,11 @@ install -d ${DEST}/{bin,dev,etc,lib,loopfs,proc,sys,sysroot} || die # install busybox +echo "$(which busybox.mkinitrd)" install -m0755 $(which busybox.mkinitrd) ${DEST}/bin/busybox || die for i in '[' ash basename cat cut chroot clear cp dirname echo env false find \ - grep gunzip gzip ln ls loadkmap losetup mkdir mknod modprobe more mount mv \ - ps pwd rm rmdir sh sleep test touch true umount uname \ + grep gunzip gzip init ln ls loadkmap losetup mkdir mknod modprobe more mount mv \ + pivot_root ps pwd rm rmdir sh sleep test touch true umount uname \ xargs yes chmod chown do # static links @@ -656,9 +662,11 @@ done # install run-init +echo "$(which run-init.mkinitrd)" install -m0755 $(which run-init.mkinitrd) ${DEST}/bin/run-init || die # install insmod.static +echo "$(which insmod.static)" install -m0755 $(which insmod.static) ${DEST}/bin/insmod || die # install udev @@ -702,6 +710,8 @@ add_initrd 'mount -t proc proc /proc' add_initrd 'mount -t sysfs sysfs /sys' +[[ ${IMAGE_TYPE} = loopback ]] && add_initrd 'mount -t ramfs -o remount,rw /dev/ram /' + add_initrd 'echo "-- Creating inital device nodes ..."' add_initrd 'mount -o mode=0755 -t tmpfs udev /dev' add_initrd 'mkdir /dev/pts' @@ -824,14 +834,21 @@ add_initrd 'echo "-- Mounting sysroot ..."' add_initrd '. /etc/rootdev' -add_initrd 'mknod ${device} b ${major} ${minor}' +add_initrd '[ ! -e ${device} ] && mknod ${device} b ${major} ${minor}' add_initrd 'echo "${device} /sysroot ${rootfs} defaults,ro 0 0" > /etc/fstab' add_initrd 'mount /sysroot' add_initrd 'echo "-- Switching to real sysroot ..."' add_initrd 'umount /sys' add_initrd 'umount /proc' -add_initrd 'exec run-init /sysroot /sbin/init $@ /sysroot/dev/console' + +[[ ${IMAGE_TYPE} = initramfs ]] && add_initrd 'exec run-init /sysroot /sbin/init $@ /sysroot/dev/console' +if [[ ${IMAGE_TYPE} = loopback ]] +then + add_initrd 'cd /sysroot' + add_initrd 'pivot_root . initrd' + add_initrd "exec /sbin/chroot . sh -c 'umount -n /initrd >/dev/null 2>&1;exec -a init.new /sbin/init'/dev/console 2>&1" +fi chmod +x ${DEST}/init || die @@ -856,9 +873,33 @@ # create the image echo "Creating initrd image '${target}' ..." -(cd "${DEST}" ; find . | cpio --quiet --dereference -o -H newc | gzip -9 >${IMAGE}) -cat ${IMAGE} > ${target} || die +if [[ ${IMAGE_TYPE} = initramfs ]] +then + (cd "${DEST}" ; find . | cpio --quiet -o -H newc | gzip -9 >${IMAGE}) + cat ${IMAGE} > ${target} || die +fi + +if [[ ${IMAGE_TYPE} = loopback ]] +then + MOUNTTMP="$(mktemp -d)" + + # create ext2 img + dd if=/dev/zero of=${IMAGE} bs=1024 count=${IMAGESIZE} &> /dev/null || die + mke2fs -m 0 -i 1024 -F ${IMAGE} &> /dev/null || die + mount -o loop ${IMAGE} ${MOUNTTMP} || die + mv ${DEST}/* ${MOUNTTMP} || die + umount ${MOUNTTMP} || die + gzip -9 ${IMAGE} || die + cat ${IMAGE}.gz > ${target} || die + [ -d ${MOUNTTMP} ] && rm -rf ${MOUNTTMP} + + # create inird dir for pivot_root + [ ! -d /initrd ] && { install -d /initrd || die; } +fi # clean up [ -d ${DEST} ] && rm -rf ${DEST} [ -f ${IMAGE} ] && rm -f ${IMAGE} + +# all went ok at this point +exit 0