#!/bin/sh # $Id$ # loads given kernel modules load_kernel_modules() { local type="$1" local module local args echo -e "-- Loading ${type} modules:" ( cat /etc/modules.${type}; echo) | while read module args do case "${module}" in \#*|"") continue ;; esac if [ -e /lib/${module}.ko ] then insmod -f /lib/${module}.ko ${args} > /dev/null 2>&1 [ $? -eq 0 ] && echo -e "-- ${module}" fi done echo } # check_drives $devices $fstype check_drives() { local devices="$1" local fs="$2" for dev in ${devices} do mount -t ${fs} ${dev} /sysroot/mnt/cdrom >/dev/null 2>&1 media_found=$? # if mount was ok check if cdid exists if [ "${media_found}" -eq 0 ] then [ -e /sysroot/mnt/cdrom/livecdrootfs.sqsh ] && media_id_ok=$? umount /sysroot/mnt/cdrom if [ "${media_id_ok}" -eq 0 ] then echo -e "Magellan boot device found." BOOT_DEVICE="${dev}" FSTYPE="${fs}" break fi fi done } ## some defaults ## DOSCSI=no DOUSB=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 mount -t tmpfs tmpfs /dev -o rw,mode=0644,size=1024 # install all busybox applets busybox --install -s # silencio echo 0 > /proc/sys/kernel/printk # check command line for params for i in $(cat /proc/cmdline) do case "${i}" in 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" [ "${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!!) mount -t tmpfs tmpfs /sysroot mkdir -p /sysroot/mnt/cdrom mkdir -p /sysroot/mnt/cloop mkdir -p /sysroot/mnt/magellan # needed for the usbstick, the timeout maybe to short if [ "${DOUSB}" = "yes" ]; then echo "-- Waiting 8 seconds for possible usb mount ..." 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="" echo "Searching for a boot device ..." # searching usbstick if [ "${DOUSB}" = "yes" ]; then 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) 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 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 if [ "${BOOT_DEVICE}" = "" ] then echo "No Magellan boot CD/USBStick found!!!" ash exit 1 else echo -e "Booting from: $BOOT_DEVICE ..." mount -o ro -t "${FSTYPE}" "${BOOT_DEVICE}" /sysroot/mnt/cdrom >/dev/null 2>&1 # write our boot_device to /mnt/.bootdev for later use (mtab) echo "BOOTDEV=${BOOT_DEVICE}" > /sysroot/.bootdev echo "FSTYPE=${FSTYPE}" >> /sysroot/.bootdev # mount squashfs 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 "${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 ${CLOOPMOUNTDIR/\/sysroot\//}/${x} ] && ln -s ${CLOOPMOUNTDIR/\/sysroot\//}/${x} ${x} done mkdir -p initrd proc tmp sys var/tmp dev media # 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) # ensure that /sysroot/linurc exists [ ! -e /sysroot/linuxrc ] && ln -snf ${INITEXEC} /sysroot/linuxrc # ensure the right permissions chmod 1777 /sysroot/tmp chmod 1777 /sysroot/var/tmp fi 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 /dev umount /sys umount /proc exec run-init /sysroot ${INITEXEC} $@ /sysroot/dev/console