I was trying to run attached script makeHDD, and it failed saying /sbin/sfdisk was not found. I ran the "which" command from the command line and it returned no result. I went to /sbin and found sfdisk is there. I also found blockdev in /sbin but the "which" command did not find it. So the "which" command, which is in the script, appears not to work for /sbin. Here's the script line:

# check that sfdisk is available, exit if not
sfdiskpath=`which sfdisk 2> /dev/null`
if [ "$?" != "0" ]; then
    echo "Required file sfdisk (typically /sbin/sfdisk) not found on the system...exiting"
    echo
    exit 1
fi

On 2/20/20 5:57 AM, Don Holmes wrote:
Package: buildd.debian.org
Severity: normal

Dear Maintainer,

*** Reporter, please consider answering these questions, where appropriate ***

    * What led up to the situation?
    * What exactly did you do (or not do) that was effective (or
      ineffective)?
    * What was the outcome of this action?
    * What outcome did you expect instead?

*** End of the template - remove these template lines ***



-- System Information:
Debian Release: 10.3
   APT prefers stable-updates
   APT policy: (500, 'stable-updates'), (500, 'stable')
Architecture: amd64 (x86_64)
Foreign Architectures: i386

Kernel: Linux 4.19.0-8-amd64 (SMP w/2 CPU cores)
Locale: LANG=en_US.UTF-8, LC_CTYPE=en_US.UTF-8 (charmap=UTF-8), 
LANGUAGE=en_US.UTF-8 (charmap=UTF-8)
Shell: /bin/sh linked to /usr/bin/dash
Init: systemd (via /run/systemd/system)
LSM: AppArmor: enabled
#! /bin/bash

. "${BASH_SOURCE%/*}/inisup"

clear
echo 
"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"
echo "     The makeHDD script to install to hard drive or UFD - TeraByte, Inc."
echo 
"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"
echo

# Once installed to a partition (FAT16/32 or Ext2), that partition can be slid,
# copied, imaged/restored and will still boot. If installed to ext2, the 
partition
# can also be resized, but not for FAT16/32.

# although root not required if permissions are correct, there's too much
# chance that they aren't, and fixing it is dependent on distro and user's
# knowledge of Linux

# check running as root
userid=`id -u`
if [ ! "$userid" = "0" ]; then
    echo "This script must be run as root...exiting"
    echo
    exit 1
fi

# check if running from iflnet or from a distro
# if running from disk, determine if iflbuild dir contains the boot disk config 
items
# if so, run as if intalled on a distro, with the same options to create custom 
disks
if [ -f /tbu/utility/running ]; then
    rundir=`pwd`
    if [ "$rundir" = "/tbu/iflbuild" ] && [ "$0" = "./makeHDD" ]; then
        runmode=distro
        util=util
        tbosdtpath="./util/tbosdt"
    else
        runmode=running
        util=utility
        tbosdtpath="/tbu/tbosdt"
        cd /tbu
    fi
else
    util=util
    tbosdtpath="./util/tbosdt"
    runmode=distro
fi

# get directory owner id
currentdir=`pwd`
if [ "$runmode" = "distro" ]; then
    # get directory owner and group
    currentdir=`pwd`
    ownerid=`stat -c %U $currentdir`
    groupid=`stat -c %G $currentdir`
    if [ "$ownerid" = "root" ]; then ownerid=0; fi
    if [ "$groupid" = "root" ]; then groupid=0; fi
    if [ "$currentdir" = "/" ]; then
        echo "This script cannot be run from the / directory...exiting"
        echo
        exit 1
    fi
    # chown all files and directories to owner:group
    # as precaution make sure running from IFL dir, otherwise don't do it
    if [ "$0" = "./makeHDD" ]; then
        chown -R $ownerid:$groupid util 2> /dev/null
        chown -R $ownerid:$groupid help 2> /dev/null
        chown -R $ownerid:$groupid wireless 2> /dev/null
        chown -R $ownerid:$groupid scripts 2> /dev/null
        chown -R $ownerid:$groupid iscsi 2> /dev/null
        chown -R $ownerid:$groupid cdboot 2> /dev/null
        chown -R $ownerid:$groupid pxe 2> /dev/null
        chown -R $ownerid:$groupid grub 2> /dev/null
        chown -R $ownerid:$groupid tbosdtfiles 2> /dev/null
        chown $ownerid:$groupid *
    fi
else
    ownerid=0; groupid=0
fi

# check for read/write access and running on Linux fs
tf1=0;tf2=0
for i in `seq 1 5000`
do
    if [ "$tf1" = "0" ]; then
        if [ ! -f t$i ] && [ ! -d t$i ]; then tf1=t$i; fi
    elif [ "$tf2" = "0" ]; then
        if [ ! -f t$i ] && [ ! -d t$i ]; then tf2=t$i; fi
    else
        break
    fi
done
if [ ! "$tf1" = "0" ] && [ ! "$tf2" = "0" ]; then
    touch $tf1 2> /dev/null
    if [ ! -e $tf1 ]; then
        echo "Unable to create a test file. This indicates that this partition"
        echo "is mounted read only. To work with the IFL disk from Linux, the"
        echo "zip archive must be extracted on a *Linux* partition, and that"
        echo "partition must be mounted with read/write privileges...exiting"
        echo
        exit 1
    fi
    chmod +x $tf1
    chmod -x $tf1
    cp $tf1 $tf2
    if [ -x $tf2 ]; then
        rm $tf1; rm $tf2
        echo "This script must be run on a Linux file system. It appears to be"
        echo "either FAT/FAT32 or NTFS. Please extract the IFL zip archive on"
        echo "a Linux partition (ext2/3/4 or reiserfs)...exiting"
        echo
        exit 1
    fi
    rm $tf1; rm $tf2
fi

# if no /sys/block exit (usually means old kernel < 2.6.x)
# script depends heavily on /sys/block to get device information
# Note: contents of /sys/block vary between older/newer 2.6.x kernels
# This script attempts to use only data that is common among them
if [ ! -d /sys/block ]; then 
    echo "The /sys/block directory is not present on this system."
    echo "makeHDD cannot safely be used...exiting"
    echo
    exit 1
fi

# parse command line
mbr=0;active=0;custom=0;nn=0;synerror=0;doini=0;nocfm=0;nf=0;rest=0
for param in $2 $3 $4 $5 $6 $7 $8;
do
    if [ "$param" = "/a" ]; then let active=active+1
    elif [ "$param" = "/mbr" ]; then let mbr=mbr+1
    elif [ "$param" = "/c" ]; then let custom=custom+1
    elif [ "$param" = "/nn" ]; then let nn=nn+1
    elif [ "$param" = "/doini" ]; then let doini=doini+1
    elif [ "$param" = "/nocfm" ]; then let nocfm=nocfm+1
    elif [ "$param" = "/nf" ]; then let nf=nf+1
    elif [ "$param" = "/r" ]; then let rest=rest+1
    elif [ "$param" != "" ]; then synerror=1
    fi
done

if [ "$active" -gt "1" ]; then synerror=1; fi
if [ "$mbr" -gt "1" ]; then synerror=1; fi
if [ "$custom" -gt "1" ]; then synerror=1; fi
if [ "$nn" -gt "1" ]; then synerror=1; fi
if [ "$doini" -gt "1" ]; then synerror=1; fi
if [ "$nocfm" -gt "1" ]; then synerror=1; fi
if [ "$nf" -gt "1" ]; then synerror=1; fi
if [ "$rest" -gt "1" ]; then synerror=1; fi

# /c and /nn not supported when running from iflnet
if [ "$runmode" = "running" ] && [ "$custom" != "0" ]; then synerror=2; fi
if [ "$runmode" = "running" ] && [ "$nn" != "0" ]; then synerror=2; fi
# if [ "$runmode" = "running" ] && [ "$nocfm" != "0" ]; then synerror=2; fi
if [ "$runmode" = "distro" ] && [ "$doini" != "0" ]; then synerror=2; fi

if [ "$rest" = "1" ]; then
    if [ ! -d cdboot ]; then
        synerror=3
    elif [ "$nn" = "1" ] || [ "$custom" = "1" ] || [ "$doini" = "1" ]; then
        synerror=4
    fi
fi

if [ "$runmode" = "distro" ]; then
    if [ "$nn" = "1" ]; then 
        netsupport=0
        isofilename=ifl.iso
        volname=ifl
    elif [ "$nn" = "0" ]; then 
        netsupport=1
        isofilename=iflnet.iso
        volname=iflnet
    else
        netsupport=""
    fi
else
    netsupport=""
fi

device=0;wdevice=0;partition=0;checkremove=0;checkcdrom=0;checkhdx=0
#check for sdx devices first
if [ ! "$1" = "" ]; then
    # cover a to z - someone out there will have it...
    for fd in sd{a..z} nvme{0..20}n{1..9} hd{a..z}
    do
        if [ "$1" = "/dev/$fd" ]; then
            device=$fd
            wdevice=$fd
            checkremove=1
            if [ "${fd:0:2}" = "hd" ]; then
                checkcdrom=1
                checkhdx=1
            fi
            break
        else
            plet=
            if [ "${fd:0:4}" = "nvme" ]; then plet="p"; fi
            for part in {1..63}   # max of 63 partitions on sdx/nvmex/hdx 
devices (check that)
            do
                fdtotal=$fd$plet$part
                if [ "$1" = "/dev/$fdtotal" ]; then
                    device=$fdtotal
                    wdevice=$fd
                    partition=1
                    break
                fi
            done
            if [ ! "$device" = "0" ]; then break; fi
        fi
    done
fi

# show usage if command line error or device not supported
if [ "$device" = "0" ] || [ "$synerror" != "0" ]; then
    echo "Command line entered: $0 $1 $2 $3 $4 $5 $6 $7 $8"
    echo
    if [ "$runmode" = "running" ] && [ "$synerror" = "2" ]; then
        echo "ERROR: The /c and /nn options are not supported in this mode"
        echo
    elif [ "$runmode" = "distro" ] && [ "$synerror" = "2" ]; then
        echo "ERROR: The /doini option is not supported in this mode"
        echo
    elif [ "$synerror" = "3" ]; then
        echo "ERROR: The /r option is not supported in this mode"
        echo
    elif [ "$synerror" = "4" ]; then
        echo "ERROR: The /c, /nn, and /doini options cannot be used with /r"
        echo
    fi

    if [ "$runmode" = "distro" ]; then
        echo "Usage:  ./makeHDD /dev/sdx[y] [/a] [/mbr] [/c] [/nn] [/nf] [/r]"
    else
        echo "Usage:  makeHDD /dev/sdx[y] [/a] [/mbr] [/doini] [/nf] [/r]"
    fi
    echo "  x      - letter repesenting a specific drive (e.g. sdb)"
    echo "  y      - number representing a specific partition (e.g. sdb2)"
    echo "  /mbr   - write standard MBR to drive containing target partition"
    echo "  /a     - set the target partition active"
    if [ "$runmode" = "distro" ]; then
        echo "  /c     - create custom version"
        echo "  /nn    - create non-network version (smaller size)"
        echo "  /nf    - do not re-format partition (FAT16, FAT32 only)"
    elif [ "$runmode" = "running" ]; then
        echo "  /doini - copy custom MakeDisk files (if any) into rootfs"
        echo "  /nf    - do not format partition (FAT16, FAT32 only)"
    fi
    if [ -d cdboot ]; then
        echo "  /r     - create restore media on drive or partition"
    fi
    echo
    echo "Usage examples:"
    if [ "$runmode" = "distro" ]; then
        echo "./makeHDD /dev/sdc          -> install default version to entire 
drive sdc"
        echo "./makeHDD /dev/sdc2         -> install to partition sdc2 on drive 
sdc"
        echo "./makeHDD /dev/sdc2 /a /mbr -> also install MBR to sdc and set 
sdc2 active"
        echo "./makeHDD /dev/sda3 /c      -> install customized version to 
partition sda3"
        echo "./makeHDD /dev/sda3 /nn     -> install non-network version to 
