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 ${ROOT_DIR}/build/initramfs-serial /media/openslx-stick/boot/serial $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 create_serial_module copy_files umount_stick run_syslinux unset_quiet pinfo "FINISHED: You can unplug the stick now!" }