#!/bin/bash # # larch2hdd # # Author: Michael Towers # This file is part of the larch project. # # larch 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; either version 2 of the License, or # (at your option) any later version. # # larch is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with larch; if not, write to the Free Software Foundation, Inc., # 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # #---------------------------------------------------------------------------- # 2008.11.18 APP="$( basename $0 )" echo "//" echo "// **********************************************************" echo "//" echo "// ${APP} will install this larch live system to an existing" echo "// partition (not including changes you have made during the" echo "// current session). It can also install GRUB to the MBR." echo "//" echo "// As an alternative it might render your system unbootable." echo "// If that thought disturbs you please don't continue." echo "//" echo "// This program is DANGEROUS - you have been warned!!!" echo "//" # test if the script is started by root user. If not, exit if [ $UID -ne 0 ]; then echo "Only root can run ${APP}"; exit 1 fi echo "// If you are too cool to be concerned about the warnings," echo "// please press 'y' and ." echo "//" echo "// **********************************************************" echo "//" read -p "// Continue? [y/N]: " ans if [ -z "$( echo ${ans} | grep '^ *[yY]' )" ]; then exit 0; fi if [ -f /.livesys/medium/boot/larch.img ]; then bootdir=boot elif [ -f /.livesys/medium/isolinux/larch.img ]; then bootdir=isolinux elif [ -f /.livesys/medium/syslinux/larch.img ]; then bootdir=syslinux else echo "ERROR: No larch system found" exit 1 fi echo "//" echo "// Enter the number of the partition you wish to use (0 to quit):" devices=/tmp/devices$$ :> ${devices} i=0 sfdisk -d | grep "/dev/[hs]d[a-z][1-4] " | grep -v "Id= [05]" | \ sed "s|\(.*\):.*size=\( *[0-9]*\).*|\1 \2|" | while read device sectors; do i=$(( ${i} + 1 )) echo "${device}" >>${devices} echo "// ${i}: ${device} $(( ${sectors} / 2048 )) MiB" done while true; do read -p "// Device: " d if [ "${d}" -eq "0" ]; then exit 1; fi i=0 { while read device; do i=$(( ${i} + 1 )) if [ "${d}" -eq "${i}" ]; then break 2; fi done } <${devices} done rm ${devices} echo "//" echo "// \"${device}\" will now be formatted. All data on it will be lost." read -p "// Continue? [y/N]: " ans if [ -z "`echo ${ans} | grep '^ *[yY]'`" ]; then exit 0; fi echo "//" echo "// Formatting ${device} (ext2)" dev=${device:0:8} part=${device:8} sfdisk ${dev} -N${part} </dev/null mount ${device} ${imp} if [ $? != 0 ]; then echo "ERROR: Failed to mount device, quitting" exit 1 fi if ! cp -a /.livesys/medium/* ${imp}; then echo "// Couldn't copy live system." umount ${imp} exit 1 fi mv ${imp}/${bootdir} ${imp}/bdtmp if [ -d ${imp}/boot ]; then # Just in case ... mv ${imp}/boot ${imp}/oldboot fi mkdir -p ${imp}/boot/grub mv ${imp}/bdtmp/vmlinuz ${imp}/boot mv ${imp}/bdtmp/larch.img ${imp}/boot rm -r ${imp}/bdtmp # Render this system invisible to a normal larch boot device search if [ -f ${imp}/larch/larchboot ]; then mv ${imp}/larch/larchboot ${imp}/larch/no_larchboot fi # Set up menu.lst dmap=/tmp/device.map rm -f ${dmap} # First try to get a device mapping echo "quit" | grub --no-floppy --device-map=${dmap} --batch # Convert the device and partion to grub syntax ## The contents of device.map look something like this: #(fd0) /dev/fd0 #(hd0) /dev/hda #(hd1) /dev/sda gdev="$( cat ${dmap} | grep "${dev}" | cut -f1 | tr -d "()" )" gpart=$(( ${part} - 1 )) rm -f ${dmap} # I think I can get the UUID of a partition like this: #uuid="$( blkid -c /dev/null -o value -s UUID ${device} )" cat >${imp}/boot/grub/menu.lst <