sda3"
    else
        echo "makeHDD /dev/sdc           -> install to entire drive sdc"
        echo "makeHDD /dev/sdc2          -> install to partition sdc2 on drive 
sdc"
        echo "makeHDD /dev/sdc2 /a /mbr  -> also install MBR to sdc and set 
sdc2 active"
        echo "makeHDD /dev/sdc2 /doini   -> install to sdc2 & copy MakeDisk 
files into rootfs"
    fi
    echo
    exit 1
fi

# check that device exists and do other checks based on drive vs partition
if [ "$partition" = "0" ]; then         #installing to whole drive
    if [ ! -e /sys/block/$device ]; then
        echo "Command line entered: $0 $1 $2 $3 $4 $5 $6 $7 $8"
        echo
        echo "Device /dev/$device was not detected on this system...exiting"
        if [ "$runmode" = "running" ]; then
            echo
            echo "Note: You can run 'listhw' to list all drives detected by 
Linux,"
            echo "and 'fdisk -l' to list all partitions on all drives."
        fi
        echo
        exit 1 
    fi
    if [ "$checkremove" = "1" ]; then
        remov=`cat /sys/block/$device/removable`
        if [ "$remov" = "0" ]; then
            echo "Command line entered: $0 $1 $2 $3 $4 $5 $6 $7 $8"
            echo
            echo "Device /dev/$device is not a removable drive...exiting"
            echo
            exit 1
        fi
    fi
    if [ "$checkcdrom" = "1" ] && [ -e /sys/block/$device/device/media ]; then
        cdrom=`cat /sys/block/$device/device/media`
        if [ "$cdrom" = "cdrom" ]; then
            echo "Command line entered: $0 $1 $2 $3 $4 $5 $6 $7 $8"
            echo
            echo "Device /dev/$device is a CD/DVD drive...exiting"
            echo
            exit 1
        fi
    fi
    if [ "$checkhdx" = "1" ]; then
        echo "Command line entered: $0 $1 $2 $3 $4 $5 $6 $7 $8"
        echo
        echo "Device /dev/$device represents an entire drive. For hdx drives,"
        echo "this script will only install to a partition...exiting"
        echo
        exit 1
    fi
else    #installing to partition
    if [ ! -e /sys/block/$wdevice/$device ]; then
        echo "Command line entered: $0 $1 $2 $3 $4 $5 $6 $7 $8"
        echo
        echo "Device /dev/$device was not detected on this system...exiting"
        if [ "$runmode" = "running" ]; then
            echo
            echo "Note: You can run 'listhw' to list all drives detected by 
Linux,"
            echo "and 'fdisk -l' to list all partitions on all drives."
        fi
        echo
        exit 1
    fi
    # check for GPT - not supported for installing to a partition for now
    # read 1st 8 bytes of LBA 1 - should be "EFI PART" if GPT exists
    # check for disk sector sizes of both 512 and 4096 bytes
    for ssize in 512 4096
    do
        dd if=/dev/$wdevice of=/tmp/tmpfile bs=1 count=8 skip=$ssize 2> 
/dev/null
        a=`cat /tmp/tmpfile`; rm /tmp/tmpfile 2> /dev/null
        if [ "$a" = "EFI PART" ]; then
            echo "Command line entered: $0 $1 $2 $3 $4 $5 $6 $7 $8"
            echo
            echo "Drive /dev/$wdevice is a GPT disk containing a GUID partition 
table."
            echo "makeHDD currently does not support installing to a partition 
on GPT"
            echo "disks...exiting"
            echo
            exit 1
        fi
    done
fi

# Note: syslinux won't install to FAT32 partition if < 32 MiB
# Min size for partitions = 64 MiB as of v267
minsize=131072
minsizetext="64 MiB"
# Min size for UFD = 64 MiB (entire drive) as of v267
minsizeUFD=131072
minsizeUFDtext="64 MiB"
# Max size removable drive to install to entire drive as of v267
# maxsizeremovable=134217728
maxsizeremovable=268435456

let maxdisplay=$maxsizeremovable*512
# let maxdisplay=$maxdisplay/1048576
let maxdisplay=$maxdisplay/1073741824
maxdisplay="$maxdisplay GiB"

# get drive/partition size & set up variable to display in human readable manner
dsize=`cat /sys/block/$wdevice/size`
let dsizedisplay=dsize*512
let dsizedisplay=dsizedisplay/1024
let dsizedisplay=dsizedisplay/1024
if [ "$dsizedisplay" -lt "102400" ]; then
    dsizedisplay="$dsizedisplay MiB"
else
    let dsizedisplay=dsizedisplay/1024
    dsizedisplay="$dsizedisplay GiB"
fi
if [ "$partition" = "1" ]; then
    psize=`cat /sys/block/$wdevice/$device/size`
    let psizedisplay=psize*512
    let psizedisplay=psizedisplay/1024
    let psizedisplay=psizedisplay/1024
    if [ "$psizedisplay" -lt "102400" ]; then 
        psizedisplay="$psizedisplay MiB"
    else
        let psizedisplay=psizedisplay/1024
        psizedisplay="$psizedisplay GiB"
    fi
fi

# check that sfdisk is available, exit if not
sfdiskpath=`which sfdisk 2> /dev/null`
if [ "$?" != "0" ]; then
    echo "Required file sfdisk (typically /sbin/sfdisk) not found on the 
system...exiting"
    echo
    exit 1
fi

# check that blockdev (usually /sbin/blockdev) is available, exit if not
blockdevpath=`which blockdev 2> /dev/null`
if [ "$?" != "0" ]; then
    echo "Required file blockdev (typically /sbin/blockdev) not found on the 
system."
    echo "This can be usually be corrected by installing the util-linux 
package."
    echo "Exiting script..."
    echo
    exit 1
fi

# if partition, get the partition type with sfdisk and then do some checks
if [ "$partition" = "1" ]; then  
    # first check that util/sig.bin exists (used to write 55AA)
    if [ ! -e $util/sig.bin ]; then
        echo "Required file $util/sig.bin not found...exiting"
        echo
        exit 1
    fi
    # get partition type - if sfdisk gives error, write sig and try again
    # ptype=`$sfdiskpath --id --force /dev/$wdevice 1 2> /dev/null` (check for 
gpt disk - part 1 = type 55h)
    ptype=`$sfdiskpath --force --id /dev/$wdevice $part 2> /dev/null`
    if [ ! "$?" = "0" ]; then
        dd if=$util/sig.bin of=/dev/$wdevice bs=1 count=2 seek=510
        ptype=`$sfdiskpath --force --id /dev/$wdevice $part 2> /dev/null`
        if [ ! "$?" = "0" ]; then
            echo "Command line entered: $0 $1 $2 $3 $4 $5 $6 $7 $8"
            echo
            echo "Problem with partition table on /dev/$wdevice was reported by 
sfdisk"
            echo "Run the command 'sfdisk --id /dev/$wdevice $part' to see the 
error"
            echo
            exit 1
        fi
    fi
    ptype=${ptype// /}    
    # check for supported partition type and minimum size
    if [ "$ptype" = "6" ] || [ "$ptype" = "e" ]; then  # FAT16
        ptypedisplay=FAT16
        if [ "$psize" -lt "$minsize" ]; then
            echo "Command line entered: $0 $1 $2 $3 $4 $5 $6 $7 $8"
            echo
            echo "Device /dev/$device is a $psizedisplay $ptypedisplay 
partition"
            echo "Minimum size required for a FAT16 partition is 
$minsizetext...exiting"
            echo
            exit 1
        elif [ "$nf" = "1" ]; then
            formatted=0
            blkid | grep "/dev/$device:" > /dev/null
            if [ "$?" = "0" ]; then
                for fs in vfat msdos
                do
                    blkid /dev/$device | grep " TYPE=\"$fs\"" > /dev/null
                    if [ "$?" = "0" ]; then
                        formatted=1
                        break
                    fi
                done
            fi
            if [ "$formatted" = "0" ]; then
                echo "Command line entered: $0 $1 $2 $3 $4 $5 $6 $7 $8"
                echo
                echo "The /nf option (no format) was specified on the command 
line, but dev/$device"
                echo "is not formatted. The /nf option can only be used on an 
already formatted"
                echo "partition...exiting"
                echo
                exit 1
            fi
        fi
    elif [ "$ptype" = "b" ] || [ "$ptype" = "c" ]; then  # FAT32
        ptypedisplay=FAT32
        if [ "$psize" -lt "$minsize" ]; then
            echo "Command line entered: $0 $1 $2 $3 $4 $5 $6 $7 $8"
            echo
            echo "Device /dev/$device is a $psizedisplay $ptypedisplay 
partition"
            echo "Minimum size required for a FAT32 partition is 
$minsizetext...exiting"
            echo
            exit 1
        elif [ "$nf" = "1" ]; then
            formatted=0
            blkid | grep "/dev/$device:" > /dev/null
            if [ "$?" = "0" ]; then
                for fs in vfat msdos
                do
                    blkid /dev/$device | grep " TYPE=\"$fs\"" > /dev/null
                    if [ "$?" = "0" ]; then
                        formatted=1
                        break
                    fi
                done
            fi
            if [ "$formatted" = "0" ]; then
                echo "Command line entered: $0 $1 $2 $3 $4 $5 $6 $7 $8"
                echo
                echo "The /nf option (no format) was specified on the command 
line, but dev/$device"
                echo "is not formatted. The /nf option can only be used on an 
already formatted"
                echo "partition...exiting"
                echo
                exit 1
            fi
        fi
    elif [ "$ptype" = "83" ]; then  # Linux
        ptypedisplay=Linux
        # can't boot from volume if Linux (due to extlinux boot loader not 
supporting it)
        if [ "$part" -gt "4" ]; then
            echo "Command line entered: $0 $1 $2 $3 $4 $5 $6 $7 $8"
            echo
            echo "Device /dev/$device is a Linux volume inside an extended 
partition. Because"
            echo "the extlinux boot loader does not support booting from 
extended/logical"
            echo "volumes, this script will only install to primary Linux 
partitions...exiting"
            echo
            exit 1 
        fi
        if [ "$psize" -lt "$minsize" ]; then
            echo "Command line entered: $0 $1 $2 $3 $4 $5 $6 $7 $8"
            echo
            echo "Device /dev/$device is a $psizedisplay $ptypedisplay 
partition"
            echo "Minimum size required for a Linux partition is 
$minsizetext...exiting"
            echo
            exit 1
        fi
        
#############################################################################################################
        # remove this block if/when it becomes OK to nf ext2/3/4 (tbosdt mount 
0: /dev/sdxy) with extlinux installed)
        if [ "$nf" = "1" ]; then
            echo "Command line entered: $0 $1 $2 $3 $4 $5 $6 $7 $8"
            echo 
            echo "The /nf (no format) option is not supported for Linux 
partitions...exiting"
            echo 
            exit 1
        fi
        
#############################################################################################################
        if [ "$nf" = "1" ]; then
            formatted=0
            blkid | grep "/dev/$device:" > /dev/null
            if [ "$?" = "0" ]; then
                for fs in ext2 ext3 ext4
                do
                    blkid /dev/$device | grep " TYPE=\"$fs\"" > /dev/null
                    if [ "$?" = "0" ]; then
                        formatted=1
                        break
                    fi
                done
            fi
            if [ "$formatted" = "0" ]; then
                echo "Command line entered: $0 $1 $2 $3 $4 $5 $6 $7 $8"
                echo
                echo "The /nf option (no format) was specified on the command 
line, but dev/$device"
                echo "is not formatted with ext2/3/4. The /nf option cannot be 
used on Linux"
                echo "partitions unless they are already formatted with 
ext2/3/4"
                echo
                exit 1
            fi
        fi
    elif [ "$ptype" = "5" ] || [ "$ptype" = "f" ]; then  # extended partition
        echo "Command line entered: $0 $1 $2 $3 $4 $5 $6 $7 $8"
        echo
        echo "Device /dev/$device is an extended partition...exiting"
        echo
        exit 1 
    elif [ "$ptype" = "df" ]; then  # BootItBM type partition
        echo "Command line entered: $0 $1 $2 $3 $4 $5 $6 $7 $8"
        echo
        echo "Device /dev/$device is a type df (BootItBM) partition. Installing 
