summaryrefslogtreecommitdiffstats
path: root/inc/functions.usb.sh
diff options
context:
space:
mode:
Diffstat (limited to 'inc/functions.usb.sh')
-rw-r--r--inc/functions.usb.sh203
1 files changed, 203 insertions, 0 deletions
diff --git a/inc/functions.usb.sh b/inc/functions.usb.sh
new file mode 100644
index 0000000..47ccbd4
--- /dev/null
+++ b/inc/functions.usb.sh
@@ -0,0 +1,203 @@
+SHORT_OPTS=":vfdhs"
+LONG_OPTS="version,force,sudo,debug,help"
+
+KERNEL="kernel-preboot-latest"
+INITRAMFS="initramfs-default"
+
+LOG_DIR="/tmp/pbmtk"
+
+run_module_checks () {
+
+ if [ "x$SUDO" != "x1" -a $(whoami) != "root" ]; then
+ perror "You should be root or use '--sudo' switch."
+ exit 1;
+ fi
+
+ if [ ! -z $1 ]; then
+ perror "Too many parameters. \n"
+ print_usage
+ exit 1
+ fi
+
+ if [ -z $OUT_DEV ]; then
+ perror "No output device specified.\n"
+ print_usage
+ exit 1
+ fi
+
+ if [ ! -e "/dev/$OUT_DEV" ]; then
+ perror "There is no /dev/${OUT_DEV}."
+ exit 1
+ fi
+
+# if [ -z $(which uuencode) ]; then
+# perror "'uuencode' is missing (if you are on a debian/ubuntu system: apt-get install sharutils)"
+# exit 1
+# fi
+}
+
+init_params () {
+ FORCE=0
+ DEBUG=0
+ SUDO=0
+}
+
+print_usage() {
+ echo "Usage: $(basename $SELF) usb [OPTIONS] DEVICE"
+ echo -e " -d --debug \t give more debug output"
+ echo -e " -f --force \t don't ask questions"
+ echo -e " -s --sudo \t use sudo instead of requesting uid=0"
+ echo -e " -h --help \t print help"
+ echo -e " -v --version \t print version information"
+ echo "DEVICE is the device used by the usb stick (e.g. \"sdX\" for /dev/sdX)."
+}
+
+read_params() {
+ getopt_start $@
+
+ eval set -- "$GETOPT_TEMP"
+
+ while true ; do
+ case "$1" in
+ -v|--version)
+ echo "OpenSLX PreBoot USB stick installer ($VERSION - $VDATE)."
+ exit 0
+ ;;
+ -h|--help)
+ print_usage
+ exit 0
+ ;;
+ -f|--force) pinfo "Disable user-interaction."; FORCE=1; shift ;;
+ -d|--debug) pinfo "Enabled debugmode."; DEBUG=1; unset_quiet; shift ;;
+ -s|--sudo) pinfo "Enabled usage of sudo."; SUDO=1; shift ;;
+ --) shift ; break ;;
+ *) perror "Internal error!" ; exit 1 ;;
+ esac
+ done
+
+ OUT_DEV=$1
+ shift
+
+ [ "x$SUDO" = "x1" ] && SUDOCMD="sudo"
+}
+
+ask_user () {
+ unset_quiet
+ if [ "x$FORCE" != "x1" ]; then
+ pinfo "Device \"/dev/${OUT_DEV}\" will be repartitioned and formatted."
+ pechon "Do you really want to proceed? Then type in 'yes' or 'no' (default: 'no'): "
+ read cont
+ [ "x${cont}" != "xyes" ] && exit 1
+ fi
+ set_quiet
+}
+
+umount_dev () {
+ pinfo "Make sure stick is unmounted."
+ for i in 1 2 3 4 5 6 7 8 9; do
+ $SUDOCMD umount /dev/${OUT_DEV}$i &> /dev/null
+ done
+}
+
+create_partitions () {
+ pinfo "Create partitions on stick."
+ # get the total size of the device
+ DISKSIZE=$($SUDOCMD sfdisk -s /dev/${OUT_DEV} 2>/dev/null || echo 0)
+ DISKSIZE=$((${DISKSIZE}/1024))
+
+ # get the size of boot stuff and calculate the left over free space on device
+ KSIZE=$(ls -l ${ROOT_DIR}/build/${KERNEL}|awk '{print $5}')
+ ISIZE=$(ls -l ${ROOT_DIR}/build/${INITRAMFS}|awk '{print $5}')
+ IMAGESIZE=$(((${KSIZE}+${ISIZE}+6000000)/1048576))
+ FREE=$((${DISKSIZE}-${IMAGESIZE}))
+
+ if [ $IMAGESIZE -lt 16 ]; then
+ perror "Calculated image size too small, something went wrong probably ($IMAGESIZE MB)."
+ fi
+
+ # create bootable vfat at the end of the device if big enough, otherwise use
+ # the entire device
+ if [ ${FREE} -ge 50 ] ; then
+ MAIN_DEV="/dev/${OUT_DEV}2"
+ HOME_DEV="/dev/${OUT_DEV}1"
+ $SUDOCMD sfdisk /dev/${OUT_DEV} -uM << EOF
+,${FREE},L,
+,,6,*
+EOF
+ else
+ MAIN_DEV="/dev/${OUT_DEV}1"
+ HOME_DEV=""
+ $SUDOCMD sfdisk /dev/${OUT_DEV} << EOF
+,,6,*
+EOF
+ fi
+
+ sync
+}
+
+create_fs () {
+ pinfo "Create bootable MBR and filesystems."
+ # copy mbr to stick
+ $SUDOCMD dd bs=440 count=1 conv=notrunc if=${SYSLINUX}/mbr/mbr.bin of=/dev/${OUT_DEV}
+
+ # create filesystems on newly createt partitions
+ $SUDOCMD mkfs.vfat -F 16 -n pbstick ${MAIN_DEV}
+ [ ! -z ${HOME_DEV} ] && $SUDOCMD mkfs.ext2 -L pbstick-home ${HOME_DEV}
+}
+
+mount_stick () {
+ pinfo "Mounting stick."
+ $SUDOCMD mkdir -p /media/openslx-stick
+ $SUDOCMD mount ${MAIN_DEV} /media/openslx-stick
+
+ if [ ! -z ${HOME_DEV} ]; then
+ $SUDOCMD mkdir -p /media/openslx-stick-usrhome
+ $SUDOCMD mount ${HOME_DEV} /media/openslx-stick-usrhome
+ fi
+
+ $SUDOCMD mkdir -p /media/openslx-stick/boot
+}
+
+copy_files () {
+ pinfo "Copy files to stick."
+ $SUDOCMD cp -v ${ROOT_DIR}/build/${KERNEL} /media/openslx-stick/boot/kernel
+
+ $SUDOCMD cp -v ${ROOT_DIR}/build/${INITRAMFS} /media/openslx-stick/boot/initramfs
+
+ $SUDOCMD cp -v ${SYSLINUX}/com32/menu/menu.c32 /media/openslx-stick/boot/
+ $SUDOCMD cp -v ${SYSLINUX}/com32/menu/vesamenu.c32 /media/openslx-stick/boot/
+
+ $SUDOCMD cp -v ${ROOT_DIR}/config/extlinux/* /media/openslx-stick/boot
+ $SUDOCMD mv /media/openslx-stick/boot/extlinux.conf /media/openslx-stick/boot/syslinux.cfg
+}
+
+umount_stick () {
+ pinfo "Unmount stick (it can take some time to sync)."
+ $SUDOCMD umount /media/openslx-stick
+ [ ! -z ${HOME_DEV} ] && $SUDOCMD umount /media/openslx-stick-usrhome
+
+ $SUDOCMD rm -rf /media/openslx-stick*
+}
+
+run_syslinux () {
+ pinfo "Complete syslinux installation."
+ echo "${SYSLINUX}/linux/syslinux --install -d /boot -f ${MAIN_DEV}"
+ $SUDOCMD ${SYSLINUX}/linux/syslinux --install -d /boot -f ${MAIN_DEV}
+}
+
+run () {
+ set_quiet
+
+ ask_user
+ umount_dev
+ create_partitions
+ create_fs
+ mount_stick
+ copy_files
+ umount_stick
+ run_syslinux
+
+ unset_quiet
+
+ pinfo "FINISHED: You can unplug the stick now!"
+}