--- trunk/mkinitrd-magellan/livecd/linuxrc.sh 2007/11/10 19:56:21 605 +++ trunk/mkinitrd-magellan/livecd/linuxrc.sh 2012/04/02 11:40:49 1793 @@ -1,5 +1,5 @@ #!/bin/sh -# $Header: /home/cvsd/magellan-cvs/magellan-src/mkinitrd-magellan/livecd/linuxrc.sh,v 1.2 2007-11-10 19:56:21 niro Exp $ +# $Id$ # loads given kernel modules load_kernel_modules() @@ -45,7 +45,7 @@ then echo -e "Magellan boot device found." BOOT_DEVICE="${dev}" - FSTYPE=${fs} + FSTYPE="${fs}" break fi fi @@ -55,14 +55,34 @@ ## some defaults ## DOSCSI=no DOUSB=no -DOSATA=no -NOPATA=no +DOSATA=yes +DOFB=no +DOPATA=yes +FORCED_ROOTFS="" +INITEXEC="/sbin/init" +BREAK_ENABLED=no +UNIONFS=no +UNIONFS_FILE="" +CLOOPMOUNTDIR="/sysroot/mnt/cloop" ## starts here ## # mount essential filesystems mount -t proc proc /proc mount -t sysfs sysfs /sys +if [[ -z $(grep '[[:space:]]/dev[[:space:]]' /proc/mounts | cut -d ' ' -f2) ]] +then + # many video drivers needed exec access + fstype=ramfs + # tmpfs was suggested by Greg Kroah-Hartman + [[ $(grep '[[:space:]]tmpfs' /proc/filesystems | cut -d $'\t' -f2) = tmpfs ]] && fstype=tmpfs + # mount devtmpfs if supported + [[ $(grep '[[:space:]]devtmpfs' /proc/filesystems | cut -d $'\t' -f2) = devtmpfs ]] && fstype=devtmpfs + mount -t ${fstype} dev /dev -o exec,nosuid,mode=0755,size=10M +fi + +# install all busybox applets +busybox --install -s # silencio echo 0 > /proc/sys/kernel/printk @@ -71,28 +91,38 @@ for i in $(cat /proc/cmdline) do case "${i}" in - doscsi) - DOSCSI=yes - ;; - dousb) - DOUSB=yes - ;; - dosata) - DOSATA=yes - ;; - nopata) - NOPATA=yes - ;; + doscsi) DOSCSI=yes;; + noscsi) DOSCSI=no;; + dousb) DOUSB=yes;; + nousb) DOUSB=no;; + dosata) DOSATA=yes ;; + nosata) DOSATA=no ;; + dofb) DOFB=yes;; + nofb) DOFB=no;; + dopata) DOPATA=yes;; + nopata) DOPATA=no;; + rootfs=*) FORCED_ROOTFS="${i#*=}";; + init=*) INITEXEC="${i#*=}";; + break) BREAK_ENABLED=yes ;; + unionfs) UNIONFS=yes;; + unionfs_file=*) UNIONFS_FILE="${i#*=}";; + rootdelay=*) ROOTDELAY="${i#*=}";; esac done # now load all needed modules +[ "${DOFB}" = "yes" ] && load_kernel_modules "framebuffer" load_kernel_modules "generic" -[ "${NOPATA}" != "yes" ] && load_kernel_modules "pata" +[ "${DOPATA}" = "yes" ] && load_kernel_modules "pata" [ "${DOSCSI}" = "yes" ] && load_kernel_modules "scsi" [ "${DOUSB}" = "yes" ] && load_kernel_modules "usb" [ "${DOSATA}" = "yes" ] && load_kernel_modules "sata" +# populate dev +mdev -s +# handle hotplug events properly +echo /sbin/mdev > /proc/sys/kernel/hotplug + # create newroot mount point mkdir -p /sysroot # fake a new filesystem (also needed with an initramfs!!) @@ -109,6 +139,12 @@ sleep 8 fi +# respect rootdelay kernel param +if [ ! -z "${ROOTDELAY}" ]; then + echo "-- Requested a rootdelay of ${ROOTDELAY} seconds ..." + sleep ${ROOTDELAY} +fi + # searching cdrom with cdid BOOT_DEVICE="" FSTYPE="" @@ -117,19 +153,25 @@ # searching usbstick if [ "${DOUSB}" = "yes" ]; then - check_drives "/dev/sd*" "vfat" - check_drives "/dev/sg*" "vfat" + ROOTFS="vfat" + [[ ! -z ${FORCED_ROOTFS} ]] && ROOTFS="${FORCED_ROOTFS}" + check_drives "/dev/sd*" "${ROOTFS}" + check_drives "/dev/sg*" "${ROOTFS}" fi # for cdrom_device in $CDROM_LIST (ide) -check_drives "/dev/cdroms/*" iso9660 -check_drives "/dev/hd*" iso9660 +ROOTFS="iso9660" +[[ ! -z ${FORCED_ROOTFS} ]] && ROOTFS="${FORCED_ROOTFS}" +check_drives "/dev/cdroms/*" "${ROOTFS}" +check_drives "/dev/hd*" "${ROOTFS}" # scsi cdroms if [ "${DOSCSI}" = "yes" ] || [ "${DOSATA}" = "yes" ]; then - check_drives "/dev/sr*" iso9660 - check_drives "/dev/sg*" iso9660 - check_drives "/dev/scd*" iso9660 + ROOTFS="iso9660" + [[ ! -z ${FORCED_ROOTFS} ]] && ROOTFS="${FORCED_ROOTFS}" + check_drives "/dev/sr*" "${ROOTFS}" + check_drives "/dev/sg*" "${ROOTFS}" + check_drives "/dev/scd*" "${ROOTFS}" fi # mount our rootfs from cdrom @@ -150,22 +192,48 @@ echo -e "Mounting squashfs system image ..." echo [ ! -e /dev/loop0 ] && mknod /dev/loop0 b 7 0 - mount -o loop,ro -t squashfs /sysroot/mnt/cdrom/livecdrootfs.sqsh /sysroot/mnt/cloop + mount -o loop,ro -t squashfs /sysroot/mnt/cdrom/livecdrootfs.sqsh "${CLOOPMOUNTDIR}" + + # mount unionfs if enabled + if [[ ${UNIONFS} = yes ]] + then + echo -e "Mounting writeable cdbuffer (unionfs) ..." + + # default setting + CLOOPMOUNTDIR="/sysroot/mnt/unionfs" + [[ -z ${UNIONFS_FILE} ]] && UNIONFS_FILE="/sysroot/mnt/cdrom/unionfs" + + [[ ! -d /sysroot/mnt/unionfs ]] && install -d /sysroot/mnt/unionfs + mount -t unionfs dirs=${UNIONFS_FILE}=rw:/sysroot/mnt/cloop=ro ${CLOOPMOUNTDIR} + fi # symlinking cloop rootfs to /mnt as newroot cd /sysroot for x in bin sbin lib lib64 boot usr opt do - [ -d mnt/cloop/${x} ] && ln -s mnt/cloop/${x} ${x} + [ -d ${CLOOPMOUNTDIR/\/sysroot\//}/${x} ] && ln -s ${CLOOPMOUNTDIR/\/sysroot\//}/${x} ${x} done mkdir -p initrd proc tmp sys var/tmp dev media - # make /sysroot/dev/console & /mnt/dev/null - [ ! -e /sysroot/dev/console ] && mknod -m 600 /sysroot/dev/console c 5 1 - [ ! -e /sysroot/dev/null ] && mknod -m 666 /sysroot/dev/null c 1 3 + # use devtmpfs if supported + if [ "$(grep devtmpfs /proc/filesystems | cut -d$'\t' -f2)" = "devtmpfs" ] + then + mount -t devtmpfs dev /sysroot/dev + else + # make /sysroot/dev/console & /mnt/dev/null + [ ! -e /sysroot/dev/console ] && mknod -m 600 /sysroot/dev/console c 5 1 + [ ! -e /sysroot/dev/null ] && mknod -m 666 /sysroot/dev/null c 1 3 + # only to be safe and to have a log channel + [ ! -e /sysroot/dev/tty ] && mknod /sysroot/dev/tty c 5 0 + # busybox needs this one + [ ! -e /sysroot/dev/tty5 ] && mknod /sysroot/dev/tty5 c 4 5 + fi + + (cd ${CLOOPMOUNTDIR}; cp -a etc root home var /sysroot) - (cd /sysroot/mnt/cloop; cp -a etc root home var /sysroot) + # ensure that /sysroot/linurc exists + [ ! -e /sysroot/linuxrc ] && ln -snf ${INITEXEC} /sysroot/linuxrc # ensure the right permissions chmod 1777 /sysroot/tmp @@ -174,11 +242,21 @@ cd / +# unset hotplug event-manager +echo > /proc/sys/kernel/hotplug + # de-silencio echo 3 > /proc/sys/kernel/printk +if [[ ${BREAK_ENABLED} = yes ]] +then + echo "-- Break requested, type 'exit' to resume operation ..." + ash +fi + echo "-- Switching to real sysroot ..." -umount /sys -umount /proc +mount --move /dev /sysroot/dev +mount --move /sys /sysroot/sys +mount --move /proc /sysroot/proc -exec run-init /sysroot /sbin/init $@ /sysroot/dev/console +exec run-init /sysroot ${INITEXEC} $@ /sysroot/dev/console