#!/bin/bash
if [ $(id -u) != "0" ]; then
echo "This script must be run as root" 1>&2
exit 1
fi
set -e
echo -e 'Welcome to the GentooX setup, the installation script mainly consists of:
\t- providing this script with a target partition where system will be installed
\t- extracting precompiled squashfs system image into the specified partition
\t- setting up GRUB, BIOS or UEFI mode will be used depending how system was booted
\tGentooX uses openSUSE-style BTRFS root partition & subvolumes for snapshotting with snapper
\tGentooX requires minimum of 16GB of space, and use of BTRFS is hardcoded
Manual installation can be done via:
mounting target partition to /mnt/install
unsquashfs -f -i -d /mnt/install/ /mnt/cdrom/image.squashfs
/usr/local/sbin/genfstab -U >> /mnt/install/etc/fstab
/usr/local/sbin/arch-chroot /mnt/install/
grub-install --target=x86_64-efi for UEFI mode or grub-install --target=i386-pc (BIOS only)
grub-mkconfig -o /boot/grub/grub.cfg'
declare -A PART_SCHEME
PART_SCHEME[a]="Automatic"
PART_SCHEME[m]="Manual"
if [[ -d /sys/firmware/efi/ ]]; then UEFI_MODE=y; fi
setup_btrfs () {
DEVICE=$1
mkfs.btrfs -f -L GENTOO $DEVICE
mkdir /mnt/install
mount -o compress=lzo $DEVICE /mnt/install
btrfs subvolume create /mnt/install/@
btrfs subvolume create /mnt/install/@/.snapshots
mkdir /mnt/install/@/.snapshots/1
btrfs subvolume create /mnt/install/@/.snapshots/1/snapshot
mkdir -p /mnt/install/@/boot/grub/
#btrfs subvolume create /mnt/install/@/boot/grub/i386-pc
#btrfs subvolume create /mnt/install/@/boot/grub/x86_64-efi
btrfs subvolume create /mnt/install/@/home
btrfs subvolume create /mnt/install/@/opt
btrfs subvolume create /mnt/install/@/root
btrfs subvolume create /mnt/install/@/srv
btrfs subvolume create /mnt/install/@/tmp
mkdir /mnt/install/@/usr/
btrfs subvolume create /mnt/install/@/usr/local
btrfs subvolume create /mnt/install/@/var
chattr +C /mnt/install/@/var
echo "
single
1
$(date)
first root filesystem
" > /mnt/install/@/.snapshots/1/info.xml
btrfs subvolume set-default $(btrfs subvolume list /mnt/install | grep "@/.snapshots/1/snapshot" | grep -oP '(?<=ID )[0-9]+') /mnt/install
umount /mnt/install
mount -o compress=lzo $DEVICE /mnt/install
# ls /mnt/install should respond with empty result
mkdir /mnt/install/.snapshots
mkdir /mnt/install/boot
#mkdir -p /mnt/install/boot/grub/i386-pc
#mkdir -p /mnt/install/boot/grub/x86_64-efi
mkdir /mnt/install/home
mkdir /mnt/install/opt
mkdir /mnt/install/root
mkdir /mnt/install/srv
mkdir /mnt/install/tmp
mkdir -p /mnt/install/usr/local
mkdir /mnt/install/var
mount $DEVICE /mnt/install/.snapshots -o subvol=@/.snapshots
#mount $DEVICE /mnt/install/boot/grub/i386-pc -o subvol=@/boot/grub/i386-pc
#mount $DEVICE /mnt/install/boot/grub/x86_64-efi -o subvol=@/boot/grub/x86_64-efi
mount $DEVICE /mnt/install/home -o subvol=@/home
mount $DEVICE /mnt/install/opt -o subvol=@/opt
mount $DEVICE /mnt/install/root -o subvol=@/root
mount $DEVICE /mnt/install/srv -o subvol=@/srv
mount $DEVICE /mnt/install/tmp -o subvol=@/tmp
mount $DEVICE /mnt/install/usr/local -o subvol=@/usr/local
mount $DEVICE /mnt/install/var -o subvol=@/var
}
echo -e "\nDetected drives:\n$(lsblk | grep disk)"
while :; do
echo
read -erp "Automatic partitioning (a) or manual partitioning (will launch gparted)? [a/m] " -n 1 partitioning_mode
if [[ $partitioning_mode = "a" ]]; then
if [[ ! -z $UEFI_MODE ]]; then echo "EFI boot detected"; fi
read -erp "Enter drive to be formatted for GentooX installation: " -i "/dev/sda" drive
if [[ ! -z $UEFI_MODE ]]; then
if [[ $drive =~ "nvme" ]]; then partition="${drive}p2"; else partition="${drive}2"; fi # UEFI mode
else
if [[ $drive =~ "nvme" ]]; then partition="${drive}p1"; else partition="${drive}1"; fi # BIOS mode
fi
elif [[ $partitioning_mode = "m" ]]; then
if [[ ! -z $UEFI_MODE ]]; then echo "EFI boot detected, please also create EF00 ESP EFI partition..."; fi
gparted &> /dev/null &
read -erp "Enter formatted partition for GentooX installation: " -i "/dev/sda1" partition
else
echo "Invalid option"
continue
fi
read -erp "Partitioning: ${PART_SCHEME[$partitioning_mode]}
NOTE: in BIOS mode only 1 partition is used for whole OS including /boot,
in UEFI 2 partitions are used, 1st is ESP EFI and 2nd is for GentooX
(e.g. you'll see /dev/sda1 below, or /dev/sda2 or /dev/nvme0n1p2 when in UEFI mode)
Partition: $partition (for GentooX)
Is this correct? [y/n] " -n 1 yn
if [[ $yn == "y" ]]; then
break
fi
done
if [[ $partitioning_mode = "a" ]]; then
if [[ ! -z $UEFI_MODE ]]; then
echo -e "o\nY\nn\n\n\n+256M\nEF00\nn\n2\n\n\n\nw\nY\n" | gdisk $drive
if [[ $drive =~ "nvme" ]]; then
mkfs.vfat -F32 "${drive}p1"
UEFI_PART="${drive}p1"
setup_btrfs "${drive}p2"
else
mkfs.vfat -F32 "${drive}1"
UEFI_PART="${drive}1"
setup_btrfs "${drive}2"
fi
mkdir -p /mnt/install/boot/efi
mount $UEFI_PART /mnt/install/boot/efi
else
echo -e "o\nn\np\n1\n\n\nw" | fdisk $drive # BIOS mode
if [[ $drive =~ "nvme" ]]; then setup_btrfs "${drive}p1"; else setup_btrfs "${drive}1"; fi
fi
else
# user done the partitioning
setup_btrfs $partition
if [[ ! -z $UEFI_MODE ]]; then
read -erp "Enter formatted EF00 ESP partition for EFI: " -i "/dev/sda1" efi_partition
mount $efi_partition /mnt/install/boot/efi
fi
fi
echo "extracting precompiled GentooX image.squashfs to the target partition..."
unsquashfs -f -d /mnt/install/ /mnt/cdrom/image.squashfs
/usr/local/sbin/genfstab -U /mnt/install/ >> /mnt/install/etc/fstab
echo -e "extraction complete.\n"
read -erp "set hostname: " -i "gentoox" hostname
read -erp "set domain name: " -i "haxx.dafuq" domainname
read -erp "set username: " -i "gentoox" username
read -erp "set user password: " -i "gentoox" userpassword
read -erp "set root password: " -i "gentoox" rootpassword
mount -t proc none /mnt/install/proc
mount --rbind /dev /mnt/install/dev
mount --rbind /sys /mnt/install/sys
cd /mnt/install/
cat < /sys/kernel/debug/dri/0/pstate
cpupower frequency-set -g performance' > /etc/local.d/my.start
chmod +x /etc/local.d/my.start
yes $rootpassword | passwd root
if [[ $username != "gentoox" ]]; then
usermod --login $username --move-home --home /home/$username gentoox
groupmod --new-name $username gentoox
fi
yes $userpassword | passwd $username
if [[ ! -z "$UEFI_MODE" ]]; then
grub-install --target=x86_64-efi
else
grub-install --target=i386-pc $drive
fi
grub-mkconfig -o /boot/grub/grub.cfg
#emerge --sync
HEREDOC
umount -l /mnt/install/boot/efi /mnt/install/var /mnt/install/usr/local /mnt/install/tmp /mnt/install/srv /mnt/install/root /mnt/install/opt /mnt/install/home /mnt/install/boot/grub/x86_64-efi /mnt/install/boot/grub/i386-pc /mnt/install/.snapshots /mnt/install 1>/dev/null 2>&1
echo "Installation complete, you may remove the install media and reboot"