Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed
#!/bin/bash################################################################## Installes the LiveCD on local harddisk## Boot LiveCD and run this script as root## Urs Beyerle, PSI################################################################################################################################ Definitions################################################################ files which should be restored from .ori filesFILES_RESTORE="/etc/init.d/netfs \/etc/init.d/autofs \/etc/init.d/halt \/etc/init.d/network/etc/init.d/functions \/etc/rc.d/rc.sysinit \/etc/sysconfig/afs \/etc/motd \/etc/redhat-release \/etc/rc.d/rc.sysinit"LIVECD_INIT_SCRIPS="/etc/init.d/runfirst \/etc/init.d/runveryfirst \/etc/init.d/runlast \/etc/init.d/kudzu-auto"# Main directories which should be not be copiedDIR_NOT_COPY="/proc /dev /livecd /boot /afs /sys /mnt /media"# Mount point of the new SL systemNEW=/mnt/harddiskSCRIPTNAME=$( basename $0 )################################################################ Functions###############################################################function usage() {## Usage# ----------------------------------------------------------cat <<EOF$SCRIPTNAME [OPTIONS] [PARTITION]Installes LiveCD on PARTITION.OPTIONS:-h print this screen-mbr [device] install grub on MBR of [device]-swap [partition] use [partition] as swap-y answer all questions with yesEOF}################################################################ Main################################################################## are we rootif [ "$( whoami )" != "root" ]; thenecho "Please run this script as root."# exit 1fi### read options from command-linewhile [ $# -gt 0 ]; docase "$1" in-h)usage; exit;;-swap)shift; SWAP_PART=$1; shift; continue;;-mbr)shift; MBR_DEV=$1; shift; continue;;-y)YES=$1; shift; continue;;*)INSTALL_PART=$1; break;;esacdoneecho### test if MBR_DEV is givenif [ ! $MBR_DEV ]; thenecho "No MBR device defined - where should grub be installed?"echo "Please see '$SCRIPTNAME -h'."; echoexit 1fi### test if $INSTALL_PART defined and existsif [ ! $INSTALL_PART ]; thenecho "No partition defined for installation"echo "Please see '$SCRIPTNAME -h'."; echoexit 1fi### test if $INSTALL_PART existsfdisk -l | cut -d" " -f1 | grep -q "^${INSTALL_PART}$"if [ "$?" != "0" ]; thenecho "Partition $INSTALL_PART not found! (see 'disk -l')"; echoexit 1fi### set $INSTALL_DEV (eg. /dev/sda)INSTALL_DEV=$( echo "$INSTALL_PART" | sed -e 's%\([sh]d[a-z]\)[0-9]*$%\1%' )INSTALL_PART_NR=$( echo "$INSTALL_PART" | sed -e 's%.*/[sh]d[a-z]\([0-9]*\)$%\1%' )### test if $SWAP_PART existsif [ $SWAP_PART ]; thenfdisk -l | cut -d" " -f1 | grep -q "^${SWAP_PART}$"if [ "$?" != "0" ]; thenecho "Swap partition $SWAP_PART not found! (see 'disk -l')"; echoexit 1fifdisk -l | grep "Linux swap" | cut -d" " -f1 | grep -q "^${SWAP_PART}$"if [ "$?" != "0" ]; thenecho "Partition $SWAP_PART is not a Linux swap partition! (see 'disk -l')"; echoexit 1fifi### print warningecho "-----------------------------------------------------------"echo " LiveCD will be installed on partition $INSTALL_PART."[ "$SWAP_PART" ] && echo " Partition $SWAP_PART will be used as swap partition."echoecho " !! Master Boot Record of $MBR_DEV will be overwritten !!"echo " !! All data on $INSTALL_PART will be lost !!"echo "-----------------------------------------------------------"echo### continue ?if [ ! $YES ]; thenecho -n "Continue (y/N)? "read -n 1 keyecho[ "$key" != "y" ] && exit 0fiecho### format $INSTALL_PARTecho -n "Format $INSTALL_PART, please wait ... "mkfs.ext3 -q $INSTALL_PART || exit 1echo "done."; echo### mount $INSTALL_PARTecho -n "Try to mount $INSTALL_PART to $NEW ... "mkdir -p $NEWmount $INSTALL_PART $NEW || exit 1echo "done."; echo### copy root dirsecho "Copy Live System to $INSTALL_PART:"root_dirs=$( ls / )for dir in $root_dirs; do# check if dir is not in $DIR_NOT_COPYdo_not_copy=""for not_dir in $DIR_NOT_COPY; doif [ "$not_dir" = "/$dir" ]; thendo_not_copy="yes"breakfidone# do not copy links[ -L /$dir ] && do_not_copy="yes"if [ ! $do_not_copy ]; thenecho -n " * Copy /$dir ... "cp -a /$dir $NEWecho "done."fidoneecho### move /usr/opt /optif [ -d $NEW/usr/opt ]; thenecho -n "Move /opt back ... "mv $NEW/usr/opt $NEW/echo "done."; echofi### create dirs which were not copiedfor dir in $DIR_NOT_COPY; domkdir $NEW/$dirdonermdir $NEW/livecd $NEW/mnt### copy back original filesecho -n "Restore original files ... "for file in $FILES_RESTORE; do[ -r $NEW/${file}.ori ] && cp -a $NEW/${file}.ori $NEW/${file}doneecho "done."; echo### some mounts for $NEW# mount --bind /dev $NEW/dev# mount null -t proc $NEW/proc# mount --bind /sys $NEW/sys# mount -t proc proc $NEW/proc### re-install grubecho "Re-install grub:"; echorpm --root $NEW -e --nodeps grubyum -y --installroot=$NEW install grubgrub-install --root-directory=$NEW $MBR_DEVecho "done."; echo### re-install kernelecho "Re-install kenel(s):"; echorpm --quiet --root $NEW -q kernel-smp && smp_installed="yes"rpm --root $NEW -e --nodeps kernelyum -y --installroot=$NEW install kernelif [ $smp_installed ]; thenrpm --root $NEW -e --nodeps kernel-smpyum -y --installroot=$NEW install kernel kernel-smpfiecho "done."; echo### create grub.conf fileecho "Create grub.conf"KERNEL_VERSION=$( rpm -q --qf "%{V}-%{R}" kernel )TITLE="Scientific Linux (${KERNEL_VERSION})"# convert dev syntax to grub syntaxdevice_map=$NEW/boot/grub/device.mapGRUB_INSTALL_DEV=$( grep $INSTALL_DEV $device_map | awk '{ print $1 }' )GRUB_ROOT_PART=$( echo "$GRUB_INSTALL_DEV" | sed "s%)$%,`expr $INSTALL_PART_NR - 1`)%" )GRUB_WIN_PART=(hd0,0)cat > $NEW/boot/grub/grub.conf <<EOF# grub.conf generated by $SCRIPTNAMEdefault=0timeout=5splashimage=$GRUB_ROOT_PART/boot/grub/splash.xpm.gz#hiddenmenutitle $TITLEroot $GRUB_ROOT_PARTkernel /boot/vmlinuz-$KERNEL_VERSION ro root=$INSTALL_PARTinitrd /boot/initrd-$KERNEL_VERSION.imgtitle Windowsrootnoverify $GRUB_WIN_PARTchainloader +1EOFchmod 600 $NEW/boot/grub/grub.confln -s ../boot/grub/grub.conf $NEW/etc/grub.confln -s ./grub.conf $NEW/boot/grub/menu.lstecho "done."; echogrub-install --root-directory=$NEW $MBR_DEV### create /etc/fstabcat > $NEW/etc/fstab <<EOF$INSTALL_PART / ext3 defaults 1 1devpts /dev/pts devpts gid=5,mode=620 0 0tmpfs /dev/shm tmpfs defaults 0 0proc /proc proc defaults 0 0sysfs /sys sysfs defaults 0 0EOFif [ $SWAP_PART ]; thenecho "$SWAP_PART swap swap defaults 0 0" >> $NEW/etc/fstabfi### remove LiveCD init.d scriptsfor file in $LIVECD_INIT_SCRIPS; dorm -f $NEW/$filedone### umount $INSTALL_PART# umount $INSTALL_PART