#!/bin/sh # $Header: /home/cvsd/magellan-cvs/magellan-src/mkinitrd/lib/linuxrc.sh,v 1.3 2006-02-23 15:54:30 niro Exp $ # 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=no ## starts here ## # mount essential filesystems mount -t proc proc /proc mount -t sysfs sysfs /sys # silencio echo 0 > /proc/sys/kernel/printk echo "-- Creating inital device nodes ..." mount -o mode=0755 -t tmpfs udev /dev mkdir /dev/pts mkdir /dev/shm mkdir /dev/mapper mknod /dev/console c 5 1 mknod /dev/null c 1 3 mknod /dev/ram b 1 1 mknod /dev/rtc c 10 135 mknod /dev/systty c 4 0 mknod /dev/tty c 5 0 mknod /dev/zero c 1 5 mknod /dev/tty0 c 4 0 mknod /dev/tty1 c 4 1 mknod /dev/tty2 c 4 2 mknod /dev/tty3 c 4 3 mknod /dev/tty4 c 4 4 mknod /dev/tty5 c 4 5 mknod /dev/tty6 c 4 6 mknod /dev/tty7 c 4 7 mknod /dev/tty8 c 4 8 mknod /dev/tty9 c 4 9 mknod /dev/tty10 c 4 10 mknod /dev/tty11 c 4 11 mknod /dev/tty12 c 4 12 mknod /dev/ttyS0 c 4 64 mknod /dev/ttyS1 c 4 65 mknod /dev/ttyS2 c 4 66 mknod /dev/ttyS3 c 4 67 echo "-- Starting udevd ..." ln -snf bin /sbin /sbin/udevstart 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 touch /dev/.udev echo "-- Setting up hotplug ..." #echo "/sbin/hotplug" > /proc/sys/kernel/hotplug echo "/sbin/udev" > /proc/sys/kernel/hotplug # check command line for params for i in $(cat /proc/cmdline) do case "${i}" in doscsi) DOSCSI=yes ;; dousb) DOUSB=yes ;; dosata) DOSATA=yes ;; esac done # now load all needed modules load_kernel_modules "generic" [ "${DOSCSI}" = "yes" ] && load_kernel_modules "scsi" [ "${DOUSB}" = "yes" ] && load_kernel_modules "usb" [ "${DOSATA}" = "yes" ] && load_kernel_modules "sata" # 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 3 seconds for possible usb mount ..." sleep 3 fi # searching cdrom with cdid BOOT_DEVICE="" FSTYPE="" echo "Searching for a boot device ..." # searching usbstick if [ "${DOUSB}" = "yes" ]; then check_drives "/dev/scsi/host[0-99]/bus[0-99]/target[0-99]/lun[0-99]/part[0-99]" "vfat" fi # for cdrom_device in $CDROM_LIST (ide) check_drives "/dev/cdroms/*" iso9660 check_drives "/dev/hd*" iso9660 # scsi cdroms if [ "${DOSCSI}" = "yes" ] || [ "${DOSATA}" = "yes" ]; then check_drives "/dev/sr*" iso9660 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 /sysroot/mnt/cloop # symlinking cloop rootfs to /mnt as newroot cd /sysroot 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 # 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 (cd /sysroot/mnt/cloop; cp -a etc root home var /sysroot) # ensure the right permissions chmod 1777 /sysroot/tmp chmod 1777 /sysroot/var/tmp fi cd / # de-silencio echo 3 > /proc/sys/kernel/printk echo "-- Switching to real sysroot ..." umount /sys umount /proc exec run-init /sysroot /sbin/init $@ /sysroot/dev/console