--- trunk/mkinitrd-magellan/mkinitrd.in 2008/06/11 22:11:40 738 +++ trunk/mkinitrd-magellan/mkinitrd.in 2010/12/15 21:42:48 1180 @@ -44,6 +44,7 @@ CONFMODS="${MODULES}" MODULES="" +INITEXEC="/sbin/init" compress=1 allowmissing="" @@ -53,7 +54,8 @@ verbose="" img_vers="" builtins="" -modulefile=/etc/modules.conf +modulefile="/etc/modules.conf" +modprobeconf="/etc/modprobe.d/*" rc=0 IMAGESIZE=4000 @@ -75,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)" @@ -93,7 +96,7 @@ deps=$(awk 'BEGIN { searched=ARGV[2]; ARGV[2]=""; rc=1 } \ function modname(filename) { match(filename, /\/([^\/]+)\.k?o:?$/, ret); return ret[1] } \ function show() { if (orig == searched) { print dep; orig=""; rc=0; exit } } \ - /^\/lib/ { show(); \ + /^.*kernel/ { show(); \ orig=modname($1); dep=""; \ if ($2) { for (i = 2; i <= NF; i++) { dep=sprintf("%s %s", dep, modname($i)); } } } \ /^ / { dep=sprintf("%s %s", dep, modname($1)); } \ @@ -319,6 +322,25 @@ fi } +get_blkid() +{ + local UUID + local SEC_TYPE + local TYPE + + local dev="$1" + [[ -z ${dev} ]] && die "no dev given" + + # check if given device is already an UUID + if [[ ${dev/UUID=/}x != ${dev}x ]] + then + eval "${dev}" + else + eval $(busybox.mkinitrd blkid ${dev} | grep "${dev}:" | sed 's/.*:\ //') + fi + echo ${UUID} +} + # need r00t privs [[ $(id -u) != 0 ]] && die "you must be r00t." @@ -395,6 +417,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 @@ -453,7 +483,6 @@ ####### get modules ########## echo "Creating ${IMAGE_TYPE} initrd image" -modulefile=/etc/modprobe.conf for n in ${PREMODS} do @@ -468,14 +497,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 @@ -649,7 +676,7 @@ # create basic filesystem layout -install -d ${DEST}/{bin,dev,etc,lib,loopfs,proc,sbin,sys,sysroot} || die +install -d ${DEST}/{bin,dev,etc,lib,loopfs,proc,sbin,sys,sysroot,usr/bin,usr/sbin} || die # install busybox echo "$(which busybox.mkinitrd)" @@ -669,8 +696,7 @@ # sbin related for i in chroot init losetup modprobe pivot_root do - # static links - ln ${DEST}/bin/busybox ${DEST}/sbin/${i} || die "${i}" + ln -s ${DEST}/bin/busybox ${DEST}/sbin/${i} || die "${i}" done # install run-init @@ -678,13 +704,13 @@ install -m0755 $(which run-init.mkinitrd) ${DEST}/sbin/run-init || die # install insmod.static -echo "$(which insmod.static)" -install -m0755 $(which insmod.static) ${DEST}/sbin/insmod || die +#echo "$(which insmod.static)" +#install -m0755 $(which insmod.static) ${DEST}/sbin/insmod || die # install v86d for uvesafb support if installed if which v86d &> /dev/null then - echo "$(which insmod.static)" + echo "$(which v86d)" install -m0755 $(which v86d) ${DEST}/sbin/v86d || die fi @@ -727,40 +753,21 @@ add_initrd 'mount -t proc proc /proc' add_initrd 'mount -t sysfs sysfs /sys' +add_initrd 'mount -t tmpfs tmpfs /dev -o rw,mode=0644,size=1024' [[ ${IMAGE_TYPE} = loopback ]] && add_initrd 'mount -t ramfs -o remount,rw /dev/ram /' +# install all busybox applets +add_initrd 'busybox --install -s' + # silencio add_initrd 'echo 0 > /proc/sys/kernel/printk' add_initrd 'echo "-- Creating initial device nodes ..."' -add_initrd 'mount -o exec,nosuid,mode=0755,size=10M -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' -add_initrd 'mknod /dev/rtc c 10 135' -add_initrd 'mknod /dev/systty c 4 0' -add_initrd 'mknod /dev/tty c 5 0' -add_initrd 'mknod /dev/zero c 1 5' -for (( i=0; i < 13; i++ )); do - add_initrd "mknod /dev/tty${i} c 4 ${i}" -done -for (( i=64; i < 68; i++)); do - add_initrd "mknod /dev/ttyS$((${i} - 64)) c 4 ${i}" -done - -# 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' +# populate dev +add_initrd 'mdev -s' +# handle hotplug events properly +add_initrd 'echo /sbin/mdev > /proc/sys/kernel/hotplug' # loading detected modules with options for MODULE in ${MODULES} @@ -769,7 +776,7 @@ module=$(echo ${MODULE} | sed "s|.*/||" | sed "s/.k\?o$//") fullmodule=$(echo ${MODULE} | sed "s|.*/||") - options=$(sed -n -e "s/^options[ ][ ]*${module}[ ][ ]*//p" ${modulefile} 2>/dev/null) + options=$(sed -n -e "s/^options[ ][ ]*${module}[ ][ ]*//p" ${modprobeconf} 2>/dev/null) if [ -n "${options}" ] then @@ -839,36 +846,41 @@ 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 '[ ! -e ${device} ] && mknod ${device} b ${major} ${minor}' add_initrd 'echo "${device} /sysroot ${rootfs} defaults,ro 0 0" > /etc/fstab' add_initrd 'mount /sysroot || ash' +# unset hotplug event-manager +add_initrd 'echo > /proc/sys/kernel/hotplug' + # de-silencio add_initrd 'echo 3 > /proc/sys/kernel/printk' add_initrd 'echo "-- Switching to real sysroot ..."' +add_initrd 'umount /dev' add_initrd 'umount /sys' add_initrd 'umount /proc' -add_initrd 'umount /dev' -[[ ${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 # setup root block device [[ -z ${rootdev} ]] && die "no known rootdev found." -echo "device=${rootdev}" > ${DEST}/etc/rootdev || die -echo "major=$(stat -c %t ${rootdev})" >> ${DEST}/etc/rootdev || die -echo "minor=$(stat -c %T ${rootdev})" >> ${DEST}/etc/rootdev || die -echo "rootfs=${rootfs}" >> ${DEST}/etc/rootdev || die +echo "device='UUID=$(get_blkid ${rootdev})'" > ${DEST}/etc/rootdev || die +echo "rootfs='${rootfs}'" >> ${DEST}/etc/rootdev || die # install detected modules echo "Coping your modules to '${DEST}/lib' ..."