From 03574109ba8860005cc25f286f18450b1b2d2ce4 Mon Sep 17 00:00:00 2001 From: SolidHal Date: Fri, 18 Oct 2019 13:46:17 -0700 Subject: [PATCH] Implemented a more complete install script, need to test --- scripts/InstallScripts/InstallPrawnOS.sh | 161 ++++++++++++++++++++--- 1 file changed, 142 insertions(+), 19 deletions(-) mode change 100644 => 100755 scripts/InstallScripts/InstallPrawnOS.sh diff --git a/scripts/InstallScripts/InstallPrawnOS.sh b/scripts/InstallScripts/InstallPrawnOS.sh old mode 100644 new mode 100755 index fdb5d2a..b7c9db3 --- a/scripts/InstallScripts/InstallPrawnOS.sh +++ b/scripts/InstallScripts/InstallPrawnOS.sh @@ -1,8 +1,6 @@ #!/bin/bash -#Install PrawnOS to the desired device. This will wipe the device, enable root encryption if desired and -#copy the kernel and filesystem to the - +#See the block of "echos" in main() for description of this script # This file is part of PrawnOS (http://www.prawnos.com) # Copyright (c) 2018 Hal Emmerich @@ -19,16 +17,24 @@ # You should have received a copy of the GNU General Public License # along with PrawnOS. If not, see . +RESOURCES=/InstallResources +# Grab the boot device, which is either /dev/sda for usb or /dev/mmcblk0 for an sd card +BOOT_DEVICE=$(mount | head -n 1 | cut -d '2' -f 1) + main() { - - RESOURCES=/InstallResources - # Grab the boot device, which is either /dev/sda for usb or /dev/mmcblk0 for an sd card - BOOT_DEVICE=$(mount | head -n 1 | cut -d '2' -f 1) - + echo "---------------------------------------------------------------------------------------------------------------------" + echo "PrawnOS Install or Expand Script" + echo "Installation sets up the internal emmc partitions, root encryption, and copies the filesystem from the" + echo "current boot device to the target device. The target device cannot be the current boot device" + echo + echo "Expansion simply targets the booted device, and expands the filesystem to fill the entire thing instead of just 2GB." + echo "Because of this, root encryption cannot be setup" + echo + echo "For installation, this script can be quit and re-ran at any point." + echo "Unfortunately for expansion this is not the case" + echo "---------------------------------------------------------------------------------------------------------------------" + echo echo "Expand or Install?" - echo "Expand in place to fill the entire booted external device" - echo "Install to another internal or external device besides the one we are booted from" - echo "Installation allow for root encryption to be setup, but must target a external or internal device other than the currently booted device" echo "The currently booted device is ${BOOT_DEVICE}" while true; do read -p "[I]nstall or [E]xpand?" IE @@ -38,27 +44,24 @@ main() { * ) echo "Please answer I or E";; esac done - } #Now to pick the install target: internal, sd, or usb #if target is usb, and boot device is usb, target is sdb #and whether to enable crypto install() { - echo "Pick an install target. This can be the Internal Emmc, an SD card, or a USB device" echo "Please ensure you have only have the booted device and the desired target device inserted." echo "The currently booted device is ${BOOT_DEVICE}" while true; do read -p "[I]nternal Emmc, [S]D card, or [U]SB device?" ISU case $IE in - [Ii]* ) $TARGET=/dev/mmcblk2; break;; - [Ss]* ) $TARGET=/dev/mmcblk0; break;; + [Ii]* ) $TARGET=/dev/mmcblk2p; break;; + [Ss]* ) $TARGET=/dev/mmcblk0p; break;; [Uu]* ) $TARGET=USB; break;; * ) echo "Please answer I, S, or U";; esac done - if [[ $TARGET == "USB" ]] then if [[ $BOOT_DEVICE == "/dev/sda" ]] @@ -70,23 +73,142 @@ install() { fi if [[ $TARGET == $BOOT_DEVICE ]] then - echo "Can't install to booted device, please ensure you have only have the booted device and one single other inserted" + echo "Can't install to booted device, please ensure you have *only* the booted device and target device inserted" exit fi #Now on to the installation, basically copy InstallToInternal.sh + while true; do + read -p "This will ERASE ALL DATA ON ${TARGET} and reboot when finished, do you want to continue? [y/N]" yn + case $yn in + [Yy]* ) break;; + [Nn]* ) exit;; + * ) echo "Please answer y or n";; + esac + done + umount ${TARGET}1 || /bin/true + umount ${TARGET}2 || /bin/true + + if [[ $TARGET == "/dev/mmcblk2p" ]] + then + emmc_partition + else + external_partition $TARGET + fi + + KERNEL_PARTITION=${TARGET}1 + ROOT_PARTITION=${TARGET}2 + CRYPTO=false + + echo Writing kernel partition + dd if=/dev/zero of=$KERNEL_PARTITION bs=512 count=65536 + dd if=${BOOT_DEVICE}1 of=$KERNEL_PARTITION + + #Handle full disk encryption + echo "Would you like to setup full disk encrytion using LUKs/DmCrypt?" + select yn in "Yes" "No" + do + case $yn,$REPLY in + Yes,*|*,Yes ) + CRYPTO=true + # Since iteration count is based on cpu power, and the rk3288 isn't as fast as a usual + # desktop cpu, manually supply -i 15000 for security at the cost of a slightly slower unlock + echo "Enter the password you would like to use to unlock the encrypted root partition at boot" + cryptsetup -q -y -s 512 luksFormat -i 15000 $ROOT_PARTITION || exit 1 + echo "Now unlock the newly created encrypted root partition so we can mount it and install the filesystem" + cryptsetup luksOpen $ROOT_PARTITION luksroot || exit 1 + ROOT_PARTITION=/dev/mapper/luksroot + break + ;; + No,*|*,No ) + break + ;; + * ) + echo "Invalid Option, please enter Yes or No, 1 or 2" + ;; + esac + done + + echo Writing Filesystem, this will take about 4 minutes... + mkfs.ext4 -F -b 1024 $ROOT_PARTITION + mkdir -p /mnt/mmc/ + mount $ROOT_PARTITION /mnt/mmc + rsync -ah --info=progress2 --info=name0 --numeric-ids -x / /mnt/mmc/ + #Remove the live-fstab and install a base fstab + rm /mnt/mmc/etc/fstab + echo "${ROOT_PARTITION} / ext4 defaults,noatime 0 1" > /mnt/mmc/etc/fstab + umount $ROOT_PARTITION + echo Running fsck + e2fsck -p -f $ROOT_PARTITION + if [[ $CRYPTO == "true" ]] + then + # unmount and close encrypted storage + cryptsetup luksClose luksroot + fi + echo Rebooting... Please remove the usb drive once shutdown is complete + reboot + +} + +#Setup partition map on internal emmc +emmc_partition() { + #disable dmesg, writing the partition map tries to write the the first gpt table, which is unmodifiable + dmesg -D + echo Writing partition map to internal emmc + DISK_SZ="$(blockdev --getsz /dev/mmcblk2)" + echo Total disk size is: $DISK_SZ + if [ $DISK_SZ = 30785536 ] + then + echo Detected Emmc Type 1 + sfdisk /dev/mmcblk2 < $RESOURCES/mmc.partmap + + elif [ $DISK_SZ = 30777344 ] + then + echo Detected Emmc Type 2 + sfdisk /dev/mmcblk2 < $RESOURCES/mmc_type2.partmap + else + echo ERROR! Not a known EMMC type, please open an issue on github or send SolidHal an email with the Total disk size reported above + echo Try a fallback value? This will allow installation to continue, at the cost of a very small amoutnt of disk space. This may not work. + select yn in "Yes" "No" + do + case $yn,$REPLY in + Yes,*|*,Yes ) + echo Trying Emmc Type 2 + sfdisk /dev/mmcblk2 < $RESOURCES/mmc_type2.partmap + break + ;; + * ) + echo "Invalid Option, please enter Yes or No, 1 or 2" + ;; + esac + done + fi + dmesg -E +} + +#Setup partition map for external bootable device, aka usb or sd card +external_partition() { + $TARGET = $1 + parted --script $TARGET mklabel gpt + cgpt create $TARGET + kernel_start=8192 + kernel_size=65536 + cgpt add -i 1 -t kernel -b $kernel_start -s $kernel_size -l Kernel -S 1 -T 5 -P 10 $TARGET + #Now the main filesystem + root_start=$(($kernel_start + $kernel_size)) + end=`cgpt show $1 | grep 'Sec GPT table' | awk '{print $1}'` + root_size=$(($end - $root_start)) + cgpt add -i 2 -t data -b $root_start -s $root_size -l Root $TARGET } #simply expand to fill the current boot device expand() { - if [[ $BOOT_DEVICE == "/dev/mmcblk2" ]] then echo "Can't expand to fill internal emmc, install will have done this already" exit fi - #Make the boot partition fille the whole drive #Delete the partition sgdisk -d 2 $BOOT_DEVICE @@ -106,4 +228,5 @@ expand() { #call the main function, script technically starts here +#Organized this way so that main can come before the functions it calls main "$@"; exit