From 53c132336bab58049cc9fe5b2bbf828432f926ca Mon Sep 17 00:00:00 2001 From: freesource Date: Mon, 16 Dec 2002 04:09:14 +0000 Subject: [PATCH] for Initrd.yard --- yard/replacements/etc/linuxrc | 180 ++++++++++++++++++++++++++++++++++ 1 file changed, 180 insertions(+) create mode 100755 yard/replacements/etc/linuxrc diff --git a/yard/replacements/etc/linuxrc b/yard/replacements/etc/linuxrc new file mode 100755 index 0000000..f848751 --- /dev/null +++ b/yard/replacements/etc/linuxrc @@ -0,0 +1,180 @@ +#!/bin/bash -x +# $id$ + +############################################################################## +## +## +## Copyright (C) 2002 by Jonathan Rosenbaum +## +## +## GNU General Public License +## +############################################################################## + +# initrd using mtdram or blkmtd: This is most useful for jffs/jffs2 +# filesystems. + + +# Find all the necessary details from /proc/cmdline +# Parse for runlevel, too, both from cmdline and inittab if it exists. +# This assumes init= isn't being used, otherwise use this instead. + +PATH=/mnt/sbin:/mnt/usr/sbin:/mnt/bin:/mnt/usr/bin:/sbin:/usr/sbin:/bin:/usr/bin:$PATH:. + +mount -t proc none /proc + +# All filesystems made with cramfs/jffs/jffs2 will need the /dev and /initrd +# directories automatically added. + +MTD_TYPE=`cat /proc/cmdline | cut -d= -f2 | cut -d, -f1` +FS_TYPE=`cat /proc/cmdline | cut -d= -f2 | cut -d, -f2` +TOTAL_SIZE=`cat /proc/cmdline | cut -d= -f2 | cut -d, -f3` +ERASURE_SIZE=`cat /proc/cmdline | cut -d= -f2 | cut -d, -f4` +INIT=`cat /proc/cmdline | cut -d= -f2 | cut -d, -f5` +FILE_PATH=`cat /proc/cmdline | sed s/.*ubd[0-9][a-z]\\\?=// | cut -d" " -f1` +FILE_USER=${FILE_PATH%/*} +FILE_DD=${FILE_PATH##/*/} +FILE=${FILE_DD/_dd/} +UBD_NUMBER=` cat /proc/cmdline | sed s/.*ubd// | sed s/[^0-9].*//` +CHROOT=/mnt/usr/sbin/chroot + +# devfs or not? +if [ `cat /proc/cmdline | sed s/.*devfs=// | cut -d" " -f1` = nomount ] +then + MTD=/dev/mtd0 + MTDBLOCK=/dev/mtdblock0 + UBD=/dev/ubd$UBD_NUMBER + DEVFS=nomount +else + MTD=/dev/mtd/0 + MTDBLOCK=/dev/mtdblock/0 + UBD=/dev/ubd/$UBD_NUMBER + DEVFS=mount +fi + + +############### +# MTDRAM +############### + +# There are total_size=$TOTAL_SIZE erase_size=$ERASURE_SIZE +# options, see http://www.iptel-now.de/HOWTO/MTD/mtd.html +# Auto-determine total_size if user doesn't as well as mem option to kernel. +# Need to know which filesystem, and type + +if [ $MTD_TYPE = mtdram ] +then + if [ $ERASURE_SIZE ] + then + insmod mtdram.o -o mtdram$UBD_NUMBER total_size=$TOTAL_SIZE erase_size=$ERASURE_SIZE + dd if=$UBD of=$MTD + mount -t $FS_TYPE $MTDBLOCK /mnt + else + insmod mtdram.o -o mtdram$UBD_NUMBER total_size=$TOTAL_SIZE + dd if=$UBD of=$MTD + mount -t $FS_TYPE $MTDBLOCK /mnt + fi +fi + + +############## +# BLKMTD +############## + +# ubd/0 is going to be a dd copy, and a larger size than the real image +# by default, but the user can specify a different size. +# dd if=root_fs_jffs2 of=root_fs_jffs2_dd +# and it will be mysteriously replaced for the real ubd/0 specified by the +# user .. the fs with dd appended when blkmtd is chosen. + +if [ $MTD_TYPE = blkmtd ] +then + insmod blkmtd.o -o blkmtd$UBD_NUMBER device=$UBD + if [ $ERASURE_SIZE ] + then + erase $MTD 0 $ERASURE_SIZE + else + erase $MTD 0 0x20000 + fi + mount -t hostfs none -o $FILE_USER /mnt + dd if=/mnt/$FILE of=$MTD + umount /mnt + mount -t $FS_TYPE $MTDBLOCK /mnt +fi + +######################### +# RUNLEVEL or MTD_INIT +######################### + +if [ ! $INIT ] +then + if [ -e /mnt/etc/inittab ] + + then + INIT="sbin/init $(grep initdefault /mnt/etc/inittab | cut -d: -f2)" + else + INIT="sbin/init 2" + fi +fi + + +############### +# PIVOT_ROOT +############### + +cd /mnt + +# Check if directory already exists .. cramfs/jffs/jffs2 better have this. +# This is done automatically by gbootroot, but it is good to check. + +if [ ! -d /mnt/initrd ] +then + /sbin/mkdir /mnt/initrd +fi + +if [ ! -d /mnt/dev -a ! -L /mnt/dev ] +then + /sbin/mkdir /mnt/dev +fi + +# For pivot_root to work chroot needs to be on the root filesystem +if [ ! -f $CHROOT ] +then + CHROOT=`which chroot | sed s,/mnt,,` + if [ $CHROOT = /usr/sbin/chroot ] + then + echo "ERROR: Can't find chroot, add it to the root filesystem." + echo " Staying in the initrd. :-)" + /bin/bash + fi +else + CHROOT=/usr/sbin/chroot +fi + +if [ $DEVFS = mount ] +then + mount -t devfs none /mnt/dev +fi + +pivot_root . initrd +cd / + +# User may have to supply init level or type of init, and there is mtd_init +# option to the kernel. +exec $CHROOT . $INIT dev/console 2>&1 + + + + + + + + + + + + + + + +