mirror of the now-defunct rocklinux.org
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

509 lines
11 KiB

#!/bin/bash
STAGE_2_BIG_IMAGE="2nd_stage.tar.gz"
STAGE_2_SMALL_IMAGE="2nd_stage_small.tar.gz"
STAGE_2_COMPRESS_ARG="--use-compress-program=gzip"
#640kB, err, 64 MB should be enought for the tmpfs ;-)
TMPFS_OPTIONS="size=67108864"
mod_load_info () { # {{{
read os host version rest < <( uname -a )
if [ -z "${os}" ] ; then
echo "Can't run \`uname -a\`"
return
elif [ "${os}" != "Linux" ] ; then
echo "Your operating system is not supported ?!"
return
fi
mod_loader="/sbin/insmod"
mod_dir="/lib/modules/"
# kernel module suffix for <= 2.4 is .o, .ko if above
if [ ${version:2:1} -gt 4 ] ; then
mod_suffix=".ko"
mod_suffix_len=3
else
mod_suffix=".o"
mod_suffix_len=2
fi
} # }}}
doboot() { # {{{
if ! mkdir -p /mnt_root/old_root ; then
echo "Can't create /mnt_root/old_root"
return 1
fi
if [ ! -f /mnt_root/sbin/init ] ; then
echo "Can't find /mnt_root/sbin/init!"
return 1
fi
# pivot_root may or may not change the PWD and root of the
# caller, so we change into the new root directory first.
cd /mnt_root
if ! pivot_root . "/mnt_root/old_root" ; then
echo "Can't call pivot_root"
cd /
return 1
fi
if ! mount --move /old_root/dev /dev ; then
echo "Can't remount /old_root/dev as /dev"
fi
if ! mount --move /old_root/proc /proc ; then
echo "Can't remount /old_root/proc as /proc"
fi
if [[ "$( < /proc/version )" == "Linux version 2.6."* ]] ; then
if ! mount --move /old_root/sys /sys ; then
echo "Can't remount /old_root/sys as /sys"
fi
fi
if ! umount /old_root/tmp ; then
echo "Can't umount /old_root/tmp"
fi
sed -e "s, /mnt_root , / ," /old_root/etc/mtab > /etc/mtab
# Kill udevd so /old_root can be unmounted.
killall udevd
exec chroot . sh -c "exec /sbin/init" <dev/console >dev/console 2>&1
echo "Can't exec /sbin/init!"
return 1
} # }}}
trymount() { # {{{
source=${1}
target=${2}
mount -t iso9600 -o ro ${source} ${target} && return 0
mount -t ext3 -o ro ${source} ${target} && return 0
mount -t ext2 -o ro ${source} ${target} && return 0
mount -t minix -o ro ${source} ${target} && return 0
mount -t vfat -o ro ${source} ${target} && return 0
return -1
} # }}}
httpload() { # {{{
echo -n "Enter base URL (e.g. http://1.2.3.4/rock): "
read baseurl
[ -z "${baseurl}" ] && return
cat <<EOF
Select a stage 2 image file:
0. ${STAGE_2_BIG_IMAGE}
1. ${STAGE_2_SMALL_IMAGE}
EOF
echo -n "Enter number or image file name (default=0): "
read filename
if [ -z "${filename}" ] ; then
filename="${STAGE_2_BIG_IMAGE}"
elif [ "${filename}" == "0" ] ; then
filename=${STAGE_2_BIG_IMAGE}
elif [ "${filename}" == "1" ] ; then
filename="${STAGE_2_SMALL_IMAGE}"
fi
url="${baseurl%/}/${filename}"
echo "[ ${url} ]"
export ROCK_INSTALL_SOURCE_URL=${baseurl}
if ! mkdir -p /mnt_root ; then
echo "Can't create /mnt_root"
return 1
fi
if ! mount -t tmpfs -O ${TMPFS_OPTIONS} tmpfs /mnt_root ; then
echo "Can't mount /mnt_root"
return 1
fi
wget -O - ${url} | tar ${STAGE_2_COMPRESS_ARG} -C /mnt_root -xf -
echo "finished ... now booting 2nd stage"
doboot
} # }}}
load_modules() { # {{{
# this starts the module loading shell
directory=${1}
cat <<EOF
module loading shell
you can navigate through the filestem with 'cd'. for loading a module
simply enter the shown name, to exit press enter on a blank line.
EOF
cd ${directory}
while : ; do
echo "Directories:"
count=0
while read inode ; do
[ -d "${inode}" ] || continue
echo -n " [ ${inode} ]"
count=$((${count}+1))
if [ ${count} -gt 3 ] ; then
echo
count=0
fi
done < <( ls ) | expand -t1,3,19,21,23,39,41,43,59,61,63,78
echo
echo "Modules:"
count=0
while read inode ; do
[ -f "${inode}" ] || continue
[ "${inode%${mod_suffix}}" == "${inode}" ] && continue
echo -n " [ ${inode%${mod_suffix}} ]"
count=$((${count}+1))
if [ ${count} -gt 3 ] ; then
echo
count=0
fi
done < <( ls ) | expand -t1,3,19,21,23,39,41,43,59,61,63,78
echo
echo -n "[${PWD##*/} ] > "
read cmd par
if [ "${cmd}" == "cd" ] ; then
cd ${par}
elif [ -f "${cmd}${mod_suffix}" ] ; then
insmod ${PWD%/}/${cmd}${mod_suffix} ${par}
elif [ -z "${cmd}" ] ; then
break
else
echo "No such module: ${cmd}"
fi
done
return
} # }}}
getdevice () { # {{{
while : ; do
echo -en "\nDevice file to use (q to return) : ";
read device;
[ "${device}" == "q" ] && return -1;
if [ ! -e "${device}" ] ; then
echo -e "\nNot a valid device!"
else
devicefile=${device}
return 0;
fi
done
} # }}}
getcdromdevice () { # {{{
cdroms="${1}"
floppies="${2}"
autoboot="${3}"
devicelists="/dev/cdroms/* /dev/floppy/*"
[ "${cdroms}" == "0" -a "${floppies}" == "0" ] && return -1
devnr=0
for dev in ${devicelists} ; do
[ -e "${dev}" ] || continue
[[ ${dev} = /dev/cdroms* ]] && [ "${cdroms}" == "0" ] && continue
[[ ${dev} = /dev/floppy* ]] && [ "${floppies}" == "0" ] && continue
eval "device_${devnr}='${dev}'"
devnr=$((${devnr}+1))
done
[ ${devnr} -eq 0 ] && return -1
x=0
floppy=1
cdrom=1
while [ ${x} -lt ${devnr} ] ; do
eval "device=\${device_${x}}"
if [[ ${device} = /dev/cdrom* ]] ; then
echo " ${x}. CD-ROM #${cdrom} (IDE/ATAPI or SCSI)"
cdrom=$((${cdrom}+1))
fi
if [[ ${device} = /dev/flopp* ]] ; then
echo " ${x}. FDD (Floppy Disk Drive) #${floppy}"
floppy=$((${floppy}+1))
fi
x=$((${x}+1))
done
echo -en "\nEnter number or device file name (default=0): "
if [ ${autoboot} -eq 1 ] ; then
echo "0"
text=0
else
read text
fi
[ -z "${text}" ] && text=0
while : ; do
if [ -e "${text}" ] ; then
devicefile="${text}"
return 0
fi
eval "text=\"\${device_${text}}\""
if [ -n "${text}" ] ; then
devicefile="${text}"
return 0
fi
echo -n "No such device found. Try again (enter=back): "
read text
[ -z "${text}" ] && return -1
done
return 1;
} # }}}
load_ramdisk_file() { # {{{
devicetype=${1}
autoboot=${2}
mountopts=""
echo -en "Select a device for loading the 2nd stage system from: \n\n"
if [ "${devicetype}" == "cdroms" ] ; then
getcdromdevice 1 1 ${autoboot} || return
mountopts="-o ro"
else
getdevice || return
fi
cat << EOF
Select a stage 2 image file:
1. ${STAGE_2_BIG_IMAGE}
2. ${STAGE_2_SMALL_IMAGE}
EOF
echo -n "Enter number or image file name (default=1): "
if [ ${autoboot} -eq 1 ] ; then
echo "1"
text=1
else
read text
fi
if [ -z "${text}" ] ; then
filename="${STAGE_2_BIG_IMAGE}"
elif [ "${text}" == "1" ] ; then
filename="${STAGE_2_BIG_IMAGE}"
elif [ "${text}" == "2" ] ; then
filename="${STAGE_2_SMALL_IMAGE}"
else
filename="${text}"
fi
echo "Using ${devicefile}:${filename}."
if ! mkdir -p /mnt_source ; then
echo "Can't create /mnt_source"
return 1
fi
if ! mount ${mountopts} ${devicefile} "/mnt_source" ; then
echo "Can't mount /mnt_source"
return 1
fi
if ! mkdir -p /mnt_root ; then
echo "Can't create /mnt_root"
return 1
fi
if ! mount -t tmpfs -o ${TMPFS_OPTIONS} tmpfs /mnt_root ; then
echo "Can't mount tmpfs on /mnt_root"
return 1
fi
echo "Extracting 2nd stage filesystem to ram ..."
if ! tar ${STAGE_2_COMPRESS_ARG} -C /mnt_root -xf /mnt_source/${filename} ; then
echo "Can't extract /mnt/source/${filename}"
return 1
fi
if ! umount "/mnt_source" ; then
echo "Can't umount /mnt_source"
fi
if ! rmdir "/mnt_source" ; then
echo "Can't remove /mnt_source"
fi
export ROCK_INSTALL_SOURCE_DEV=${devicefile}
export ROCK_INSTALL_SOURCE_FILE=${filename}
doboot
} # }}}
activate_swap() { # {{{
echo
echo -n "Enter file name of swap device: "
read text
if [ -n "${text}" ] ; then
swapon ${text}
fi
} # }}}
config_net() { # {{{
ip addr
echo
ip route
echo
echo -n "Enter interface name (eth0): "
read dv
[ -z "${dv}" ] && dv="eth0"
echo -n "Enter ip (192.168.0.254/24): "
read ip
[ -z "${ip}" ] && ip="192.168.0.254/24"
ip addr add ${ip} dev ${dv}
ip link set ${dv} up
echo -n "Enter default gateway (none): "
read gw
[ -n "${gw}" ] && ip route add default via ${gw}
ip addr
echo
ip route
echo
} # }}}
exec_sh() { # {{{
echo "Quit the shell to return to the stage 1 loader!"
/bin/sh
} # }}}
checkisomd5() { # {{{
echo "Select a device for checking: "
getcdromdevice 1 0 0 || return
echo "Running check..."
/bin/checkisomd5 --verbose ${devicefile}
code=${?}
if [ ${code} -eq 0 ] ; then
echo "MD5Sum is correct."
elif [ ${code} -eq 1 ] ; then
echo "MD5Sum is NOT correct! Please contact the authors!"
fi
echo "Press Return key to continue."
read
} # }}}
emit_udev_events() { # {{{
/sbin/udevtrigger
/sbin/udevsettle
} # }}}
input=1
[ -z "${autoboot}" ] && autoboot=0
# mount / / -o remount,rw || echo "Can't remount / read-/writeable"
# mount / / -o remount,rw || echo "Can't remount / read-/writeable (for mount log)"
mount -t tmpfs tmpfs /tmp -o ${TMPFS_OPTIONS} || echo "Can't mount a tmpfs on /tmp"
mount -t proc proc /proc || echo "Can't mount proc on /proc!"
/sbin/depmod -ae
case "$( < /proc/version )" in
"Linux version 2.4."*)
mount -t devfs devfs /dev || echo "Can't mount devfs on /dev!" ;;
"Linux version 2.6."*)
mount -t sysfs sysfs /sys || echo "Can't mount sysfs on /sys!"
if type -p udevd > /dev/null ; then
mount -t tmpfs tmpfs /dev || echo "Can't mount a tmpfs on /dev!"
cp -r /lib/udev/devices/* /dev
echo "" > /proc/sys/kernel/hotplug
/sbin/udevd --daemon
# create nodes for devices already in kernel
emit_udev_events
mod_load_info
# some devices (scsi...) need time to settle...
echo "Waiting for devices to settle..."
sleep 5
fi ;;
esac
ip addr add 127.0.0.1 dev lo
ip link set lo up
if [ ${autoboot} -eq 1 ] ; then
load_ramdisk_file cdroms 1
fi
autoboot=0
cat << EOF
============================================
=== ROCK Linux 1st stage boot system ===
============================================
The ROCK Linux install / rescue system boots up in two stages. You
are now in the first of this two stages and if everything goes right
you will not spend much time here. Just load your SCSI and networking
drivers (if needed) and configure the installation source so the
2nd stage boot system can be loaded and you can start the installation.
EOF
while : ; do
cat <<EOF
0. Load 2nd stage system from cdrom or floppy drive
1. Load 2nd stage system from any device
2. Load 2nd stage system from network
3. Configure network interfaces (IPv4 only)
4. Load kernel modules from this disk
5. Load kernel modules from another disk
6. Activate already formatted swap device
7. Execute a shell (for experts!)
8. Validate a CD/DVD against its embedded checksum
EOF
echo -n "What do you want to do [0-8] (default=0)? "
read text
[ -z "${text}" ] && text=0
input=${text//[^0-9]/}
case "${input}" in
0)
load_ramdisk_file cdroms 0
;;
1)
load_ramdisk_file any 0
;;
2)
httpload
;;
3)
config_net
;;
4)
load_modules "${mod_dir}"
;;
5)
mkdir "/mnt_floppy" || echo "Can't create /mnt_floppy"
trymount "/dev/floppy/0" "/mnt_floppy" && load_modules "/mnt_floppy"
umount "/mnt_floppy" || echo "Can't umount /mnt_floppy"
rmdir "/mnt_floppy" || echo "Can't remove /mnt_floppy"
;;
6)
activate_swap
;;
7)
exec_sh
;;
8)
checkisomd5
;;
*)
echo "No such option present!"
esac
done