mirror of
https://github.com/fspc/gbootroot.git
synced 2025-02-23 09:03:23 -05:00
for Initrd.yard
This commit is contained in:
parent
23c5e6f602
commit
53c132336b
180
yard/replacements/etc/linuxrc
Executable file
180
yard/replacements/etc/linuxrc
Executable file
@ -0,0 +1,180 @@
|
||||
#!/bin/bash -x
|
||||
# $id$
|
||||
|
||||
##############################################################################
|
||||
##
|
||||
##
|
||||
## Copyright (C) 2002 by Jonathan Rosenbaum
|
||||
## <freesource@users.sourceforge.net>
|
||||
##
|
||||
## 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 >dev/console 2>&1
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user