IFL to this"
        echo "partition type is not supported because its boot record would be 
overwritten"
        echo "each time BootItBM is updated, disabling the IFL boot code."
        echo
        echo "To have BootItBM and IFL share a partition, use a FAT16 or FAT32 
partition,"
        echo "and ensure that it's large enough to hold both. A 100 MiB minimum 
size is"
        echo "recommended...exiting"
        echo
        exit 1
    else        # anything else is not valid
        echo "Command line entered: $0 $1 $2 $3 $4 $5 $6 $7 $8"
        echo
        echo "Device /dev/$device is a type $ptype partition. The target 
partition must"
        echo "be FAT16, FAT32, or Linux Native (type 83)...exiting"
        echo
        exit 1
    fi
    # if installing to logical volume, the /a option does not apply
    if [ "$active" = "1" ] && [ "$partition" = "1" ]; then
        if [ "$part" -gt "4" ]; then
            echo "Command line entered: $0 $1 $2 $3 $4 $5 $6 $7 $8"
            echo
            echo "The /a option was given, but /dev/$device cannot be set 
active because"
            echo "it is not a primary partition."
            echo
            echo "It is still possible to install to this partition, but the /a 
option"
            echo "cannot be used. Installing to this partition will require the 
use of a"
            echo "boot manager that is capable of booting from an 
extended/logical volume."
            echo "Note: BootIt BM from TeraByte Unlimited has this capability."
            echo
            exit 1 
        fi
    fi
fi

# if whole drive check size, see if it is partitioned, and if any partitions 
mounted
if [ "$partition" = "0" ]; then
    if [ "$dsize" -lt "$minsizeUFD" ]; then  # check min size (32 MB)
            echo "Command line entered: $0 $1 $2 $3 $4 $5 $6 $7 $8"
            echo
            echo "Device /dev/$device is a $dsizedisplay drive. Minimum drive 
size"
            echo "required is $minsizeUFDtext...exiting"
            echo
            exit 1
    fi
    
    # commented out this section - currently not limiting size of removable 
drive (UFD)
    #if [ "$dsize" -gt "$maxsizeremovable" ]; then  # check max size for 
removable (8 GB)
    #       echo "Command line entered: $0 $1 $2 $3 $4"
    #       echo
    #       echo "Device /dev/$device is a removable drive, but it's size is 
$dsizedisplay. For"
    #       echo "data safety reasons, this script will not install to a drive 
larger"
    #       echo "than $maxdisplay unless installing to a partition...exiting"
    #       echo
    #       exit 1
    #fi
    
    
    # check if the drive is partitoned - exit if any are mounted
    # warn user that installing to partitioned drive will cause all partitions 
will be lost
    plet=
    if [ "${wdevice:0:4}" = "nvme" ]; then plet="p"; fi
    for i in `seq 1 63`
    do
        if [ -e /sys/block/$wdevice/$wdevice$plet$i ]; then
            partitioned=1
            break
        else
            partitioned=0
        fi
    done
    # check if any partition on drive is mounted
    if [ "$partitioned" = "1" ]; then
        for i in `seq 1 64`
        do
            mdisk=`mount | grep /dev/$device$plet$i > /dev/null`
            if [ "$?" = "0" ]; then
                echo "Command line entered: $0 $1 $2 $3 $4 $5 $6 $7 $8"
                echo
                echo "Drive /dev/$device contains 1 or more PARTITIONS that are 
currently MOUNTED."
                echo "All partitions on /dev/$device must be unmounted before 
installing to this drive."
                echo
                echo "Since drive /dev/$device does contain partitions, please 
be sure that your"
                echo "intent is to install to the drive, rather than to a 
partition on the drive."
                echo "WARNING: Installing to /dev/$device will cause ALL data 
on ALL partitions"
                echo "on that drive to be LOST, and ALL partitions will be 
DELETED...exiting"
                echo
                exit 1
            fi
        done
    fi
    # if whole drive, then /mbr, /a, and /nf options don't apply
    if [ "$mbr" = "1" ] || [ "$active" = "1" ] || [ "$nf" = "1" ]; then
        echo "Command line entered: $0 $1 $2 $3 $4 $5 $6 $7 $8"
        echo    
        echo "One or more of the /mbr, /a, or /nf options are in the command 
line, but none"
        echo "of these options apply unless installing to a partition...exiting"
        echo
        exit 1
    fi
fi

# check if target drive or partition is currently mounted
mdisk=`mount | grep "/dev/$device "> /dev/null`
if [ "$?" = "0" ]; then
    echo "Command line entered: $0 $1 $2 $3 $4 $5 $6 $7 $8"
    echo
    echo "Device /dev/$device is currently MOUNTED."
    if [ "$partition" = "0" ]; then 
        echo "Please unmount the drive and then run 'makeHDD' again."
    else
        echo "Please unmount the partition and then run 'makeHDD' again."
    fi
    echo
    exit 1
fi


# check for necessary files, dependent on options and target type
echo "Checking for required files, directories"
m=0

modprobepath=`which modprobe 2> /dev/null`
if [ "$?" != "0" ]; then
    m=1
    echo "Required file modprobe (typically /sbin/modprobe) not found on the 
system"
fi

# from distro, always need iflnet.iso or ifl.iso
if [ "$runmode" = "distro" ]; then
    if [ ! -e iflnet.iso ] ; then
        m=1
        echo "File iflnet.iso not found in the IFL directory"
    fi
    if [ ! -e ifl.iso ] ; then
        m=1
        echo "File ifl.iso not found in the IFL directory"
    fi    
fi
if [ ! -d $util ]; then
    m=1
    echo "Directory $util was not found"
fi

# if hdd/tmp still there, make sure it's not mounted, if can't unmount, exit
if [ -d hdd/tmp ]; then
    mdisk=`mount | grep hdd/tmp > /dev/null`
    if [ "$?" = "0" ]; then
        umount hdd/tmp 2> /dev/null
        if [ "$?" != "0" ]; then        # try again
            sleep 1
            umount hdd/tmp 2> /dev/null
            if [ "$?" != "0" ]; then
                echo "Unable to unmount hdd/tmp from previous run...exiting"
                echo
                exit 1
            fi
        fi
    fi
fi

# clean up and recreate the hdd working directory
rm -r hdd 2> /dev/null
mkdir hdd

# if building custom version, need cpio, config.txt, unzip if lang versions, 
zcat
if [ "$custom" = "1" ]; then
    # check if util/cpio will execute (won't on 64 bit systems)
    # use /bin/cpio if it exists, otherwise exit
    while [ 0 ]; do
        if [ -x $util/cpio ]; then
            ./util/cpio --help > /dev/null 2>&1
            if [ "$?" = "0" ]; then
                cpiopath="../$util/cpio"
                echo "Using included version of cpio"
                break
            fi
        fi
        cpiopath=`which cpio 2> /dev/null`
        if [ "$?" != "0" ]; then
            m=1
            echo "Required file cpio (typically /bin/cpio) not found on system"
            break
        else
            cpioversion=`$cpiopath --version`
            echo "Using cpio version $cpioversion"
            break
        fi
    done
    if [ ! -e config.txt ]; then
        m=1
        echo "File config.txt not found in the IFL directory"
    fi
    # check for unzip if any language files present (other than ifl_en.zip)
    nlangfiles=`ls ifl_*.zip 2> /dev/null | grep -c ifl`
    if [ "$nlangfiles" != "0" ]; then
        zipcheck=1
        if [ "$nlangfiles" = "1" ] && [ -f ifl_en.zip ]; then zipcheck=0; fi
        if [ "$nlangfiles" = "1" ] && [ -f ifl_en_trial.zip ]; then zipcheck=0; 
fi
        if [ "$nlangfiles" = "1" ] && [ -f ifl_en_gui.zip ]; then zipcheck=0; fi
        if [ "$nlangfiles" = "1" ] && [ -f ifl_en_gui_trial.zip ]; then 
zipcheck=0; fi
        if [ "$zipcheck" = "1" ]; then
            unzippath=`which unzip 2> /dev/null`
            if [ ! "$?" = "0" ]; then
                m=1
                echo "Required program unzip not found on system. This can 
usually be corrected"
                echo "by installing the unzip package."
            fi
        fi
    fi
    # check for zcat
    zcatpath=`which zcat 2> /dev/null`
    if [ ! "$?" = "0" ]; then
        m=1
        echo "Required program zcat (typically /bin/zcat) not found on system."
    fi
fi    

# if setting partition active, need active.bin
if [ "$active" = "1" ] && [ ! -e $util/active.bin ]; then
    m=1
    echo "File $util/active.bin not found"
fi

# if installing mbr, need mbr.bin
if [ "$mbr" = "1" ] && [ ! -e $util/mbr.bin ]; then
    m=1
    echo "File $util/mbr.bin not found"
fi

# if Linux partition need extlinux/mke2fs
if [ "$partition" = "1" ] && [ "$ptype" = "83" ]; then
    if [ "$runmode" = "running" ]; then
        mke2fspath=mke2fs
    else
        mke2fspath=`which mke2fs 2> /dev/null`
        if [ "$?" != "0" ]; then
            if [ -x /sbin/mke2fs ]; then
                mke2fspath=/sbin/mke2fs
            elif [ -x /usr/sbin/mke2fs ]; then
                mke2fspath=/usr/sbin/mke2fs
            else
                m=1    
                echo "File mke2fs (typically /sbin/mke2fs) not found on the 
system"
                echo "This file is part of the e2fsprogs package, which is 
usually"
                echo "installed by default on most distros"
            fi
        fi
    fi
    # check for installed version of extlinux, and if not, use included version 
based on 32 or 64 bit kernel
    # if included version won't run (based on 'ldd'), exit with message to 
install distro package
    if [ "$runmode" = "running" ]; then
        extlinuxpath=extlinux
    else    
        while [ 0 ]; do
            uname -a | grep x86_64 > /dev/null
            if [ "$?" = "0" ]; then bitness=64; else bitness=32; fi
            # use installed version of extlinux if available
            extlinuxpath=`which extlinux 2> /dev/null`
            if [ "$?" != "0" ]; then
                if [ -x /sbin/extlinux ]; then
                    extlinuxpath=/sbin/extlinux
                    echo "Using distro $bitness bit version of extlinux"
                    break
                elif [ -x /usr/sbin/extlinux ]; then
                    extlinuxpath=/usr/sbin/extlinux
                    echo "Using distro $bitness bit version of extlinux"
                    break
                fi
            else
                echo "Using distro $bitness bit version of extlinux"
                break
            fi
            # not installed in distro - try to use included version
            if [ "$bitness" = "64" ]; then
                extlinuxpath="util/extlinux-64"
                extlinuxpathtext="Using included 64 bit version of extlinux"
            else 
                extlinuxpath="util/extlinux"
                extlinuxpathtext="Using included 32 bit version of extlinux"
            fi
            ldd $extlinuxpath > /dev/null
            if [ "$?" = "0" ]; then
                echo $extlinuxpathtext
                break
            # included versions don't run - prompt for user to install disto 
version
            else
                m=1
                echo "Required file extlinux (typically /usr/bin/extlinux) not 
found on the system."
                echo "This can be corrected by installing either the 'syslinux' 
package. For some"
                echo "distros it may be in a separate 'extlinux' package"
                break
            fi
        done
    fi
else    # FATxx partition OR entire drive, need mkdosfs, mcopy, and syslinux
    if [ "$runmode" = "running" ]; then
        mkdosfspath=mkdosfs
    else    
        mkdosfspath=`which mkdosfs 2> /dev/null`
        if [ "$?" != "0" ]; then
            if [ -x /sbin/mkdosfs ]; then
                mkdosfspath=/sbin/mkdosfs
            elif [ -x /usr/sbin/mkdosfs ]; then
                mkdosfspath=/usr/sbin/mkdosfs
            else
                m=1
                echo "Required file mkdosfs (typically /sbin/mkdosfs) not found 
