Implemented a more complete install script, need to test
This commit is contained in:
parent
a28ea7f847
commit
03574109ba
161
scripts/InstallScripts/InstallPrawnOS.sh
Normal file → Executable file
161
scripts/InstallScripts/InstallPrawnOS.sh
Normal file → Executable file
@ -1,8 +1,6 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
#Install PrawnOS to the desired device. This will wipe the device, enable root encryption if desired and
|
#See the block of "echos" in main() for description of this script
|
||||||
#copy the kernel and filesystem to the
|
|
||||||
|
|
||||||
|
|
||||||
# This file is part of PrawnOS (http://www.prawnos.com)
|
# This file is part of PrawnOS (http://www.prawnos.com)
|
||||||
# Copyright (c) 2018 Hal Emmerich <hal@halemmerich.com>
|
# Copyright (c) 2018 Hal Emmerich <hal@halemmerich.com>
|
||||||
@ -19,16 +17,24 @@
|
|||||||
# You should have received a copy of the GNU General Public License
|
# You should have received a copy of the GNU General Public License
|
||||||
# along with PrawnOS. If not, see <https://www.gnu.org/licenses/>.
|
# along with PrawnOS. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
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() {
|
main() {
|
||||||
|
echo "---------------------------------------------------------------------------------------------------------------------"
|
||||||
RESOURCES=/InstallResources
|
echo "PrawnOS Install or Expand Script"
|
||||||
# Grab the boot device, which is either /dev/sda for usb or /dev/mmcblk0 for an sd card
|
echo "Installation sets up the internal emmc partitions, root encryption, and copies the filesystem from the"
|
||||||
BOOT_DEVICE=$(mount | head -n 1 | cut -d '2' -f 1)
|
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 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}"
|
echo "The currently booted device is ${BOOT_DEVICE}"
|
||||||
while true; do
|
while true; do
|
||||||
read -p "[I]nstall or [E]xpand?" IE
|
read -p "[I]nstall or [E]xpand?" IE
|
||||||
@ -38,27 +44,24 @@ main() {
|
|||||||
* ) echo "Please answer I or E";;
|
* ) echo "Please answer I or E";;
|
||||||
esac
|
esac
|
||||||
done
|
done
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#Now to pick the install target: internal, sd, or usb
|
#Now to pick the install target: internal, sd, or usb
|
||||||
#if target is usb, and boot device is usb, target is sdb
|
#if target is usb, and boot device is usb, target is sdb
|
||||||
#and whether to enable crypto
|
#and whether to enable crypto
|
||||||
install() {
|
install() {
|
||||||
|
|
||||||
echo "Pick an install target. This can be the Internal Emmc, an SD card, or a USB device"
|
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 "Please ensure you have only have the booted device and the desired target device inserted."
|
||||||
echo "The currently booted device is ${BOOT_DEVICE}"
|
echo "The currently booted device is ${BOOT_DEVICE}"
|
||||||
while true; do
|
while true; do
|
||||||
read -p "[I]nternal Emmc, [S]D card, or [U]SB device?" ISU
|
read -p "[I]nternal Emmc, [S]D card, or [U]SB device?" ISU
|
||||||
case $IE in
|
case $IE in
|
||||||
[Ii]* ) $TARGET=/dev/mmcblk2; break;;
|
[Ii]* ) $TARGET=/dev/mmcblk2p; break;;
|
||||||
[Ss]* ) $TARGET=/dev/mmcblk0; break;;
|
[Ss]* ) $TARGET=/dev/mmcblk0p; break;;
|
||||||
[Uu]* ) $TARGET=USB; break;;
|
[Uu]* ) $TARGET=USB; break;;
|
||||||
* ) echo "Please answer I, S, or U";;
|
* ) echo "Please answer I, S, or U";;
|
||||||
esac
|
esac
|
||||||
done
|
done
|
||||||
|
|
||||||
if [[ $TARGET == "USB" ]]
|
if [[ $TARGET == "USB" ]]
|
||||||
then
|
then
|
||||||
if [[ $BOOT_DEVICE == "/dev/sda" ]]
|
if [[ $BOOT_DEVICE == "/dev/sda" ]]
|
||||||
@ -70,23 +73,142 @@ install() {
|
|||||||
fi
|
fi
|
||||||
if [[ $TARGET == $BOOT_DEVICE ]]
|
if [[ $TARGET == $BOOT_DEVICE ]]
|
||||||
then
|
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
|
exit
|
||||||
fi
|
fi
|
||||||
|
|
||||||
#Now on to the installation, basically copy InstallToInternal.sh
|
#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
|
#simply expand to fill the current boot device
|
||||||
expand() {
|
expand() {
|
||||||
|
|
||||||
if [[ $BOOT_DEVICE == "/dev/mmcblk2" ]]
|
if [[ $BOOT_DEVICE == "/dev/mmcblk2" ]]
|
||||||
then
|
then
|
||||||
echo "Can't expand to fill internal emmc, install will have done this already"
|
echo "Can't expand to fill internal emmc, install will have done this already"
|
||||||
exit
|
exit
|
||||||
fi
|
fi
|
||||||
|
|
||||||
#Make the boot partition fille the whole drive
|
#Make the boot partition fille the whole drive
|
||||||
#Delete the partition
|
#Delete the partition
|
||||||
sgdisk -d 2 $BOOT_DEVICE
|
sgdisk -d 2 $BOOT_DEVICE
|
||||||
@ -106,4 +228,5 @@ expand() {
|
|||||||
|
|
||||||
|
|
||||||
#call the main function, script technically starts here
|
#call the main function, script technically starts here
|
||||||
|
#Organized this way so that main can come before the functions it calls
|
||||||
main "$@"; exit
|
main "$@"; exit
|
||||||
|
Loading…
Reference in New Issue
Block a user