#!/bin/sh
|
|
# --- SDE-COPYRIGHT-NOTE-BEGIN ---
|
|
# This copyright note is auto-generated by ./scripts/Create-CopyPatch.
|
|
#
|
|
# Filename: target/share/install/init
|
|
# Copyright (C) 2006 - 2009 The OpenSDE Project
|
|
# Copyright (C) 2006 The T2 SDE Project
|
|
#
|
|
# More information can be found in the files COPYING and README.
|
|
#
|
|
# This program is free software; you can redistribute it and/or modify
|
|
# it under the terms of the GNU General Public License as published by
|
|
# the Free Software Foundation; version 2 of the License. A copy of the
|
|
# GNU General Public License can be found in the file COPYING.
|
|
# --- SDE-COPYRIGHT-NOTE-END ---
|
|
|
|
# partly based on linuxrc.c, Copyright (C) 2003, 2004 Cliford Wolf and Rene Rebe
|
|
# converted from C to shell code and heavily cleaned and improved for the T2 SDE
|
|
|
|
echo "OpenSDE early userspace ..."
|
|
|
|
PATH=/sbin:/bin:/usr/bin:/usr/sbin
|
|
|
|
echo "Mounting /dev, /proc and /sys ..."
|
|
mount -t tmpfs none /dev
|
|
mount -t proc none /proc
|
|
mount -t usbfs none /proc/bus/usb
|
|
mount -t sysfs none /sys
|
|
ln -s /proc/self/fd /dev/fd
|
|
|
|
if [ ! -c /dev/console ]; then
|
|
mknod /dev/console c 5 1
|
|
fi
|
|
if [ ! -c /dev/null ]; then
|
|
mknod /dev/null c 1 3
|
|
fi
|
|
if [ ! -c /dev/zero ]; then
|
|
mknod /dev/zero c 1 5
|
|
fi
|
|
|
|
echo "Populating /dev (u/dev) ..."
|
|
echo "" > /sys/kernel/uevent_helper
|
|
udevd --daemon
|
|
udevadm trigger
|
|
udevadm settle
|
|
|
|
# Only print important stuff to console
|
|
# klogctl(8, NULL, 3);
|
|
|
|
|
|
doboot()
|
|
{
|
|
if [ ! -e /mnt_root/sbin/init ]; then
|
|
echo "Can't find /mnt_root/sbin/init."
|
|
exit_linuxrc=0
|
|
fi
|
|
|
|
if [ $exit_linuxrc = 1 ]; then
|
|
mount /dev /mnt_root/dev -t none -o move
|
|
mount /proc /mnt_root/proc -t none -o move
|
|
mount /sys /mnt_root/sys -t none -o move
|
|
|
|
if [ ! -c /mnt_root/dev/console ]; then
|
|
mknod /mnt_root/dev/console c 5 1
|
|
fi
|
|
if [ ! -c /mnt_root/dev/null ]; then
|
|
mknod /mnt_root/dev/null c 1 3
|
|
fi
|
|
if [ ! -c /mnt_root/dev/zero ]; then
|
|
mknod /mnt_root/dev/zero c 1 5
|
|
fi
|
|
|
|
# copy stuff only in the 1st_stage image
|
|
mkdir -p /mnt_root/lib/modules
|
|
cp -ar /lib/modules/* /mnt_root/lib/modules/
|
|
|
|
# TODO: inject more first stage stuff if it was a small image
|
|
|
|
# Before we switch to the real root we have to kill
|
|
# the udevd we started in early userspace
|
|
ls -1l /mnt_root/proc/*/exe 2> /dev/null | \
|
|
sed -n -e "s,.*/proc/\([0-9]*\)/.*udevd.*,kill \1,p" | \
|
|
/bin/sh
|
|
|
|
exec switch_root /mnt_root /sbin/init
|
|
else
|
|
umount /mnt_root
|
|
rmdir /mnt_root
|
|
fi
|
|
}
|
|
|
|
trymount()
|
|
{
|
|
for fs in iso9660 ext3 ext2 minix vfat; do
|
|
mount $1 $2 -t $fs -o ro && return
|
|
done
|
|
}
|
|
|
|
select_2nd_stage()
|
|
{
|
|
# choices
|
|
case $1 in
|
|
http://*|ftp://*)
|
|
# the last sed is a uniq
|
|
images=`fget $1/ | sed 's/[<>"]/\n/g' | sed -n '/2nd_stage/p' |
|
|
sed 'h;:b
|
|
$b
|
|
N; /^\(.*\)\n\1$/ {g; bb
|
|
}
|
|
$b
|
|
P; D'`
|
|
;;
|
|
*)
|
|
mkdir /mnt_source
|
|
trymount $1 /mnt_source
|
|
images=`cd /mnt_source ; ls 2nd_stage*.tar*`
|
|
umount /mnt_source; rmdir /mnt_source
|
|
;;
|
|
esac
|
|
|
|
[ "$images" ] || return 1
|
|
|
|
echo "Select a second stage image file:"
|
|
mem=`sed -n '/MemTotal/{s/.* \([[:digit:]]*\) .*/\1/p}' /proc/meminfo`
|
|
i=1; default=$i
|
|
for x in $images; do
|
|
if [[ "$x" = *small* ]]; then
|
|
[ $mem -le 96000 ] && default=$i
|
|
else
|
|
[ $mem -gt 96000 ] && default=$i
|
|
fi
|
|
echo " $(( i++ )). $x"
|
|
done
|
|
echo -n "Enter number or image file name (default=$default): "
|
|
|
|
in=; [ $autoload = 0 ] && read in || echo
|
|
[ "$in" ] || in=$default
|
|
|
|
i=1
|
|
for x in $images; do
|
|
if [ "$(( i++ ))" = $in ]; then
|
|
eval $2=$x
|
|
return
|
|
fi
|
|
done
|
|
}
|
|
|
|
httpload()
|
|
{
|
|
baseurl=
|
|
filename=
|
|
url=
|
|
|
|
echo -en "\nEnter base URL (e.g. http://1.2.3.4/t2): "
|
|
|
|
read baseurl
|
|
[ "$baseurl" ] || return
|
|
|
|
select_2nd_stage "$baseurl" filename
|
|
if [ -z "$filename" ]; then
|
|
echo "Failure retrieving the second stage image."
|
|
return
|
|
fi
|
|
|
|
exit_init=1
|
|
url=$baseurl/$filename
|
|
|
|
echo -e "[ $url ]\n"
|
|
export ROCK_INSTALL_SOURCE_URL=$baseurl
|
|
|
|
exit_linuxrc=1
|
|
mkdir /mnt_root || exit_linuxrc=0
|
|
|
|
mount none /mnt_root -t tmpfs || exit_linuxrc=0
|
|
|
|
fget $url | ( cd /mnt_root; tar x ) # -z
|
|
|
|
echo "finished ... continuing execution of second stage"
|
|
doboot
|
|
}
|
|
|
|
load_modules()
|
|
{
|
|
echo "TODO: implement module loading shell"
|
|
}
|
|
|
|
getdevice()
|
|
{
|
|
device=
|
|
devicelist=`ls /dev/cdrom* /dev/floppy* 2>/dev/null`
|
|
|
|
# FIXME review and cleanup needed:
|
|
if [ -z "$devicelist" ]; then
|
|
# with udev, these links are not created yet, so try to find
|
|
# device based on sysfs
|
|
for sysname in /sys/*/*/removable; do
|
|
[ `cat $sysname` = 1 ] || continue
|
|
|
|
devname="`echo $sysname | sed -e 's,/removable,,' -e 's,.*/,,'`"
|
|
|
|
# FIXME as udev is not running yet we are probably save
|
|
# to assume that /dev/$devname exists, a check should be
|
|
# performed however
|
|
|
|
devicelist="$devicelist /dev/$devname"
|
|
done
|
|
|
|
if [ -z "$devicelist" ]; then
|
|
echo "No device found."
|
|
return
|
|
fi
|
|
fi
|
|
|
|
i=1
|
|
default=
|
|
for dev in $devicelist ; do
|
|
x=`readlink $dev`; [ "$x" ] && [[ "$x" != /dev/* ]] && x=/dev/$x
|
|
[ "$x" ] && dev=$x
|
|
case $dev in
|
|
/dev/floppy*|/dev/fd*)
|
|
echo " $i. $dev Floppy Disk Drive" ;;
|
|
*)
|
|
model=`cat /proc/ide/${dev#/dev/}/model 2>/dev/null`
|
|
[ "$model" ] || model="SCSI or ATAPI CD-ROM"
|
|
echo " $i. $dev $model"
|
|
[ "$default" ] || default=$i
|
|
;;
|
|
esac
|
|
: $(( i++ ))
|
|
done
|
|
[ "$default" ] || default=1
|
|
|
|
echo -en "\nEnter number or device file name (default=$default): "
|
|
|
|
in=; [ $autoload = 0 ] && read in || echo
|
|
[ "$in" ] || in=$default
|
|
while [ -z "$device" ]; do
|
|
[ -z "$in" ] && return
|
|
if [ -e $in ]; then
|
|
device=$in
|
|
else
|
|
i=1
|
|
for x in $devicelist; do
|
|
[ $in = $i ] && device=$x
|
|
: $(( i++ ))
|
|
done
|
|
fi
|
|
|
|
if [ -z "$device" ]; then
|
|
echo -n "No such device found. Try again (enter=back): "
|
|
read in
|
|
fi
|
|
done
|
|
|
|
eval $1=$device
|
|
}
|
|
|
|
load_ramdisk_file()
|
|
{
|
|
devicefile=
|
|
filename=
|
|
|
|
echo -e "\nSelect a device for loading the second stage system from:\n"
|
|
|
|
getdevice devicefile
|
|
if [ -z "$devicefile" ]; then
|
|
echo "No device detected."
|
|
return
|
|
fi
|
|
|
|
select_2nd_stage $devicefile filename
|
|
if [ -z "$filename" ]; then
|
|
echo "No image found."
|
|
return
|
|
fi
|
|
|
|
exit_linuxrc=1
|
|
echo "Using $devicefile:$filename"
|
|
|
|
mkdir /mnt_source || exit_linuxrc=0
|
|
trymount $devicefile /mnt_source || exit_linuxrc=0
|
|
|
|
mkdir /mnt_root || exit_linuxrc=0
|
|
mount none /mnt_root -t tmpfs || exit_linuxrc=0
|
|
|
|
echo "Extracting second stage filesystem ..."
|
|
cat /mnt_source/$filename | ( cd /mnt_root; tar x ) || # -z
|
|
echo "Can't run tar on $fielname."
|
|
|
|
umount /mnt_source || exit_linuxrc=0
|
|
rmdir /mnt_source || exit_linuxrc=0
|
|
|
|
export ROCK_INSTALL_SOURCE_DEV=$devicefile
|
|
export ROCK_INSTALL_SOURCE_FILE=$filename
|
|
doboot
|
|
}
|
|
|
|
activate_swap()
|
|
{
|
|
echo -ne "\nEnter file name of swap device: "
|
|
|
|
read in
|
|
[ "$in" ] && swapon $in
|
|
}
|
|
|
|
net_config()
|
|
{
|
|
echo -n "Interfaces: "; ls -A /sys/class/net/
|
|
|
|
echo -n "Enter interface name (eth0): "
|
|
read dev ; [ "$dev" ] || dev="eth0"
|
|
|
|
echo -n "Enter IP address (auto): "
|
|
read ip
|
|
if [ "$ip" ]; then
|
|
echo -n "Enter default gateway (none): "
|
|
read gw
|
|
ipconfig $ip::$gw:::$dev:none
|
|
else
|
|
# let the link autoneg.
|
|
ipconfig :::::$dev:none > /dev/null 2>&1 ; sleep 4
|
|
echo "Auto configuration via DHCP, BOOTP, RARP ..."
|
|
ipconfig -d $dev -t 10
|
|
fi
|
|
}
|
|
|
|
exec_sh()
|
|
{
|
|
echo "Exit the shell to return to the 1st stage loader."
|
|
sh
|
|
}
|
|
|
|
load_modules_disk ()
|
|
{
|
|
mkdir /mnt_floppy
|
|
|
|
trymount /dev/floppy/0 /mnt_floppy
|
|
load_modules /mnt_floppy
|
|
|
|
umount /mnt_floppy
|
|
rmdir /mnt_floppy
|
|
}
|
|
|
|
# try to auto-load from a disc, first
|
|
autoload=1
|
|
|
|
echo "
|
|
OpenSDE installer (1st stage - loader) ...
|
|
|
|
The OpenSDE install system boots up in two stages. You are now in the first
|
|
stage and if everything goes right, you will not spend much time here.
|
|
Just configure the installation source so the second stage boot system can
|
|
be loaded and you can start the installation."
|
|
exit_init=0
|
|
while [ $exit_init = 0 ]; do
|
|
echo -n "
|
|
0. Load second stage system from local device
|
|
1. Load second stage system from network
|
|
2. Configure network interfaces
|
|
3. Load kernel modules from this disk
|
|
4. Load kernel modules from another disk
|
|
5. Activate already formatted swap device
|
|
6. Run shell (for experts!)
|
|
|
|
What do you want to do [0-8] (default=0)? "
|
|
|
|
in=; [ $autoload = 0 ] && read in || echo
|
|
[ "$in" ] || in=0
|
|
case $in in
|
|
0) load_ramdisk_file ;;
|
|
1) httpload ;;
|
|
2) net_config ;;
|
|
3) load_modules ;;
|
|
4) load_modules_disk ;;
|
|
5) activate_swap ;;
|
|
6) exec_sh ;;
|
|
*) echo "No such option." ;;
|
|
esac
|
|
# only try autoload once
|
|
autoload=0
|
|
done
|
|
|
|
exec /sbin/init /sbin/init
|
|
|
|
echo -e "\nPanic: Can't start /sbin/init!\n\n"
|
|
|