on system"
                echo "This can be corrected by installing the dosfstools 
package"
            fi
        fi
    fi
    # mcopy is required by syslinux (fails w/o it)
    if [ "$runmode" = "running" ]; then
        mcopypath=mcopy
    else    
        mcopypath=`which mcopy 2> /dev/null`
        if [ "$?" != "0" ]; then
            if [ -x /sbin/mcopy ]; then
                mcopypath=/sbin/mcopy
            elif [ -x /usr/sbin/mcopy ]; then
                mcopypath=/usr/sbin/mcopy
            else
                m=1
                echo "Required file mcopy (typically /usr/bin/mcopy) not found 
on system"
                echo "This can be corrected by installing the mtools package"
            fi
        fi
    fi
    # check for installed version of syslinux, and if not, use included version 
based on 32 or 64 bit kernel
    # if included version won't run (based on 'ldd'), exit with message to 
install distro package
    if [ "$runmode" = "running" ]; then
        syslinuxpath=syslinux
    else    
        while [ 0 ]; do
            uname -a | grep x86_64 > /dev/null
            if [ "$?" = "0" ]; then bitness=64; else bitness=32; fi
            # use installed version of syslinux if available
            syslinuxpath=`which syslinux 2> /dev/null`
            if [ "$?" != "0" ]; then
                if [ -x /sbin/syslinux ]; then
                    syslinuxpath=/sbin/syslinux
                    echo "Using distro $bitness bit version of syslinux"
                    break
                elif [ -x /usr/sbin/syslinux ]; then
                    syslinuxpath=/usr/sbin/syslinux
                    echo "Using distro $bitness bit version of syslinux"
                    break
                fi
            else
                echo "Using distro $bitness bit version of syslinux"
                break
            fi
            # not installed in distro - try to use included version
            if [ "$bitness" = "64" ]; then
                syslinuxpath="util/syslinux-64"
                syslinuxpathtext="Using included 64 bit version of syslinux"
            else 
                syslinuxpath="util/syslinux"
                syslinuxpathtext="Using included 32 bit version of syslinux"
            fi
            ldd $syslinuxpath > /dev/null
            if [ "$?" = "0" ]; then
                echo $syslinuxpathtext
                break
            # included versions don't run - prompt for user to install disto 
version
            else
                m=1
                echo "Required file syslinux (typically /usr/bin/syslinux) not 
found on system"
                echo "This can be corrected by installing the 'syslinux' 
package"
                break
            fi
        done
    fi
    # check if --install required by this version
    if [ "$m" = "0" ]; then
        $syslinuxpath --help 2>&1 | grep -- --install > /dev/null
        if [ "$?" = "0" ]; then
            syslinuxopt="--install"
        else 
            syslinuxopt="" 
        fi
        echo "syslinux install option: $syslinuxopt"
    fi
fi

if [ "$m" = "0" ]; then
    echo "All required files and directories were found"
else
    echo
    echo "One or more required files or directories were not found."
    echo "See above messages for details...exiting"
    echo
    exit 1
fi

clear
echo 
"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"
echo "     The makeHDD script to install to hard drive or UFD - TeraByte, Inc."
echo 
"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"
echo
#######################################begin 
confirm####################################
vendor=`cat /sys/block/$wdevice/device/vendor 2> /dev/null`
model=`cat /sys/block/$wdevice/device/model 2> /dev/null`
model=$(echo $model)
vendor=$(echo $vendor)
if [ "$nocfm" = "0" ]; then
    # get confirmation to write to device 
    if [ "$partition" = "0" ] && [ "$partitioned" = "1" ]; then
        echo "Command line entered: $0 $1 $2 $3 $4 $5 $6 $7 $8"
        echo
        echo "Install Target: DRIVE /dev/$device  ($dsizedisplay  $vendor 
$model)"
        echo
        echo "WARNING: Device /dev/$device represents an ENTIRE drive, and it 
currently"
        echo "contains one or more PARTITIONS."
        echo
        echo "Installing to /dev/$device will cause ALL partitions and data 
currently on"
        echo "/dev/$device to be LOST. ALL partitions will be DELETED. If this 
is not what"
        echo "you want to do, decline the confirmation below."
        echo
        echo -n "To install to /dev/$device, please confirm by typing 'yes': "
        read yn
        if [ ! "$yn" = "yes" ]; then
            echo "Install to /dev/$device not confirmed...exiting"
            echo
            exit 1
        else
            echo
            echo "2nd WARNING: Target drive /dev/$device currently contains one 
or more"
            echo "PARTITIONS. Installing to /dev/$device will cause the loss of 
ALL data"
            echo "and ALL partitions currently on the drive."
            echo
            echo -n "Please confirm again by typing 'yes': "
            read yn
            if [ ! "$yn" = "yes" ]; then
                echo "Install to /dev/$device not confirmed...exiting"
                echo
                exit 1
            else
                echo "Install to /dev/$device confirmed twice"
            fi
        fi 
    else
        echo "Command line entered: $0 $1 $2 $3 $4 $5 $6 $7 $8"
        echo
        echo -n "Install Target: "
        if [ "$partition" = "1" ]; then
            echo "PARTITION /dev/$device  ($psizedisplay, $ptypedisplay)"
            echo "The partition is on DRIVE /dev/$wdevice ($dsizedisplay  
$vendor $model)"
            if [ "$nf" = "0" ]; then
                echo
                echo "WARNING: ALL data on partition /dev/$device will be LOST"
            else
                echo
                echo "NOTE: Partition /dev/$device will NOT be re-formatted 
(/nf option)"
            fi
        else
            echo "DRIVE /dev/$device  ($dsizedisplay  $vendor $model)"
            echo
            echo "WARNING: ALL data on drive /dev/$device will be LOST"
        fi
        echo "To back out, decline the confirmation below"
        echo
        echo -n "To install to /dev/$device, please confirm by typing 'yes': "
        read yn
        if [ ! "$yn" = "yes" ]; then
            echo "Install to /dev/$device not confirmed...exiting"
            echo
            exit 1
        else
            echo "Install to /dev/$device confirmed"
        fi 
    fi
else
    echo "Command line entered: $0 $1 $2 $3 $4 $5 $6 $7 $8"
    echo
    echo -n "Install Target: "
    if [ "$partition" = "1" ]; then
        echo "PARTITION /dev/$device  ($psizedisplay, $ptypedisplay)"
        echo "The partition is on DRIVE /dev/$wdevice ($dsizedisplay  $vendor 
$model)"
        echo
        echo "WARNING: ALL data on partition /dev/$device will be LOST"
    else
        echo "DRIVE /dev/$device  ($dsizedisplay  $vendor $model)"
        echo
    fi
fi
#######################################end 
confirm######################################

# name of boot loader config file depends on whether using syslinux or extlinux
if [ "$partition" = "1" ] && [ "$ptype" = "83" ]; then
    cfile=extlinux.conf
else
    cfile=syslinux.cfg
fi


if [ "$rest" != "1" ]; then 
############################################################


# clean up and  then create the cdpath directory where ISO or disc gets mounted
# cdpath=cdrom/cdrom
cdpath=cdroot
rm -r $cdpath 2> /dev/null
mkdir -p $cdpath

# get files from ISO or CD/DVD
if [ "$runmode" = "distro" ]; then
    # use tbosdt to copy contents of ISO file to $cdpath (cdroot)
    if [ "$netsupport" = "0" ]; then
        echo "mount 0: ifl.iso" > getiflfiles.run
        echo "copy 0: cdroot -s -q" >> getiflfiles.run
        $tbosdtpath getiflfiles.run
        rm getiflfiles.run
    else
        echo "mount 0: iflnet.iso" > getiflnetfiles.run
        echo "copy 0: cdroot -s -q" >> getiflnetfiles.run
        $tbosdtpath getiflnetfiles.run
        rm getiflnetfiles.run
    fi
else
    echo
    echo
    echo "An IFL Boot CD/DVD or UFD is required as the SOURCE to copy files 
from."
    echo
    echo "IMPORTANT NOTE: The source can be either a CD/DVD or a UFD that has 
IFL"
    echo "installed on it. Both the source and the target can be UFDs, but they 
"
    echo "cannot be the same one. The target UFD, as specified on the command 
line"
    echo "above, will not be selected as the source"
    echo
    echo "Please insert the source CD/DVD or UFD now (if not already inserted)."
    echo -n "Press <Enter> when ready: "
    read cdready
    $util/mountiflcd /makeHDD $wdevice
    if [ "$?" != "0" ]; then
        echo "A valid source IFL Boot CD/DVD or UFD was not found. Exiting 
script"
        echo
        exit 1
    fi
    netstatus=`grep -c Network $cdpath/menu.txt 2> /dev/null`
    if [ "$netstatus" = "1" ]; then
        volname=iflnet
    else
        volname=ifl
    fi
fi

if [ "$custom" = "0" ]; then
    if [ "$runmode" = "distro" ]; then 
        if [ "$netsupport" = "1" ]; then
            echo "Building default full version with network support"
        else
            echo "Building default smaller version with no network support"
        fi
    else
        echo "Using makeHDD copy mode to copy existing IFL boot media to 
/dev/$device"
    fi

    # copy the files from the source (either isofile or mounted IFL boot disk)
    for fname in boot disk efi private scripts vmlinuz initrmfs.gz menu.txt 
qwerty.ktl dvorak.ktl azerty.ktl qwertz.ktl fgGIod.ktl scripts.conf
    do
        cp -a $cdpath/$fname hdd 2> /dev/null
    done
    for fname in IFL.INI ifl.ini
    do
        cp $cdpath/$fname hdd/ifl.ini 2> /dev/null
    done
    for fname in  BOOTITBM.INI bootitbm.ini
    do
        cp $cdpath/$fname hdd/BOOTITBM.INI 2> /dev/null
    done
    # when copying boot loader config file, look for iflbflag set to 2 or 3, 
which indicates custom ifl.ini by makedisk
    # syslinux.cfg can be upper case if source is UFD created by makedisk
    foundmakedisk=0
    for fname in isolinux.cfg syslinux.cfg SYSLINUX.CFG extlinux.conf
    do
        if [ -f $cdpath/$fname ]; then
            cp $cdpath/$fname hdd/$fname
            # set all instances of iflbflag variable to 0, which it may already 
be
            grep "iflbflag=2 " hdd/$fname > /dev/null 2>&1
            if [ "$?" = "0" ];then foundmakedisk=2; fi
            grep "iflbflag=21 " hdd/$fname > /dev/null 2>&1
            if [ "$?" = "0" ];then foundmakedisk=21; fi
            grep "iflbflag=3 " hdd/$fname > /dev/null 2>&1
            if [ "$?" = "0" ];then foundmakedisk=3; fi
            grep "iflbflag=31 " hdd/$fname > /dev/null 2>&1
            if [ "$?" = "0" ];then foundmakedisk=31; fi

            # if doing /doini set iflbflag to 0 becuase the makedisk files will 
be copied into the rootfs
            if [ "$doini" = "1" ]; then
                case $foundmakedisk in
                0)
                    ;;
                2)
                    sed -i -e 's/iflbflag=2 /iflbflag=0 /' hdd/$fname
                    sed -i -e 's/iflbflag=2 /iflbflag=0 /' 
hdd/boot/grub/grub.cfg;;
                3)
                    sed -i -e 's/iflbflag=3 /iflbflag=0 /' hdd/$fname
                    sed -i -e 's/iflbflag=3 /iflbflag=0 /' 
hdd/boot/grub/grub.cfg;;
                21)
                    sed -i -e 's/iflbflag=21 /iflbflag=0 /' hdd/$fname
                    sed -i -e 's/iflbflag=21 /iflbflag=0 /' 
hdd/boot/grub/grub.cfg;;
                31)
                    sed -i -e 's/iflbflag=31 /iflbflag=0 /' hdd/$fname
                    sed -i -e 's/iflbflag=31 /iflbflag=0 /' 
hdd/boot/grub/grub.cfg;;
                *)
                    ;;
                esac
            # if not, make sure that "2" values get changed to "3" (copying 
