--- trunk/mkinitrd-magellan/mkinitrd.in 2010/05/30 11:47:04 993 +++ trunk/mkinitrd-magellan/mkinitrd.in 2011/09/07 17:46:29 1515 @@ -44,6 +44,7 @@ CONFMODS="${MODULES}" MODULES="" +INITEXEC="/sbin/init" compress=1 allowmissing="" @@ -76,7 +77,8 @@ echo " [--image-version] [--force-scsi-probe | --omit-raid-modules]" echo " [--with=] [--force-lvm-probe | --omit-lvm-modules]" echo " [--builtin=] [--initramfs | --loopback] [--no-strip]" - echo " [--fstab=] [--nocompress] " + echo " [--fstab=] [--nocompress] [--initexec=]" + echo " " echo echo " (ex: $(basename $0) /boot/initrd-2.2.5-15.img 2.2.5-15)" @@ -92,7 +94,7 @@ echo "Looking for deps of module $1" deps=$(awk 'BEGIN { searched=ARGV[2]; ARGV[2]=""; rc=1 } \ - function modname(filename) { match(filename, /\/([^\/]+)\.k?o:?$/, ret); return ret[1] } \ + function modname(filename) { match(filename, /\/([^\/]+)\.k?o.?g?z?:?$/, ret); return ret[1] } \ function show() { if (orig == searched) { print dep; orig=""; rc=0; exit } } \ /^.*kernel/ { show(); \ orig=modname($1); dep=""; \ @@ -130,6 +132,7 @@ case "${MODULES} " in *"/${modName}.ko "*) return ;; + *"/${modName}.ko.gz "*) return ;; esac if echo ${builtins} | egrep -q '(^| )'${modName}'( |$)' @@ -162,7 +165,7 @@ done fi - for modExt in o.gz o ko + for modExt in o.gz o ko ko.gz do for modDir in /lib/modules/${kernel}/updates /lib/modules/${kernel} do @@ -250,7 +253,7 @@ modalias=$(cat modalias) for driver in $(modprobe --set-version ${kernel} --show-depends ${modalias} 2>/dev/null| awk '{ print gensub(".*/","","g",$2) }') do - findmodule ${driver%%.ko} + findmodule ${driver%%.*} done popd >/dev/null 2>&1 done @@ -415,6 +418,14 @@ --initramfs) IMAGE_TYPE=initramfs ;; --loopback) IMAGE_TYPE=loopback ;; --no-strip) NOSTRIP=true ;; + --initexec*) + if echo $1 | grep -q '=' ; then + INITEXEC=$(echo $1 | sed 's/^--initexec=//') + else + INITEXEC=$2 + shift + fi + ;; *) if [ -z "${target}" ] then @@ -487,14 +498,12 @@ for fs in / /boot do esc=$(echo ${fs} | sed 's,/,\\/,g') - dev=$(mount | awk "/ on ${esc} / { print \$1 }" | sed 's/[0-9]*$//' | cut -d/ -f3) - if [ "$(echo ${dev} | cut -c1-2)" = sd ] + dev=$(mount | awk "/ on ${esc} / { print \$1 }" | sed 's/[0-9]*$//') + if [ "$(echo ${dev} | cut -c6-7)" = sd ] then - if [ $(which kudzu 2>/dev/null) ] + if [ $(which hwinfo 2>/dev/null) ] then - host=$(kudzu --probe -b scsi | - gawk '/^device: '${dev}'/,/^host:/ { if (/^host/) { print $2; exit; } }') - if [ -d /proc/scsi/usb-storage-${host} -o -f /proc/scsi/usb-storage/${host} ] + if [[ -n $(hwinfo --disk --only ${dev} | grep 'Driver Modules' | grep 'usb[_|-]storage') ]] then needusb=1 fi @@ -765,8 +774,8 @@ for MODULE in ${MODULES} do text="" - module=$(echo ${MODULE} | sed "s|.*/||" | sed "s/.k\?o$//") - fullmodule=$(echo ${MODULE} | sed "s|.*/||") + module=$(echo ${MODULE} | sed "s|.*/||" | sed -e "s/.k\?o.\?g\?z\?$//" -e "s/.gz//") + fullmodule=$(echo ${MODULE} | sed -e "s|.*/||" -e "s/.gz//") options=$(sed -n -e "s/^options[ ][ ]*${module}[ ][ ]*//p" ${modprobeconf} 2>/dev/null) @@ -800,6 +809,10 @@ fi done +# respect rootdelay kernel param +add_initrd 'for i in $(cat /proc/cmdline); do case ${i} in rootdelay=*) ROOTDELAY="${i#*=}";; esac; done' +add_initrd 'if [ ! -z "${ROOTDELAY}" ]; then echo "-- Requested a rootdelay of ${ROOTDELAY} seconds ..."; sleep ${ROOTDELAY};fi' + # lvm support if [ -n "${vg_list}" ] then @@ -838,6 +851,11 @@ done fi +# get the right initexec +add_initrd "INITEXEC=\"${INITEXEC}\"" +# support init=* from cmdline +add_initrd 'for i in $(cat /proc/cmdline); do if [[ ${i} = init=* ]]; then INITEXEC=${i/init=}; fi; done' + add_initrd 'echo "-- Mounting sysroot ..."' add_initrd '. /etc/rootdev' add_initrd 'echo "${device} /sysroot ${rootfs} defaults,ro 0 0" > /etc/fstab' @@ -849,17 +867,21 @@ # de-silencio add_initrd 'echo 3 > /proc/sys/kernel/printk' +add_initrd 'BREAK_ENABLED=no' +add_initrd 'for i in $(cat /proc/cmdline); do if [[ ${i} = break ]]; then BREAK_ENABLED=yes; fi; done' +add_initrd 'if [[ ${BREAK_ENABLED} = yes ]]; then echo "-- Break requested, type 'exit' to resume operation ..."; ash; fi' + add_initrd 'echo "-- Switching to real sysroot ..."' add_initrd 'umount /dev' add_initrd 'umount /sys' add_initrd 'umount /proc' -[[ ${IMAGE_TYPE} = initramfs ]] && add_initrd 'exec run-init /sysroot /sbin/init $@ /sysroot/dev/console' +[[ ${IMAGE_TYPE} = initramfs ]] && add_initrd 'exec run-init /sysroot ${INITEXEC} $@ /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" + add_initrd "exec /sbin/chroot . sh -c 'umount -n /initrd >/dev/null 2>&1;exec -a init.new \${INITEXEC}'/dev/console 2>&1" fi chmod +x ${DEST}/init || die @@ -876,6 +898,10 @@ if [ -x /usr/bin/strip ] && [[ ${NOSTRIP} = false ]] then /usr/bin/strip -g ${verbose} ${MODULE} -o ${DEST}/lib/$(basename ${MODULE}) || die + # handle gzip compressed modules right + elif [[ ${MODULE##*.} = gz ]] + then + zcat ${verbose} ${MODULE} > ${DEST}/lib/$(basename ${MODULE} .gz) || die else cp ${verbose} -a ${MODULE} ${DEST}/lib || die fi