#!/bin/sh #some nice colors: COLRED="\033[1;6m\033[31m" COLGREEN="\033[1;6m\033[32m" COLYELLOW="\033[1;6m\033[33m" COLBLUE="\033[1;6m\033[34m" COLMAGENTA="\033[1;6m\033[35m" COLWHITE="\033[1;6m\033[37m" COLDEFAULT="\033[0m" COLOREDSTAR="${COLBLUE}(${COLGREEN}*${COLBLUE})${COLDEFAULT} " CDID=cdid PATH="/bin:/sbin:/usr/bin:/usr/sbin" DOSCSI=no DOUSB=no if [ -e /mods_scsi ] then MODS_SCSI="$(cat /mods_scsi)" else MODS_SCSI="" fi if [ -e /mods_usb ] then MODS_USB="$(cat mods_usb)" else MODS_USB="" fi #some needed functions populate_udev() { /sbin/udevstart # not provided by sysfs but needed ln -snf /proc/self/fd /dev/fd ln -snf fd/0 /dev/stdin ln -snf fd/1 /dev/stdout ln -snf fd/2 /dev/stderr ln -snf /proc/kcore /dev/core ln -snf /proc/asound/oss/sndstat /dev/sndstat # create problematic directories mkdir -p /dev/pts mkdir -p /dev/shm #same as /dev/.devfsd touch /dev/.udev return 0 } kernel_major_version() { local KV KV="$(uname -r|cut -d. -f1-2)" echo "${KV}" } scan_kernel_modules() { local MODS TYPE="$1" MODS="$2" if [ "$(kernel_major_version)" = "2.6" ] then MOD_SUFFIX="ko" else MOD_SUFFIX="o" fi echo -e ${COLWHITE}"-- Loading ${TYPE} modules:"${COLDEFAULT} for i in ${MODS} do if [ -e /modules/${TYPE}/${i}.${MOD_SUFFIX} ] then insmod.static -f /modules/${TYPE}/${i}.${MOD_SUFFIX} > /dev/null 2>&1 if [ $? -eq 0 ] then echo -e ${COLWHITE}"-- ${i}"${COLDEFAULT} fi else echo -e ${COLWHITE}"-- ${i} not found."${COLDEFAULT} fi done } #check_drives $devices $fstype check_drives() { local devices local fs devices="$1" fs="$2" for dev in ${devices} do mount -t ${fs} ${dev} /mnt/mnt/tmp >/dev/null 2>&1 media_found=$? #if mount was ok check if cdid exists if [ "${media_found}" -eq 0 ] then if [ -e /mnt/mnt/tmp/${CDID} ] then media_id_ok=$? fi umount /mnt/mnt/tmp if [ "${media_id_ok}" -eq 0 ] then echo -e ${COLOREDSTAR}"${COLGREEN}Magellan boot device found.${COLDEFAULT}" BOOT_DEVICE="${dev}" FSTYPE=${fs} break; fi fi done } # first of all read in kernel-config params . /etc/conf.d/kernel # remount / writeable mount -n -oremount,rw /dev/ram0 / -t cramfs # mount proc if [ ! -e /proc/mounts ] then [ ! -d "/proc" ] && mkdir -p /proc echo -e ${COLOREDSTAR}"${COLWHITE}Mounting proc file system ...${COLDEFAULT}" mount -t proc proc /proc fi # kernel 2.6-x needs sysfs if [ "$(kernel_major_version)" = "2.6" ] then [ ! -d /sys ] && mkdir /sys echo -e ${COLOREDSTAR}"${COLWHITE}Mounting sysfs file system ...${COLDEFAULT}" mount -t sysfs none /sys fi ### load devfs ### # mount devfs only with a 2.4 kernel or its really wanted with a 2.6 if [ "$(kernel_major_version)" = "2.4" -o "${RC_USED_DEV}" = "devfs" ] then [ ! -d "/dev" ] && mkdir -p /dev if [ ! -e /dev/.devfsd ] then echo -e ${COLOREDSTAR}"${COLWHITE}Mounting devfs file system ...${COLDEFAULT}" mount -t devfs devfs /dev fi fi #### load udev #### # load udev only with a 2.6 kernel if [ "$(kernel_major_version)" = "2.6" -a "${RC_USED_DEV}" = "udev" ] then # create a ramdisk for populating udev echo -e ${COLOREDSTAR}"${COLWHITE}Mounting ramfs at /dev ...${COLDEFAULT}" mount -n -t ramfs none /dev # if a device tarball exists load it and if it is activated echo -e ${COLOREDSTAR}"${COLWHITE}Configurating system to use udev ...${COLDEFAULT}" # now load udev populate_udev # if hotplug support exists in the kernel use it to manage udev echo -e ${COLOREDSTAR}"${COLWHITE} Setting /sbin/udev as hotplug agent ...${COLDEFAULT}" echo "/sbin/udev" > /proc/sys/kernel/hotplug fi # kernel2.6 needs again devpts if [ "$(kernel_major_version)" = "2.6" ] then echo -e ${COLOREDSTAR}"${COLWHITE}Mounting devpts at /dev/pts ...${COLDEFAULT}" [ ! -d "/dev/pts" ] && mkdir -p /dev/pts mount -n -t devpts -o gid=4,mode=0620 none /dev/pts fi # disable kernel messages to console echo "0" > /proc/sys/kernel/printk # check command line for params for i in $(cat /proc/cmdline) do case "${i}" in doscsi) DOSCSI=yes ;; dousb) DOUSB=yes ;; esac done # now load all needed modules if [ -n "${MODS_SCSI}" -a "${DOSCSI}" = "yes" ] then scan_kernel_modules "scsi" "${MODS_SCSI}" echo fi if [ -n "${MODS_USB}" -a "${DOUSB}" = "yes" ] then scan_kernel_modules "usb" "${MODS_USB}" echo fi # create newroot mount point with tmpfs mkdir -p /mnt mount -t tmpfs tmpfs /mnt mkdir -p /mnt/mnt/tmp mkdir -p /mnt/mnt/cdrom mkdir -p /mnt/mnt/cloop mkdir -p /mnt/mnt/magellan # needed for the usbstick, the timeout maybe to short echo -e ${COLOREDSTAR}"${COLWHITE}Waiting 3 seconds for possible usb mount ..." sleep 3 # searching cdrom with cdid BOOT_DEVICE="" FSTYPE="" echo -e ${COLOREDSTAR}"${COLWHITE}Searching for a boot device ..." # searching usbstick check_drives "/dev/scsi/host[0-99]/bus[0-99]/target[0-99]/lun[0-99]/part[0-99]" "vfat" # for cdrom_device in $CDROM_LIST (ide) check_drives "/dev/cdroms/*" iso9660 # scsi cdroms check_drives "/dev/sr*" iso9660 # mount our rootfs from cdrom if [ "${BOOT_DEVICE}" = "" ] then echo -e ${COLREDSTAR}"${COLRED}No Magellan boot CD/USBStick found!!!${COLDEFAULT}" ash exit 1 else echo -e ${COLOREDSTAR}"${COLWHITE}Booting from: $BOOT_DEVICE ...${COLDEFAULT}" mount -o ro -t "${FSTYPE}" "${BOOT_DEVICE}" /mnt/mnt/cdrom >/dev/null 2>&1 # write our boot_device to /mnt/.bootdev for later use (mtab) echo "BOOTDEV=${BOOT_DEVICE}" > /mnt/.bootdev echo "FSTYPE=${FSTYPE}" >> /mnt/.bootdev if [ -f /mnt/mnt/cdrom/livecdrootfs.cloop ] then # mount rootfs (cloop) echo -e ${COLOREDSTAR}"${COLWHITE}Mounting cloop system image ...${COLDEFAULT}" echo [ ! -e /dev/cloop ] && mknod /dev/cloop b 240 0 insmod /lib/modules/misc/cloop.o file=/mnt/mnt/cdrom/livecdrootfs.cloop > /dev/null mkdir -p /mnt/mnt/cloop mount -o ro -t ext2 /dev/cloop /mnt/mnt/cloop else # mount squashfs echo -e ${COLOREDSTAR}"${COLWHITE}Mounting squashfs system image ...${COLDEFAULT}" echo [ ! -e /dev/loop0 ] && mknod /dev/loop0 b 7 0 mount -o loop,ro -t squashfs /mnt/mnt/cdrom/livecdrootfs.sqsh /mnt/mnt/cloop fi # symlinking cloop rootfs to /mnt as newroot cd /mnt for x in bin sbin lib boot usr opt do ln -s mnt/cloop/${x} ${x} done mkdir -p initrd proc tmp sys var/tmp dev chmod 1777 tmp var/tmp # make /mnt/dev/console & /mnt/dev/null [ ! -e /mnt/dev/console ] && mknod -m 600 /mnt/dev/console c 5 1 [ ! -e /mnt/dev/null ] && mknod -m 666 /mnt/dev/null c 1 3 (cd /mnt/mnt/cloop; cp -a etc root home var /mnt) # shurely change to correct permissions chmod 1777 /mnt/tmp chmod 1777 /mnt/var/tmp #ash # set default verbose level for kernel messages [ -z "${RC_VERBOSE_LEVEL}" ] && RC_VERBOSE_LEVEL=3 echo "${RC_VERBOSE_LEVEL}" > /proc/sys/kernel/printk cd /mnt pivot_root . initrd # dirty but working # umount devpts umount -n /initrd/dev/pts &> /dev/null # wait a little bit to be safe sleep 1 # umount devfs or udev umount -n /initrd/dev &> /dev/null # umount sysfs umount -n /initrd/sys &> /dev/null # umount proc umount -n /initrd/proc &> /dev/null #debug #/initrd/bin/busybox ash #enter chroot and umount /initrd exec chroot . sh -c 'umount -n /initrd >/dev/null 2>&1;\ exec -a init.new /sbin/init'\ /dev/console 2>&1 fi