from optical disk created by makedisk)
            else
                case $foundmakedisk in
                0)
                    ;;
                2)
                    sed -i -e 's/iflbflag=2 /iflbflag=3 /' hdd/$fname
                    sed -i -e 's/iflbflag=2 /iflbflag=3 /' 
hdd/boot/grub/grub.cfg;;
                21)
                    sed -i -e 's/iflbflag=21 /iflbflag=31 /' hdd/$fname
                    sed -i -e 's/iflbflag=21 /iflbflag=31 /' 
hdd/boot/grub/grub.cfg;;
                *)
                    ;;
                esac
            fi
            break
        fi
    done
    # ensure syslinux.cfg is lower case, so that it gets copied to target in 
copy_tbosdt function below
    if [ -f hdd/SYSLINUX.CFG ]; then mv hdd/SYSLINUX.CFG hdd/syslinux.cfg; fi
    # finished with $cdpath temp directory - can be deleted
    rm -r $cdpath 2> /dev/null

    # If source created by makedisk (iflbflag = 2,21,3,31), then foundmakedisk 
!= 0
    # If /doini option is used, then copy makedisk files into the rootfs
    # (decompress initrmfs.gz, copy files, recompress initrmfs.gz)
    # Otherwise makedisk files (if any) will be copied to the root of target 
drive/partition

    memerror=0
    if [ "$foundmakedisk" != "0" ] && [ "$doini" = "1" ]; then
        echo "Copying makedisk files & directories into rootfs (per /doini 
option)"
        echo "  Decompressing the rootfs"
        rm -r initrmfs 2> /dev/null
        mkdir initrmfs
        cd initrmfs
        /bin/zcat ../hdd/initrmfs.gz | /bin/cpio -i -m -d
        if [ "$?" != "0" ]; then memerror=1; fi
        cd ..
        if [ "$memerror" = "0" ]; then
            rm hdd/initrmfs.gz 2> /dev/null
            if [ -f hdd/ifl.ini ]; then
                echo "  Copying ifl.ini from source boot media to rootfs"
                cp hdd/ifl.ini initrmfs/tbu/ifl.ini
                while read line || [ -n "$line" ]
                do
                    echo $line >> initrmfs/tbu/ifltmp.ini
                done < "initrmfs/tbu/ifl.ini"
                mv initrmfs/tbu/ifltmp.ini initrmfs/tbu/ifl.ini
                chmod 644 initrmfs/tbu/ifl.ini
            fi
            if [ -d hdd/scripts ]; then
                echo "  Copying scripts directory from source boot media to 
