--- trunk/mkinitrd/mkinitrd.sh 2005/12/03 18:36:28 292 +++ trunk/mkinitrd/mkinitrd.sh 2006/11/24 17:27:28 400 @@ -1,5 +1,5 @@ #!/bin/bash -# $Header: /home/cvsd/magellan-cvs/magellan-src/mkinitrd/mkinitrd.sh,v 1.3 2005-12-03 18:36:28 niro Exp $ +# $Header: /home/cvsd/magellan-cvs/magellan-src/mkinitrd/mkinitrd.sh,v 1.11 2006-11-24 17:26:11 niro Exp $ # mkinitrd # @@ -38,10 +38,11 @@ PROBE="yes" MODULES="" PREMODS="" +NOSTRIP=false -[ -e /etc/sysconfig/mkinitrd ] && . /etc/sysconfig/mkinitrd +[ -e /etc/conf.d/mkinitrd ] && . /etc/conf.d/mkinitrd -CONFMODS="$MODULES" +CONFMODS="${MODULES}" MODULES="" compress=1 @@ -55,7 +56,7 @@ modulefile=/etc/modules.conf rc=0 -IMAGESIZE=8000 +IMAGESIZE=4000 PRESCSIMODS="sd_mod" fstab="/etc/fstab" @@ -73,7 +74,7 @@ echo " [--force-ide-probe] [--force-scsi-probe | --omit-scsi-modules]" echo " [--image-version] [--force-scsi-probe | --omit-raid-modules]" echo " [--with=] [--force-lvm-probe | --omit-lvm-modules]" - echo " [--builtin=] " + echo " [--builtin=] [--initramfs | --loopback] [--no-strip]" echo " [--fstab=] [--nocompress] " echo echo " (ex: $(basename $0) /boot/initrd-2.2.5-15.img 2.2.5-15)" @@ -391,6 +392,9 @@ --allow-missing) allowmissing=yes ;; --noresume) noresume=1 ;; --help) usage -n ;; + --initramfs) IMAGE_TYPE=initramfs ;; + --loopback) IMAGE_TYPE=loopback ;; + --no-strip) NOSTRIP=true ;; *) if [ -z "${target}" ] then @@ -407,6 +411,9 @@ shift done +# enforce initramfs method as default +[[ -z ${IMAGE_TYPE} ]] && IMAGE_TYPE=initramfs + if [ -z "${target}" -o -z "${kernel}" ] then usage @@ -445,7 +452,7 @@ ############################## ####### get modules ########## -echo "Creating initramfs" +echo "Creating ${IMAGE_TYPE} initrd image" modulefile=/etc/modprobe.conf for n in ${PREMODS} @@ -642,12 +649,13 @@ # create basic filesystem layout -install -d ${DEST}/{bin,dev,etc,lib,loopfs,proc,sys,sysroot} || die +install -d ${DEST}/{bin,dev,etc,lib,loopfs,proc,sbin,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 \ +for i in '[' ash basename cat cut clear cp dirname echo env false find \ + grep gunzip gzip ln ls loadkmap mkdir mknod more mount mv \ ps pwd rm rmdir sh sleep test touch true umount uname \ xargs yes chmod chown do @@ -655,22 +663,25 @@ ln ${DEST}/bin/busybox ${DEST}/bin/${i} || die "${i}" done +# sbin related +for i in chroot init losetup modprobe pivot_root +do + # static links + ln ${DEST}/bin/busybox ${DEST}/sbin/${i} || die "${i}" +done + # install run-init -install -m0755 $(which run-init.mkinitrd) ${DEST}/bin/run-init || die +echo "$(which run-init.mkinitrd)" +install -m0755 $(which run-init.mkinitrd) ${DEST}/sbin/run-init || die # install insmod.static -install -m0755 $(which insmod.static) ${DEST}/bin/insmod || die - -# install udev -cp -a /etc/udev ${DEST}/etc || die -install -m0755 /sbin/udev.static ${DEST}/bin/udev || die -install -m0755 /sbin/udevd.static ${DEST}/bin/udevd || die -install -m0755 /sbin/udevstart.static ${DEST}/bin/udevstart || die +echo "$(which insmod.static)" +install -m0755 $(which insmod.static) ${DEST}/sbin/insmod || die # install lvm if [ -n "${vg_list}" ] then - inst /sbin/lvm.static "${DEST}/bin/lvm" + inst /sbin/lvm.static "${DEST}/sbin/lvm" if [ -f /etc/lvm/lvm.conf ] then cp ${verbose} --parents /etc/lvm/lvm.conf ${DEST}/ @@ -678,7 +689,12 @@ fi # create some needed device nodes +mkdir ${DEST}/dev/pts || die +mkdir ${DEST}/dev/shm || die mkdir ${DEST}/dev/mapper || die +mkdir ${DEST}/dev/misc || die +mkdir ${DEST}/dev/fb || die +mkdir ${DEST}/dev/vc || die mknod ${DEST}/dev/console c 5 1 || die mknod ${DEST}/dev/null c 1 3 || die mknod ${DEST}/dev/ram b 1 1 || die @@ -702,11 +718,19 @@ 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 /' + +# silencio +add_initrd 'echo 0 > /proc/sys/kernel/printk' + add_initrd 'echo "-- Creating inital device nodes ..."' add_initrd 'mount -o mode=0755 -t tmpfs udev /dev' add_initrd 'mkdir /dev/pts' add_initrd 'mkdir /dev/shm' add_initrd 'mkdir /dev/mapper' +add_initrd 'mkdir /dev/misc' +add_initrd 'mkdir /dev/fb' +add_initrd 'mkdir /dev/vc' add_initrd 'mknod /dev/console c 5 1' add_initrd 'mknod /dev/null c 1 3' add_initrd 'mknod /dev/ram b 1 1' @@ -721,29 +745,12 @@ add_initrd "mknod /dev/ttyS$((${i} - 64)) c 4 ${i}" done -add_initrd 'echo "-- Starting udevd ..."' -add_initrd 'ln -snf bin /sbin' -add_initrd '/sbin/udevstart' +# some needed symlinks add_initrd 'ln -snf /proc/self/fd /dev/fd' add_initrd 'ln -snf fd/0 /dev/stdin' add_initrd 'ln -snf fd/1 /dev/stdout' add_initrd 'ln -snf fd/2 /dev/stderr' add_initrd 'ln -snf /proc/kcore /dev/core' -add_initrd 'touch /dev/.udev' - -add_initrd 'echo "-- Setting up hotplug ..."' -add_initrd 'echo "/sbin/hotplug" > /proc/sys/kernel/hotplug' -# add_initrd 'for i in $(find /lib -type f -name *.ko)' -# add_initrd 'do' -# add_initrd ' echo "-- Loading module ${i}"' -# add_initrd ' insmod ${i};' -# # handle special cases like usb -# add_initrd ' if [ "${i}" = "usb-storage" ]' -# add_initrd ' then' -# add_initrd ' echo "Waiting 8 seconds for usb-driver initialization."' -# add_initrd ' sleep 8' -# add_initrd ' fi' -# add_initrd 'done' # loading detected modules with options for MODULE in ${MODULES} @@ -809,7 +816,7 @@ # software suspend if [ -z "${noresume}" ] then - add_initrd "resume ${swsuspdev}" + add_initrd "[ -x /bin/resume ] && resume ${swsuspdev}" fi # raid @@ -824,14 +831,24 @@ 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' +# de-silencio +add_initrd 'echo 3 > /proc/sys/kernel/printk' + 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 @@ -846,7 +863,7 @@ echo "Coping your modules to '${DEST}/lib' ..." for MODULE in ${MODULES} do - if [ -x /usr/bin/strip ] + if [ -x /usr/bin/strip ] && [[ ${NOSTRIP} = false ]] then /usr/bin/strip -g ${verbose} ${MODULE} -o ${DEST}/lib/$(basename ${MODULE}) || die else @@ -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