summaryrefslogtreecommitdiffstats
path: root/build_tools/clarch/larch/run/usbboot_grub
diff options
context:
space:
mode:
Diffstat (limited to 'build_tools/clarch/larch/run/usbboot_grub')
-rwxr-xr-xbuild_tools/clarch/larch/run/usbboot_grub180
1 files changed, 180 insertions, 0 deletions
diff --git a/build_tools/clarch/larch/run/usbboot_grub b/build_tools/clarch/larch/run/usbboot_grub
new file mode 100755
index 0000000..2f837d5
--- /dev/null
+++ b/build_tools/clarch/larch/run/usbboot_grub
@@ -0,0 +1,180 @@
+#! /bin/bash
+#
+# usbboot_grub
+#
+# Author: Michael Towers <gradgrind[at]online[dot]de>
+
+# 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.06.22
+
+APP="$( basename $0 )"
+
+usage () {
+ echo
+ echo "Usage:"
+ echo " ${APP} [<Arch installation root directory>]"
+ echo
+ echo " Prepare a bootable USB-stick from a larch build."
+ echo " If no Arch directory is given, '/' is assumed."
+ exit 1
+}
+
+if [ -n "$1" ]; then
+ AINSTALL="$( readlink -f $1 )"
+ if [ ! -x ${AINSTALL}/sbin/grub ]; then
+ echo "ERROR: ${AINSTALL}/sbin/grub not found"
+ exit 1
+ fi
+else
+ AINSTALL=""
+ if ! which grub &>/dev/null; then
+ echo "ERROR: grub not found"
+ exit 1
+ fi
+fi
+CDDATA=${AINSTALL}/.larch/cd
+
+if [ ! -f ${CDDATA}/system.sqf ]; then
+ echo "ERROR: ${CDDATA} does not contain larch cd data"
+ usage
+fi
+if [ ! -f ${CDDATA}/boot/grub/stage1 ]; then
+ echo "ERROR: grub data not in ${CDDATA}/boot/grub"
+ exit 1
+fi
+
+echo "//"
+echo "// **********************************************************"
+echo "//"
+echo "// ${APP} will prepare a bootable USB stick with your"
+echo "// previously prepared larch data from ${CDDATA}"
+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 "//"
+echo "// If you are too cool to be concerned about the warnings,"
+echo "// please insert your USB stick, which should already be"
+echo "// appropriately partitioned."
+echo "//"
+echo "// **********************************************************"
+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 "//"
+echo "// Enter the number of the partition you wish to use (0 to quit):"
+
+devices=/tmp/devices$$
+:> ${devices}
+i=0
+sfdisk -d | grep "/dev/sd[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 "//"
+read -p "// \"${device}\" will now be prepared. Continue? [y/N]: " ans
+if [ -z "`echo ${ans} | grep '^ *[yY]'`" ]; then exit 1; fi
+
+echo "//"
+echo "// Formatting ${device} (ext2)"
+dev=${device:0:8}
+part=${device:8}
+sfdisk ${dev} -N${part} <<EOF
+,,L,*
+EOF
+
+mke2fs ${device}
+
+echo "// Copying the files"
+stick=/tmp/mnt
+mkdir -p ${stick}
+umount ${device} &>/dev/null
+mount ${device} ${stick}
+if [ $? != 0 ]; then
+ echo "ERROR: Failed to mount device, quitting"
+ exit 3
+fi
+cp -a ${CDDATA}/* ${stick}
+umount ${stick}
+
+# Convert the device and partion to grub syntax
+grubdevice ()
+{
+## The contents of device.map look something like this:
+#(fd0) /dev/fd0
+#(hd0) /dev/hda
+#(hd1) /dev/sda
+gdev="$( cat ${AINSTALL}${dmap} | grep "${dev}" | cut -f1 | tr -d "()" )"
+gpart=$(( ${part} - 1 ))
+echo "// Installing GRUB to (${gdev}), root (${gdev},${gpart})"
+}
+
+dmap=/tmp/device.map
+rm -f ${AINSTALL}${dmap}
+if [ -n "${AINSTALL}" ]; then
+ # First try to get a device mapping
+ mount --bind /dev ${AINSTALL}/dev
+ echo "quit" | chroot ${AINSTALL} grub --no-floppy --device-map=${dmap} --batch
+ grubdevice
+ # Now actually install grub
+ # As far as I can tell, the extra options to grub are not needed here
+ chroot ${AINSTALL} grub --batch <<EOT
+root (${gdev},${gpart})
+setup (${gdev})
+quit
+EOT
+ umount ${AINSTALL}/dev
+else
+ # First try to get a device mapping
+ echo "quit" | grub --no-floppy --device-map=${dmap} --batch
+ grubdevice
+ # Now actually install grub
+ # As far as I can tell, the extra options to grub are not needed here
+ grub --batch <<EOT
+root (${gdev},${gpart})
+setup (${gdev})
+quit
+EOT
+fi
+rm -f ${AINSTALL}${dmap}
+
+echo "//"
+echo "// Done!"
+echo "// If all went well your usb stick should now be a bootable larch system"