rootfs"
                mkdir -p initrmfs/tbu/scripts
                cp hdd/scripts/* initrmfs/tbu/scripts 2> /dev/null
            fi
            if [ -f initrmfs/tbu/utility/priv ]; then
                echo "  Copying files in private directory from source boot 
media to rootfs"
                if [ -f hdd/private/oembackground.png ]; then
                    cp hdd/private/oembackground.png 
initrmfs/usr/share/pixmaps/ifl_background.png 2> /dev/null
                    chmod 644 initrmfs/usr/share/pixmaps/ifl_background.png
                    chown 0:0 initrmfs/usr/share/pixmaps/ifl_background.png
                fi
                if [ -f hdd/private/oemleft.png ]; then
                    cp hdd/private/oemleft.png initrmfs/tbu/iflleft.png 2> 
/dev/null
                    chmod 644 initrmfs/tbu/iflleft.png
                    chown 0:0 initrmfs/tbu/iflleft.png
                fi
            fi
            if [ -f hdd/scripts.conf ]; then
                a=`cat hdd/scripts.conf`
                if [ "$a" != "" ] && [ "$a" != " " ]; then
                    echo "  Copying scripts.conf from source boot media to 
rootfs"
                    cp hdd/scripts.conf initrmfs/tbu/utility/iflscript 2> 
/dev/null
                    chmod 644 initrmfs/tbu/utility/iflscript 2> /dev/null
                    chown 0:0 initrmfs/tbu/utility/iflscript 2> /dev/null
                    fromdos initrmfs/tbu/utility/iflscript 2> /dev/null
                fi
            fi
            if [ -f hdd/bootitbm.ini ] || [ -f hdd/BOOTITBM.INI ]; then
                echo "  Copying BOOTITBM.INI from source boot media to rootfs"
                if [ -f hdd/bootitbm.ini ]; then
                    cp hdd/bootitbm.ini initrmfs/tbu/BOOTITBM.INI 2> /dev/null
                elif [ -f hdd/BOOTITBM.INI ]; then
                    cp hdd/BOOTITBM.INI initrmfs/tbu/BOOTITBM.INI 2> /dev/null
                fi
                chmod 644 initrmfs/tbu/BOOTITBM.INI 2> /dev/null
                chown 0:0 initrmfs/tbu/BOOTITBM.INI 2> /dev/null
            fi

            cd initrmfs
            echo "  Recompressing the rootfs...please wait"
            find . -print | /bin/cpio -o -a -H newc > ../hdd/initrmfs
            if [ "$?" != "0" ]; then let memerror=1; fi
            cd ..
            rm -r initrmfs 2> /dev/null
            gzip -9 hdd/initrmfs
            if [ "$?" != "0" ]; then let memerror=1; fi
        fi

        if [ "$memerror" != "0" ]; then
            rm -r hdd 2> /dev/null
            echo
            echo "ERROR detected, most likely caused by insufficient RAM."
            echo
            echo "The installation to /dev/$device has FAILED. Exiting 
script..."
            echo
            exit 1
        fi
    elif [ "$foundmakedisk" != "0" ]; then
        echo "Makedisk files will be copied to the root of /dev/$device"
    fi

    # if doing /doini (copying into rootfs) delete makedisk files in hdd dir so 
not copied to root of target disk
    if [ "$doini" = "1" ]; then
        for fname in scripts.conf # BOOTITBM.INI bootitbm.ini IFL.INI ifl.ini
        do
            rm hdd/$fname 2> /dev/null
        done
        rm -r hdd/scripts 2> /dev/null
        rm -r hdd/private 2> /dev/null
    fi

else #################################################################
# clean up from possible failed run, then create temp dir
# probably need a couple more checks here

# echo "Copying contents of $isofile to build directory"
#cp -a $cdpath/* hdd/

    for fname in boot disk efi vmlinuz initrmfs.gz menu.txt qwerty.ktl 
dvorak.ktl azerty.ktl qwertz.ktl fgGIod.ktl
    do
        cp -a $cdpath/$fname hdd 2> /dev/null
    done
    for fname in IFL.INI ifl.ini
    do
        cp $cdpath/$fname hdd/ifl.ini 2> /dev/null
    done
    cp $cdpath/isolinux.cfg hdd/$cfile 2> /dev/null

sync
rm -r $cdpath 2> /dev/null

# decompress and extract root file system so that changes can be made
rm -r initrmfs 2> /dev/null
mkdir initrmfs
echo "Decompressing and extracting the root filesystem"
cd initrmfs
$zcatpath ../hdd/initrmfs.gz | $cpiopath -i -m -d
cd ..
rm hdd/initrmfs.gz 2> /dev/null

# check for unreg flag at /tbu/utility/ur to determine if reg or unreg version
if [ -f initrmfs/tbu/utility/ur ]; then reg=0; else reg=1; fi
# check for gui flag at /tbu/utility/gui to determine if gui version or not
if [ -f initrmfs/tbu/utility/gui ]; then gui=1; else gui=0; fi

# source config.txt to get options
chown $ownerid:$groupid config.txt
. config.txt

# set up settings directory if needed
if [ "$netsupport" = "1" ]; then
    if [ ! -d $util/settings ]; then mkdir $util/settings; fi
    if [ ! -d $util/settings/network ]; then mkdir $util/settings/network; fi
    settingspath="$util/settings"
else
    if [ ! -d $util/settings ]; then mkdir $util/settings; fi
    settingspath="$util/settings"
fi

# get settings from saved values, and copy ndiswrapper directory to root fs
cp $settingspath/* initrmfs/tbu/utility 2> /dev/null
if [ "$netsupport" = "1" ]; then
    rulesfile="70-persistent-net.rules"
    cp $settingspath/network/* initrmfs/etc/network 2> /dev/null
    mv initrmfs/etc/network/$rulesfile initrmfs/etc/udev/rules.d/$rulesfile 2> 
/dev/null
    if [ -d wireless/ndiswrapper ]; then
        cp -a wireless/ndiswrapper initrmfs/tbu/ndiswrapper
        chown -R 0:0 initrmfs/tbu/ndiswrapper/
    fi
fi

# copy scripts directory to root fs, ensure files are owned by root
if [ -d scripts ]; then
    # echo "Copying scripts directory to the root filesystem"
    cp -a scripts initrmfs/tbu/scripts
    chown -R 0:0 initrmfs/tbu/scripts/
fi

# take care of language settings in root fs
if [ "$gui" = "1" ]; then
    if [ "$reg" = "1" ]; then langfilefinish="_gui.zip"; else 
langfilefinish="_gui_trial.zip"; fi
elif [ "$gui" = "0" ]; then
    if [ "$reg" = "1" ]; then langfilefinish=".zip"; else 
langfilefinish="_trial.zip"; fi
fi
if [ -e initrmfs/tbu/utility/lang ]; then lang=`cat initrmfs/tbu/utility/lang`; 
else lang=""; fi
if [ -e initrmfs/tbu/utility/rdlang ]; then rdlang=`cat 
initrmfs/tbu/utility/rdlang`; else rdlang=""; fi
rm initrmfs/tbu/utility/lang-avail 2> /dev/null
while read line
do
    if [ -f ifl_${line:0:2}$langfilefinish ]; then
        echo $line >> initrmfs/tbu/utility/lang-avail
    else
        if [ "$lang" = "${line:0:2}" ]; then rm initrmfs/tbu/utility/lang 2> 
/dev/null; fi
        if [ "$rdlang" = "${line:0:2}" ]; then rm initrmfs/tbu/utility/rdlang 
2> /dev/null; fi
    fi
done < "initrmfs/tbu/utility/lang-versions"

# call settings menu
chroot initrmfs /usr/bin/custom-menu

# save settings and clean up root fs
for i in iflkmap ktl vga xres vmode vmodeuefi boot iflscript lang lvm md 
rdiflkmap rdktl rdlang rdvga rdxres rdvmode rdvmodeuefi rdboot rdcmd rdlvm 
rdmenu rdmenuconfig
do
    if [ -e initrmfs/tbu/utility/$i ]; then
        cp -a initrmfs/tbu/utility/$i $settingspath/$i
    else
        rm $settingspath/$i 2> /dev/null
    fi
done
for i in iflkmap ktl vga xres lang rdlang lang-avail
do
    if [ -e initrmfs/tbu/utility/$i ]; then
        rm initrmfs/tbu/utility/$i 2> /dev/null
    fi
done

# if net version, save network config files
if [ "$netsupport" = "1" ]; then
    for i in interfaces ifacelist ndisinstall
    do
        if [ -f initrmfs/etc/network/$i ]; then
            cp -a initrmfs/etc/network/$i $settingspath/network/$i
        else
            rm $settingspath/network/$i 2> /dev/null
        fi
    done
    cmp -s initrmfs/etc/network/interfaces 
initrmfs/etc/network/interfaces-default 2> /dev/null
    if [ "$?" = "0" ]; then rm $settingspath/network/interfaces 2> /dev/null; fi
    rm $settingspath/network/settings-* 2> /dev/null
    cp -a initrmfs/etc/network/settings-* $settingspath/network 2> /dev/null
    rm $settingspath/network/settings-default 2> /dev/null
    if [ -f initrmfs/etc/udev/rules.d/$rulesfile ]; then
        cp -a initrmfs/etc/udev/rules.d/$rulesfile 
$settingspath/network/$rulesfile
    else
        rm $settingspath/network/$rulesfile 2> /dev/null
    fi
fi

# get variables for config files
# keyboard
if [ -e $settingspath/iflkmap ]; then
    kbd=`cat $settingspath/iflkmap`
    ktl=`cat $settingspath/ktl`
else
    kbd=us
    ktl=qwerty
fi

# video
if [ -f $settingspath/vmode ]; then
    defaultitem=`cat $settingspath/vmode`
elif [ -f initrmfs/tbu/utility/x64 ]; then
    defaultitem=2
else
    defaultitem=1
fi
# UEFI video
    if [ -e $settingspath/vmodeuefi ]; then
        vmodeuefi=`cat $settingspath/vmodeuefi`
    else
        vmodeuefi=0
    fi

# boot parameters
if [ -e $settingspath/boot ]; then
    bootparms=`cat $settingspath/boot`
else
    bootparms=""
fi

if [ ! -f initrmfs/tbu/utility/gui ]; then
    # build boot loader config file (extlinux.conf or syslinux.cfg)
    echo "timeout 50" > hdd/$cfile
    echo "kbdmap $ktl.ktl" >> hdd/$cfile
    echo "prompt 1" >> hdd/$cfile
    echo "display menu.txt" >> hdd/$cfile
    echo "default $defaultitem" >> hdd/$cfile
    echo "label 1" >> hdd/$cfile
    echo " kernel vmlinuz" >> hdd/$cfile
    echo " append vga=0 iflkmap=$kbd ktl=$ktl initrd=initrmfs.gz iflbflag=0  
$bootparms" >> hdd/$cfile
    echo "label 2" >> hdd/$cfile
    echo " kernel vmlinuz" >> hdd/$cfile
    echo " append vga=773 iflkmap=$kbd ktl=$ktl initrd=initrmfs.gz iflbflag=0  
$bootparms" >> hdd/$cfile
    echo "label 3" >> hdd/$cfile
    echo " kernel vmlinuz" >> hdd/$cfile
    echo " append vga=771 iflkmap=$kbd ktl=$ktl initrd=initrmfs.gz iflbflag=0  
$bootparms" >> hdd/$cfile
    echo "label 4" >> hdd/$cfile
    echo " kernel vmlinuz" >> hdd/$cfile
    echo " append vga=769 iflkmap=$kbd ktl=$ktl initrd=initrmfs.gz iflbflag=0  
$bootparms" >> hdd/$cfile
    echo "label 5" >> hdd/$cfile
    echo " kernel vmlinuz" >> hdd/$cfile
    echo " append vga=ask iflkmap=$kbd ktl=$ktl initrd=initrmfs.gz iflbflag=0  
$bootparms" >> hdd/$cfile
    echo "label 4gh" >> hdd/$cfile
    echo " kernel vmlinuz" >> hdd/$cfile
    echo " append vga=0 mem=2G iflkmap=$kbd ktl=$ktl initrd=initrmfs.gz 
iflbflag=0  $bootparms" >> hdd/$cfile

    # build menu.txt file
    if [ "$netsupport" = "1" ]; then
        boottitle="Image For Linux (CUI) Network Boot Disk - TeraByte, Inc."
    else
        boottitle="Image For Linux (CUI) Boot Disk - TeraByte, Inc."
    fi

    echo "" > hdd/menu.txt
    echo $boottitle >> hdd/menu.txt
    echo "" >> hdd/menu.txt
    echo "Boot Menu:" >> hdd/menu.txt
    echo "<1>  80x25 text mode" >> hdd/menu.txt
    echo "<2>  1024x768 frame bufffer mode" >> hdd/menu.txt
    echo "<3>  800x600 frame bufffer mode" >> hdd/menu.txt
    echo "<4>  640x480 frame bufffer mode" >> hdd/menu.txt
    echo "<5>  Select alternate video mode during boot" >> hdd/menu.txt
    echo "" >> hdd/menu.txt
    echo "Booting default <$defaultitem> in 5 seconds. Press <Enter> to boot 
now." >> hdd/menu.txt
    echo "" >> hdd/menu.txt
    # For UEFI mode
    if [ "$netsupport" = "1" ]; then
        cat hdd/boot/grub/grub.cfg-default | sed -e "s/iflkmap=us 
ktl=qwerty/iflkmap=$kbd ktl=$ktl/" | sed -e "s/iflbflag=0/iflbflag=0 
$bootparms/" | sed -e "s/default=0/default=$vmodeuefi/" > hdd/boot/grub/grub.cfg
    else
        cat hdd/boot/grub/grub.cfg-default | sed -e "s/Network Boot/Boot/" | 
sed -e "s/iflkmap=us ktl=qwerty/iflkmap=$kbd ktl=$ktl/" | sed -e 
"s/iflbflag=0/iflbflag=0 $bootparms/" | sed -e 
"s/default=0/default=$vmodeuefi/" > hdd/boot/grub/grub.cfg
    fi
elif [ -f initrmfs/tbu/utility/gui ] && [ -f initrmfs/tbu/utility/x64 ]; then
    # build boot loader config file for GUI version (isolinux.cfg)
    echo "timeout 50" > hdd/$cfile
    echo "kbdmap $ktl.ktl" >> hdd/$cfile
    echo "prompt 1" >> hdd/$cfile
    echo "display menu.txt" >> hdd/$cfile
    echo "default $defaultitem" >> hdd/$cfile
    echo "label 1" >> hdd/$cfile
    echo " kernel vmlinuz" >> hdd/$cfile
    echo " append vga=794 switchx=yes iflkmap=$kbd ktl=$ktl initrd=initrmfs.gz 
iflbflag=0  $bootparms" >> hdd/$cfile
    echo "label 2" >> hdd/$cfile
    echo " kernel vmlinuz" >> hdd/$cfile
    echo " append vga=791 switchx=yes iflkmap=$kbd ktl=$ktl initrd=initrmfs.gz 
iflbflag=0  $bootparms" >> hdd/$cfile
    echo "label 3" >> hdd/$cfile
    echo " kernel vmlinuz" >> hdd/$cfile
    echo " append vga=788 switchx=yes iflkmap=$kbd ktl=$ktl initrd=initrmfs.gz 
iflbflag=0  $bootparms" >> hdd/$cfile
    echo "label 4" >> hdd/$cfile
    echo " kernel vmlinuz" >> hdd/$cfile
    echo " append vga=785 switchx=yes iflkmap=$kbd ktl=$ktl initrd=initrmfs.gz 
iflbflag=0  $bootparms" >> hdd/$cfile
    echo "label 4gh" >> hdd/$cfile
    echo " kernel vmlinuz" >> hdd/$cfile
    echo " append vga=791 switchx=yes mem=2G iflkmap=$kbd ktl=$ktl 
initrd=initrmfs.gz iflbflag=0  $bootparms" >> hdd/$cfile

    # build menu.txt file 
    if [ "$netsupport" = "1" ]; then
        boottitle="Image For Linux (GUI) Network Boot Disk - TeraByte, Inc."
    else
        boottitle="Image For Linux (GUI) Boot Disk - TeraByte, Inc."
    fi

    echo "" > hdd/menu.txt
    echo $boottitle >> hdd/menu.txt
    echo "" >> hdd/menu.txt
    echo "Boot Menu:" >> hdd/menu.txt
    echo "<1>  1280x1024 frame buffer mode" >> hdd/menu.txt
    echo "<2>  1024x768 frame buffer mode" >> hdd/menu.txt
    echo "<3>  800x600 frame buffer mode" >> hdd/menu.txt
    echo "<4>  640x480 frame buffer mode" >> hdd/menu.txt
    echo "" >> hdd/menu.txt
    echo "For systems that fail to start the GUI after boot, please try" >> 
hdd/menu.txt
    echo "another video mode from the list above (e.g. boot: 3)." >> 
hdd/menu.txt
    echo "" >> hdd/menu.txt
    echo "Booting default <$defaultitem> in 5 seconds. Press <Enter> to boot 
now." >> hdd/menu.txt
    echo "" >> hdd/menu.txt
    # For UEFI mode
    if [ "$netsupport" = "1" ]; then
        cat hdd/boot/grub/grub.cfg-default | sed -e "s/iflkmap=us 
ktl=qwerty/iflkmap=$kbd ktl=$ktl/" | sed -e "s/iflbflag=0/iflbflag=0 
$bootparms/" | sed -e "s/default=0/default=$vmodeuefi/" > hdd/boot/grub/grub.cfg
    else
        cat hdd/boot/grub/grub.cfg-default | sed -e "s/Network Boot/Boot/" | 
sed -e "s/iflkmap=us ktl=qwerty/iflkmap=$kbd ktl=$ktl/" | sed -e 
"s/iflbflag=0/iflbflag=0 $bootparms/" | sed -e 
"s/default=0/default=$vmodeuefi/" > hdd/boot/grub/grub.cfg
    fi
elif [ -f initrmfs/tbu/utility/gui ] && [ ! -f initrmfs/tbu/utility/x64 ]; then
    # build boot loader config file for GUI version (isolinux.cfg)
    echo "timeout 50" > hdd/$cfile
    echo "kbdmap $ktl.ktl" >> hdd/$cfile
    echo "prompt 1" >> hdd/$cfile
    echo "display menu.txt" >> hdd/$cfile
    echo "default $defaultitem" >> hdd/$cfile
    echo "label 1" >> hdd/$cfile
    echo " kernel vmlinuz" >> hdd/$cfile
    echo " append vga=773 iflkmap=$kbd ktl=$ktl initrd=initrmfs.gz iflbflag=0  
$bootparms" >> hdd/$cfile
    echo "label 2" >> hdd/$cfile
    echo " kernel vmlinuz" >> hdd/$cfile
    echo " append vga=773 xres=1024 iflkmap=$kbd ktl=$ktl initrd=initrmfs.gz 
iflbflag=0  $bootparms" >> hdd/$cfile
    echo "label 3" >> hdd/$cfile
    echo " kernel vmlinuz" >> hdd/$cfile
    echo " append vga=773 xres=800 iflkmap=$kbd ktl=$ktl initrd=initrmfs.gz 
iflbflag=0  $bootparms" >> hdd/$cfile
    echo "label 4" >> hdd/$cfile
    echo " kernel vmlinuz" >> hdd/$cfile
    echo " append vga=773 xres=640 iflkmap=$kbd ktl=$ktl initrd=initrmfs.gz 
iflbflag=0  $bootparms" >> hdd/$cfile
    echo "label 1fb" >> hdd/$cfile
    echo " kernel vmlinuz" >> hdd/$cfile
    echo " append vga=794 switchx=yes iflkmap=$kbd ktl=$ktl initrd=initrmfs.gz 
iflbflag=0  $bootparms" >> hdd/$cfile
    echo "label 2fb" >> hdd/$cfile
    echo " kernel vmlinuz" >> hdd/$cfile
    echo " append vga=791 switchx=yes iflkmap=$kbd ktl=$ktl initrd=initrmfs.gz 
iflbflag=0  $bootparms" >> hdd/$cfile
    echo "label 3fb" >> hdd/$cfile
    echo " kernel vmlinuz" >> hdd/$cfile
    echo " append vga=788 switchx=yes iflkmap=$kbd ktl=$ktl initrd=initrmfs.gz 
iflbflag=0  $bootparms" >> hdd/$cfile
    echo "label 4fb" >> hdd/$cfile
    echo " kernel vmlinuz" >> hdd/$cfile
    echo " append vga=785 switchx=yes iflkmap=$kbd ktl=$ktl initrd=initrmfs.gz 
iflbflag=0  $bootparms" >> hdd/$cfile
    echo "label 4gh" >> hdd/$cfile
    echo " kernel vmlinuz" >> hdd/$cfile
    echo " append vga=773 mem=2G iflkmap=$kbd ktl=$ktl initrd=initrmfs.gz 
iflbflag=0  $bootparms" >> hdd/$cfile

    # build menu.txt file 
    if [ "$netsupport" = "1" ]; then
        boottitle="Image For Linux (GUI) Network Boot Disk - TeraByte, Inc."
    else
        boottitle="Image For Linux (GUI) Boot Disk - TeraByte, Inc."
    fi

    echo "" > hdd/menu.txt
    echo $boottitle >> hdd/menu.txt
    echo "" >> hdd/menu.txt
    echo "Boot Menu:" >> hdd/menu.txt
    echo "<1>  Best available graphics mode" >> hdd/menu.txt
    echo "<2>  1024x768 graphics mode" >> hdd/menu.txt
    echo "<3>  800x600 graphics mode" >> hdd/menu.txt
    echo "<4>  640x480 graphics mode" >> hdd/menu.txt
    echo "" >> hdd/menu.txt
    echo "For systems that fail to start the GUI after boot, please use" >> 
hdd/menu.txt
    echo "frame buffer option 1fb, 2fb, 3fb, or 4fb (e.g. boot: 2fb)." >> 
hdd/menu.txt
    echo "" >> hdd/menu.txt
    echo "Booting default <$defaultitem> in 5 seconds. Press <Enter> to boot 
now." >> hdd/menu.txt
    echo "" >> hdd/menu.txt
    # For UEFI mode
    if [ "$netsupport" = "1" ]; then
        cat hdd/boot/grub/grub.cfg-default | sed -e "s/iflkmap=us 
ktl=qwerty/iflkmap=$kbd ktl=$ktl/" | sed -e "s/iflbflag=0/iflbflag=0 
$bootparms/" | sed -e "s/default=0/default=$vmodeuefi/" > hdd/boot/grub/grub.cfg
    else
        cat hdd/boot/grub/grub.cfg-default | sed -e "s/Network Boot/Boot/" | 
sed -e "s/iflkmap=us ktl=qwerty/iflkmap=$kbd ktl=$ktl/" | sed -e 
"s/iflbflag=0/iflbflag=0 $bootparms/" | sed -e 
"s/default=0/default=$vmodeuefi/" > hdd/boot/grub/grub.cfg
    fi
fi


clear
echo 
"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"
echo "     The makeHDD script to install to hard drive or UFD - TeraByte, Inc."
echo 
"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"
echo
if [ "$partition" = "0" ] && [ "$partitioned" = "1" ]; then
    echo "Command line entered: $0 $1 $2 $3 $4 $5 $6 $7 $8"
    echo
    echo "Install Target: DRIVE /dev/$device  ($dsizedisplay)"
else
    echo "Command line entered: $0 $1 $2 $3 $4 $5 $6 $7 $8"
    echo
    echo -n "Install Target: "
    if [ "$partition" = "1" ]; then
        echo "PARTITION /dev/$device  ($psizedisplay, $ptypedisplay)"
        echo "The target partition is located on DRIVE /dev/$wdevice 
($dsizedisplay)"
    else
        echo "DRIVE /dev/$device  ($dsizedisplay)" 
    fi
fi
echo
echo "OPTION 1: Settings menu"
echo

# prompt for console login option
echo "OPTION 2: Do you want a console login to be required (default is No)?"
echo "Enter y and press <Enter> for Yes"
echo -n "Just press <Enter> for No  "
yn=0
read yn
if [ "$yn" = "y" ] || [ "$yn" = "Y" ]; then
    echo "Configuring root filesystem to require console login"
    echo "Note: The default root password is 'ifl'"
    cp -a initrmfs/etc/inittab-getty initrmfs/etc/inittab
else
    echo "Console login will not be required (default)"
fi

# prompt for password change option
echo
echo "OPTION 3: Change root password from the default of 'ifl'?"
echo "Enter y and press <Enter> for Yes"
echo -n "Just press <Enter> for No  "
yn=0
read yn
if [ "$yn" = "y" ] || [ "$yn" = "Y" ]; then
    echo "The root password will be changed"
    echo "You will now be prompted to enter a new root password"
    echo "Password can be ANY string of 1 to 8 characters"
    ps=0
    while [ "$ps" = "0" ]
    do
        chroot initrmfs /usr/bin/passwd
        if [ "$?" = "0" ]; then
            ps=1
        else
            echo "Error while changing password...please try again"
        fi
    done
else
    echo "The default root password will be used"
fi
echo

if [ "$netsupport" = "1" ]; then
    echo "Building custom full version with network support"
else
    echo "Building custom smaller version with no network support"
fi

# copy files and directories to root file system
if [ -e ifl-custom.ini ]; then
        keyini="initrmfs/tbu/ifl.ini license productkey"
        userini="initrmfs/tbu/ifl.ini license user"
        productkey=$(ReadIniValue $keyini)
        prodkeyname=$(ReadIniValue $userini)
        echo "Copying ifl-custom.ini to the root filesystem as ifl.ini"
        cp -a ifl-custom.ini initrmfs/tbu/ifl.ini
        chown 0:0 initrmfs/tbu/ifl.ini
        if [ "$(ReadIniValue $keyini)" = "" ]; then
                WriteIniValue $userini "$prodkeyname"
                WriteIniValue $keyini "$productkey"
        fi
fi

if [ -e config.txt ]; then
    echo "Copying config.txt to the root filesystem"
    cp -a config.txt initrmfs/etc/config.txt
    chown 0:0 initrmfs/etc/config.txt
elif [ -e CONFIG.TXT ]; then
    echo "Copying CONFIG.TXT to the root filesystem"
    cp -a CONFIG.TXT initrmfs/etc/config.txt
    chown 0:0 initrmfs/etc/config.txt
fi

#if [ -d scripts ]; then
    #echo "Copying scripts directory to the root filesystem"
    #cp -a scripts initrmfs/tbu/scripts
    #chown -R 0:0 initrmfs/tbu/scripts/
#fi

if [ -d wireless/firmware ] && [ "$netsupport" = "1" ]; then
    echo "Copying wireless/firmware directory to the root filesystem"
    cp -a wireless/firmware/* initrmfs/lib/firmware 2> /dev/null
    chown -R 0:0 initrmfs/lib/firmware/
fi

if [ -d iscsi ] && [ "$netsupport" = "1" ]; then
    echo "Copying iscsi directory to the root filesystem"
    rm -r initrmfs/etc/iscsi
    cp -a iscsi initrmfs/etc/iscsi
    cp -a help/iscsi.txt initrmfs/etc/iscsi/iscsi.txt
    chown -R 0:0 initrmfs/etc/iscsi/
fi

if [ -d tbosdtfiles ]; then
    echo "Copying tbosdtfiles directory to the root filesystem"
    cp -a tbosdtfiles initrmfs/tbu
    chown -R 0:0 initrmfs/tbu/tbosdtfiles/
fi

if [ -f BOOTITBM-CUSTOM.INI ]; then
    keyini="initrmfs/tbu/BOOTITBM.INI license productkey"
    userini="initrmfs/tbu/BOOTITBM.INI license user"
    productkey=$(ReadIniValue $keyini)
    prodkeyname=$(ReadIniValue $userini)
    echo "Copying BOOTITBM-CUSTOM.INI to the root filesystem as BOOTITBM.INI"
    cp -a BOOTITBM-CUSTOM.INI initrmfs/tbu/BOOTITBM.INI
    chown 0:0 initrmfs/tbu/BOOTITBM.INI
    WriteIniValue $userini "$prodkeyname"
    WriteIniValue $keyini "$productkey"
fi

    # process language versions selected in menus
    # lang is boot media setting, rdlang is restore disc setting
    # if lang setting doesn't exist, it's English
    if [ -e $settingspath/lang ]; then
        lang=`cat $settingspath/lang`
        while read line
        do
            if [ "${line:0:2}" = "$lang" ]; then
                langtext=${line:3}
                break
            fi
        done < "initrmfs/tbu/utility/lang-versions"
        # if rdlang doesn't exist, it's the same as lang
        if [ -e $settingspath/rdlang ]; then
            rdlang=`cat $settingspath/rdlang`
        else
            rdlang=$lang
        fi
        rdlangtext="English (default)"
        while read line
        do
            if [ "${line:0:2}" = "$rdlang" ]; then
                rdlangtext=${line:3}
                break
            fi
        done < "initrmfs/tbu/utility/lang-versions"
        rm -r lang-tmp 2> /dev/null
        mkdir lang-tmp
        unzip -q -d lang-tmp ifl_$lang$langfilefinish
        echo "Boot Media language version is $langtext"
        if [ -e lang-tmp/imagel ]; then
            echo "Copying $langtext version of imagel from 
ifl_$lang$langfilefinish to root filesystem"
            # if unregistered version, save English version for restore disc in 
case that uses English
            if [ "$reg" = "0" ]; then
                cp initrmfs/tbu/imagel initrmfs/tbu/imagelrd
            fi
            cp lang-tmp/imagel initrmfs/tbu/imagel
            chown 0:0 initrmfs/tbu/imagel
            chmod +x initrmfs/tbu/imagel
        else
            echo "$langtext version of imagel not found in 
ifl_$lang$langfilefinish"
            echo "The English (default) version of imagel will be used"
        fi
        echo "Restore Disc language version is $rdlangtext"
        if [ "$rdlang" != "en" ]; then
            rm -r lang-tmp 2> /dev/null
            mkdir lang-tmp
            unzip -q -d lang-tmp ifl_$rdlang$langfilefinish
            if [ -e lang-tmp/tbirest ]; then
                echo "Copying $rdlangtext version of tbirest from 
ifl_$rdlang$langfilefinish to root filesystem"
                cp lang-tmp/tbirest initrmfs/tbu/tbirest
                chown 0:0 initrmfs/tbu/tbirest
                chmod +x initrmfs/tbu/tbirest
            elif [ "$reg" = "1" ]; then
                echo "$rdlangtext version of tbirest not found in 
ifl_$rdlang$langfilefinish"
                echo "The English (default) version of tbirest will be used"
            elif [ -e lang-tmp/imagel ]; then
                echo "Copying $rdlangtext version of imagel from 
ifl_$rdlang$langfilefinish to root filesystem"
                cp lang-tmp/imagel initrmfs/tbu/imagelrd
                chown 0:0 initrmfs/tbu/imagelrd
                chmod +x initrmfs/tbu/imagelrd
            else
                echo "$rdlangtext version of imagel not found in 
ifl_$rdlang$langfilefinish"
                echo "The English (default) version of imagel will be used"
            fi
        fi
    elif [ -e $settingspath/rdlang ]; then
        echo "Boot Media language version is English (default)"
        rdlang=`cat $settingspath/rdlang`
        rdlangtext="English (default)"
        while read line
        do
            if [ "${line:0:2}" = "$rdlang" ]; then
                rdlangtext=${line:3}
                break
            fi
        done < "initrmfs/tbu/utility/lang-versions"
        echo "Restore Disc language version is $rdlangtext"
        if [ "$rdlang" != "en" ]; then
            rm -r lang-tmp 2> /dev/null
            mkdir lang-tmp
            unzip -q -d lang-tmp ifl_$rdlang$langfilefinish
            if [ -e lang-tmp/tbirest ]; then
                echo "Copying $rdlangtext version of tbirest from 
ifl_$rdlang$langfilefinish to root filesystem"
                cp lang-tmp/tbirest initrmfs/tbu/tbirest
                chown 0:0 initrmfs/tbu/tbirest
                chmod +x initrmfs/tbu/tbirest
            elif [ "$reg" = "1" ]; then
                echo "$rdlangtext version of tbirest not found in 
ifl_$rdlang$langfilefinish"
                echo "The English (default) version of tbirest will be used"
            elif [ -e lang-tmp/imagel ]; then
                echo "Copying $rdlangtext version of imagel from 
ifl_$rdlang$langfilefinish to root filesystem"
                cp lang-tmp/imagel initrmfs/tbu/imagelrd
                chown 0:0 initrmfs/tbu/imagelrd
                chmod +x initrmfs/tbu/imagelrd
            else
                echo "$rdlangtext version of imagel not found in 
ifl_$rdlang$langfilefinish"
                echo "The English (default) version of imagel will be used"
            fi
        fi
    else
        echo "Boot Media language version is English (default)"
        echo "Restore Disc language version is English (default)"
    fi
    rm -r lang-tmp 2> /dev/null

# run getty on one or both serial ports, based on config.txt
if [ "$SERIAL_PORTS" = "1" ]; then
    echo "ttyS0::respawn:-/sbin/getty -L ttyS0 9600 vt100" >> 
initrmfs/etc/inittab
elif [ "$SERIAL_PORTS" = "2" ]; then
    echo "ttyS1::respawn:-/sbin/getty -L ttyS1 9600 vt100" >> 
initrmfs/etc/inittab
elif [ "$SERIAL_PORTS" = "B" ]; then
    echo "ttyS0::respawn:-/sbin/getty -L ttyS0 9600 vt100" >> 
initrmfs/etc/inittab
    echo "ttyS1::respawn:-/sbin/getty -L ttyS1 9600 vt100" >> 
initrmfs/etc/inittab
fi

# recompress the root file system
rm initrmfs/tmp/* 2> /dev/null
cd initrmfs
echo "Recompressing the root filesystem...please wait"
find . -print | $cpiopath -o -a -H newc > ../hdd/initrmfs
cd ..
rm -r initrmfs 2> /dev/null
gzip -9 hdd/initrmfs
sync

# clean up
# rm -r initrmfs 2> /dev/null (moved up to just before gzip command)
if [ "$0" = "./makeHDD" ]; then
    chown -R $ownerid:$groupid util 2> /dev/null
fi

fi 
##############################################################################


else
    volname="TBI Backup Disk"
fi ########################## end /rest block 
##################################################

# error exit point
error_exit() {
rm -r hdd 2> /dev/null
exit 1
}

# function to copy ifl files to drive or partition with tbosdt
copy_files_tbosdt() {
    copyerror=0
    if [ "$partition" = "1" ]; then
        echo "Copying files to partition /dev/$device..."
    else
        echo "Copying files to drive /dev/$device..."
    fi
    if [ "$custom" = "0" ]; then
        if [ -f hdd/isolinux.cfg ]; then
            mv hdd/isolinux.cfg hdd/$cfile
        elif [ -f hdd/syslinux.cfg ]; then
            if [ "$cfile" != "syslinux.cfg" ]; then
                mv hdd/syslinux.cfg hdd/$cfile
            fi
        elif [ -f hdd/extlinux.conf ]; then
            if [ "$cfile" != "extlinux.conf" ]; then
                mv hdd/extlinux.conf hdd/$cfile
            fi
        fi
    fi
    # use tbosdt to copy files to drive/partition
    echo "mount 0: /dev/$device" > copyhdd.run
    echo "copy hdd 0: -s -q" >> copyhdd.run
    $tbosdtpath copyhdd.run > /dev/null 2>&1
    if [ ! "$?" = "0" ]; then copyerror=1; fi
    rm copyhdd.run
    sync
}

# function to copy restore disc files to drive/partition from cdboot directory
copy_files_restore() {
    copyerror=0
    if [ "$partition" = "1" ]; then
        echo "Copying files to partition /dev/$device..."
    else
        echo "Copying files to drive /dev/$device..."
    fi
    # use tbosdt to copy restore files to drive/partition
    echo "mount 0: /dev/$device" > copyhdd.run
    echo "copy cdboot 0: -y -s -q" >> copyhdd.run
    echo "del 0:$cfile -y" >> copyhdd.run
    echo "ren 0:isolinux.cfg 0:$cfile" >> copyhdd.run
    echo "del 0:isolinux.bin -y" >> copyhdd.run
    echo "umount 0:" >> copyhdd.run
    $tbosdtpath copyhdd.run > /dev/null 2>&1
    # $tbosdtpath copyhdd.run > thisfile.txt 2>&1
    if [ ! "$?" = "0" ]; then copyerror=1; fi
    rm copyhdd.run
    sync
}

copy_error() {
    echo "Error(s) encountered while copying files to /dev/$device...exiting"
    echo
    error_exit
}

format_error() {
    echo "Formatting of /dev/$device failed...exiting"
    echo
    error_exit
}

bootloader_error() {
    echo "Installation of boot loader to /dev/$device failed...exiting"
    echo
    if [ "$runmode" = "distro" ]; then
        echo "Note: This error might be corrected by installing the 'syslinux' 
package"
        echo "and then running 'makeHDD' or 'iflbuild' again. If 'syslinux' is 
already"
        echo "installed, please try installing to a partition (e.g. /dev/sdc1) 
instead"
        echo "of to an entire drive (e.g. /dev/sdc)"
    fi
    echo
    error_exit
}

mount_error() {
    echo "Mounting of /dev/$device for copying failed...exiting"
    echo
    error_exit
}

unmount_error() {
    sleep 1
    umount hdd/tmp 2> /dev/null  # try again
    if [ ! "$?" = "0" ]; then
        echo "Unmounting of /dev/$device failed...exiting"
        echo
        exit 1
    fi
    error_exit
}

# if installing to drive, format it, install syslinux, copy files to it with 
tbosdt
if [ "$partition" = "0" ]; then
    echo "Formatting drive /dev/$device as FAT32"
    $mkdosfspath -n "$volname" -F32 -I /dev/$device > /dev/null
    if [ ! "$?" = "0" ]; then format_error; fi 
    echo "Installing the syslinux boot loader to /dev/$device ($syslinuxpath)"
    $syslinuxpath $syslinuxopt /dev/$device
    if [ ! "$?" = "0" ]; then bootloader_error; fi
    if [ "$rest" = "1" ]; then copy_files_restore; else copy_files_tbosdt; fi
    rm -r hdd 2> /dev/null
    echo "Syncing drive /dev/$device with Linux kernel (blockdev --rereadpt 
/dev/$device)"
    $blockdevpath --rereadpt /dev/$device   # re-read partition table
    if [ "$copyerror" = "0" ]; then
        echo "Installation to drive /dev/$device completed successfully"
        echo "Drive /dev/$device is now ready to use"
    else
        copy_error
    fi
# if partition, set active if /a given, then format according to partition type
# then install boot loader, copy files to it with tbosdt
else
    if [ "$active" = "1" ]; then
        echo "Setting /dev/$device active as requested (the /a option was 
given)"
        # use parted if there (quieter)
        partedpath=`which parted 2> /dev/null`
        if [ "$?" = "0" ]; then
            for slot in 1 2 3 4
            do
                if [ "$slot" = "$part" ]; then
                    $partedpath -s /dev/$wdevice set $slot boot on
                else
                    $partedpath -s /dev/$wdevice set $slot boot off > /dev/null 
2>&1
                fi
            done
        else
            aoffset=446  # offset to first active byte in pt
            for slot in 1 2 3 4
            do
                if [ "$slot" = "$part" ]; then
                    dd if=$util/active.bin of=/dev/$wdevice bs=1 count=1 
seek=$aoffset
                else
                    dd if=/dev/zero of=/dev/$wdevice bs=1 count=1 seek=$aoffset
                fi
                let aoffset=aoffset+16
            done
            echo "Partition /dev/$device on drive /dev/$wdevice is now set 
active"
        fi
    fi
    if [ "$ptype" = "6" ] || [ "$ptype" = "e" ]; then 
        if [ "$nf" = "1" ]; then
            echo "Not formatting partition /dev/$device (/nf specified)"
        else
            echo "Formatting partition /dev/$device as FAT16"
            $mkdosfspath -n "$volname" -F16 /dev/$device > /dev/null
            if [ ! "$?" = "0" ]; then format_error; fi
        fi
        echo "Installing the syslinux boot loader to /dev/$device 
($syslinuxpath)"
        $syslinuxpath $syslinuxopt /dev/$device
        if [ ! "$?" = "0" ]; then bootloader_error; fi
        if [ "$rest" = "1" ]; then copy_files_restore; else copy_files_tbosdt; 
fi
    elif [ "$ptype" = "b" ] || [ "$ptype" = "c" ]; then
        if [ "$nf" = "1" ]; then
            echo "Not formatting partition /dev/$device (/nf specified)"
        else
            echo "Formatting partition /dev/$device as FAT32"
            $mkdosfspath -n "$volname" -F32 /dev/$device > /dev/null
            if [ ! "$?" = "0" ]; then format_error; fi
        fi
        echo "Installing the syslinux boot loader to /dev/$device 
($syslinuxpath)"
        $syslinuxpath $syslinuxopt /dev/$device
        if [ ! "$?" = "0" ]; then bootloader_error; fi
        if [ "$rest" = "1" ]; then copy_files_restore; else copy_files_tbosdt; 
fi
    elif [ "$ptype" = "df" ]; then
        echo "Not formatting partition /dev/$device (type $ptype)"
        echo "Installing the syslinux boot loader to /dev/$device"
        $syslinuxpath $syslinuxopt /dev/$device
        if [ ! "$?" = "0" ]; then bootloader_error; fi
        if [ "$rest" = "1" ]; then copy_files_restore; else copy_files_tbosdt; 
fi
    else
        if [ "$nf" = "1" ]; then
            echo "Not formatting partition /dev/$device (/nf specified)"
        else
            echo "Formatting partition /dev/$device as ext2"
            $mke2fspath -L "$volname" /dev/$device > /dev/null
            if [ ! "$?" = "0" ]; then format_error; fi
        fi
        if [ "$rest" = "1" ]; then copy_files_restore; else copy_files_tbosdt; 
fi
        mkdir hdd/tmp
        mount /dev/$device hdd/tmp > /dev/null
        if [ ! "$?" = "0" ]; then mount_error; fi
        echo "Installing the extlinux boot loader to /dev/$device 
($extlinuxpath)"
        $extlinuxpath -i hdd/tmp
        if [ ! "$?" = "0" ]; then
            echo "Installation of extlinux boot loader failed"
            echo
            if [ "$runmode" = "distro" ]; then
                echo "Note: This extlinux error may be corrected by installing 
the 'syslinux' package"
                echo "(if not already installed), or on some distros there may 
be a separate 'extlinux'"
                echo "package. Then run makeHDD again."
            fi
            umount hdd/tmp 2> /dev/null
            if [ ! "$?" = "0" ]; then unmount_error; fi
            echo
            exit 1
        else
            umount hdd/tmp 2> /dev/null
            if [ ! "$?" = "0" ]; then unmount_error; fi
        fi
        rm -r hdd/tmp 2> /dev/null
    fi
    rm -r hdd 2> /dev/null
    if [ "$copyerror" = "0" ]; then
        echo "Installation to partition /dev/$device completed successfully"
    else
        copy_error
    fi
fi

# write standard mbr if /mbr given - warn user about overwriting existing MBR 
etc.
if [ "$mbr" = "1" ]; then
    echo    
    echo "Install standard MBR to /dev/$wdevice (the /mbr option was given):"
    echo "WARNING: Installing the standard MBR on drive /dev/$wdevice will 
overwrite"
    echo "any existing MBR code currently on the drive, including any boot 
managers"
    echo "or boot loaders. It will NOT overwrite the partition table. 
Installing the"
    echo "standard MBR is required if you intend to boot DIRECTLY from this 
drive,"
    echo "rather than using a boot manager."
    echo
    echo -n "Type 'yes' to confirm installing standard MBR to /dev/$wdevice: "
    read yn
    if [ "$yn" = "yes" ]; then
        echo "Installation of standard MBR to /dev/$wdevice was confirmed"
        echo "Writing standard MBR code to drive /dev/$wdevice"
        cp $util/mbr.bin /dev/$wdevice
        if [ "$?" = "0" ]; then
             echo "Installation of MBR code to /dev/$wdevice completed 
successfully"
        else
            echo "Installation of MBR code to /dev/$wdevice failed"
            echo
            error_exit
        fi    
    else
        echo "Confirmation declined. Standard MBR code not installed to 
/dev/$wdevice"
    fi 
fi

# extlinux requires BIBM's swap mode if on drive other than HDO
if [ "$partition" = "1" ] && [ "$ptype" = "83" ]; then
    echo
    echo "IMPORTANT: If booting this partition with BootIt BM, swap mode must 
be"
    echo "selected in the Boot Item if the partition is on any drive other than"
    echo "HD0. This is due to the use of extlinux as the boot loader."
fi
echo
exit 0

Reply via email to