sway/gentoo.sh
Your Name 6529ca4851 d
2024-08-19 14:11:21 +00:00

1023 lines
33 KiB
Bash

#!/usr/bin/bash
########################
# What this script is:
#
# An automatic installer for Gentoo Stable with the following features:
# 1. Sway with SystemD
# 2. Full Disk Encryption
# 3. Encrypted Boot
# 4. Waybar, AutoLogin via Getty
# 5. The ability to build a custom and deployable image onto any machine
# 6. Easily create a bootable USB drive
# 7. Automatic Partitioning
# 8. Steam/Wine/Lutris Install
#
# INSTRUCTIONS
#
# For new disk installs, initialize the disk to setup partitions from the main menu.
#
# Before running the install, ensure that you have Internet access.
#
# Please be sure to change USER,USER_PASSWORD, DISK_PASSWORD, and ROOT_PASSWORD strings in this file
#
# To install a new OS to a disk, run gentoo.sh and choose option 1 from the main menu
#
########################
#Configure this section
########################
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
TARGET='/install'
mkdir $TARGET
######################################
echo
HARD_DISK=$2
######################################
USER="verita84"
USER_PASSWORD="123456"
ROOT_PASSWORD="123456"
WIRELESS_PASSWORD='123456'
SSID='123456'
DISK_PASSWORD='123456'
AUTO_DECRYPT='False'
WIRELESS_INTERFACE='wlan0'
COMPRESSION='compress=zstd:10'
FLATPAKS+=()
SERVICES+=(cronie libvirtd smartd cronie cups NetworkManager dev-zram0.swap)
MAKEOPTS="-j$(cat /proc/cpuinfo | grep -i processor | grep -vi 'model' | wc -l)"
ROOT_PARTITION_SIZE="30GB"
FEATURES="-pid-sandbox getbinpkg -binpkg-request-signature"
EMERGE_DEFAULT_OPTS="--getbinpkg "
#USEFLAG CONFIGURATION
USE_FLAGS="webchannel qml -gpm plasma luks cryptsetup kernel-install boot proprietary-codecs libei gdk-pixbuf kernel-install gles2 pulseaudio keeshare gtk vpx bluray libaom libdrm libilbc libplacebo libsoxr libv4l libxml2 lv2 openh264 encode iconv ladspa libass libcaca mp3 openal opus theora v4l vorbis xvid x264 gstreamer networkmanager tray appindicator wayland alsa X sound-server screencast systemd firmware btrfs policykit networkmanager zlib pipewire minizip network browser "
VIDEO_CARDS="amdgpu radeon radeonsi"
#
#PACKAGE CONFIGURATION
BASE_PACKAGES=" net-misc/nyx app-emulation/virt-manager sys-power/powertop net-vpn/tor app-shells/bash-completion sys-apps/fwupd sys-power/cpupower net-p2p/syncthing media-libs/gexiv2 app-vim/airline mail-mta/postfix app-admin/sysstat sys-apps/smartmontools sys-process/cronie net-fs/nfs-utils net-firewall/nftables dev-python/pip sys-fs/inotify-tools net-analyzer/nmap app-misc/screen app-portage/gentoolkit sys-fs/dosfstools app-admin/sudo sys-apps/systemd sys-apps/zram-generator app-eselect/eselect-repository dev-vcs/git sys-block/parted sys-block/zram-init sys-process/btop net-vpn/wireguard-tools app-editors/vim app-misc/fastfetch net-misc/yt-dlp sys-fs/btrfs-progs net-print/cups "
#FIX=" dev-libs/libappindicator"
DESKTOP_APPS=" media-video/obs-studio media-video/handbrake xfce-base/thunar app-editors/vscodium app-office/libreoffice-bin media-video/vlc net-im/telegram-desktop-bin app-admin/keepassxc gui-apps/swayidle gui-apps/swaybg gui-apps/wl-clipboard gui-apps/grim gui-apps/slurp gnome-extra/nm-applet media-fonts/fontawesome media-sound/pavucontrol gui-wm/sway x11-terms/kitty gui-apps/waybar gui-apps/swaylock gui-apps/wofi gui-apps/mako sys-apps/xdg-desktop-portal-gtk sys-apps/xdg-desktop-portal-gtk ranger x11-themes/papirus-icon-theme media-gfx/krita "
#
PACKAGES="$BASE_PACKAGES $DESKTOP_APPS"
TMPFS_SIZE="32G"
CPU_TYPE="x86-64"
TAR_EXCLUDES="--exclude=/run/user/* --exclude=/run/media/* --exclude=/var/db/repos/* --exclude=/var/lib/systemd/coredump/* --exclude=/var/cache/distfiles --exclude=/var/lib/flatpak --exclude=/.snapshots --exclude=/snapshots --exclude=/var/backups --exclude=/volumes/* --exclude=/mnt/* --exclude=/var/tmp/* --exclude=/tmp/* --exclude=/raid/* --exclude=/root/* --exclude=/var/cache/apt/archives/* --exclude=/proc/* --exclude=/.snapshots/* --exclude=/var/lib/libvirt/* --exclude=/dev/* --exclude=/sys/* --exclude=/home/* --exclude=/var/lib/postgresql --exclude=/var/lib/containers "
#Add Masked Packages to the Array
MASKED_PACKAGES+=(media-video/obs-studio net-misc/nyx net-libs/stem sys-libs/libudev-compat dev-libs/nss dev-libs/libappindicator media-video/ffmpeg games-util/game-device-udev-rules games-util/steam-launcher net-im/telegram-desktop-bin)
partitionDetection() {
#This is used for the installer to do script-based actions
#/usr/sbin/blkid -p /dev/$HARD_DISK
EFI=$(blkid | grep $HARD_DISK | sort | cut -d ":" -f1 | head -1 | tail -1)
BTRFS=$(blkid | grep $HARD_DISK | sort | cut -d ":" -f1 | head -2 | tail -1)
SWAP=$(blkid | grep $HARD_DISK | sort | cut -d ":" -f1 | head -3 | tail -1)
ROOT_MAPPER_NAME="luks-$(/sbin/blkid -s UUID -o value $BTRFS)"
echo $ROOT_MAPPER_NAME
}
partitionDetection
torConfig() {
echo "Configuring TOR"
echo
echo "EntryNodes {us}" >/etc/tor/torrc
echo "ExitNodes {us}" >>/etc/tor/torrc
echo "AvoidDiskWrites 1" >>/etc/tor/torrc
echo "HardwareAccel 1" >>/etc/tor/torrc
echo "NumCPUs 4" >>/etc/tor/torrc
chown -R debian-tor:debian-tor /etc/tor
}
decryptBoot() {
KEYFILE='keyfile.key'
echo
echo "Setting LUKS to use Keyfile for password entry"
echo
echo "Clearing Old Keys"
echo
for i in 1 2 3 4 5 6; do
printf "$DISK_PASSWORD" | cryptsetup luksKillSlot $1 $i
done
dd if=/dev/urandom of=/boot/$KEYFILE bs=1024 count=4
chown root:root /boot/$KEYFILE
chmod 0400 /boot/$KEYFILE
echo
echo "Adding new key......"
echo
printf "$DISK_PASSWORD" | cryptsetup luksAddKey $1 /boot/$KEYFILE
echo "install_items+=\" /boot/unlock.sh /boot/$KEYFILE \"" >>/etc/dracut.conf
sed -i "s/none/luks,\/boot\/$KEYFILE,keyscript=\/boot\/unlock.sh/" /etc/crypttab
echo "#!/bin/bash" >/boot/unlock.sh
echo "cryptsetup open UUID=$(/sbin/blkid -s UUID -o value ${BTRFS}) --key-file=/boot/$KEYFILE $ROOT_MAPPER_NAME" >>/boot/unlock.sh
chmod +x /boot/unlock.sh
}
autoLogin() {
GETTY_DIR="$TARGET/etc/systemd/system/getty@tty1.service.d"
GETTY="$GETTY_DIR/override.conf"
mkdir -p $GETTY_DIR
echo "[Service]" >$GETTY
echo "ExecStart=" >>$GETTY
echo "ExecStart=-/sbin/agetty --autologin $USER --noclear %I /usr/bin/bash" >>$GETTY
}
osSnapshots() {
echo
mkdir $2
echo "[Creating new OS snapshot to $2/$3.tgz]"
echo
echo
NEW_TAR_EXCLUDES="$TAR_EXCLUDES --exclude=/minio --exclude=$TARGET/* --exclude=/var/lib/docker "
echo
rm -f $2/$3.tgz
time tar cpzvf $2/$3.tgz $NEW_TAR_EXCLUDES /
chown $USER:$USER $2/$3.tgz
}
homeBackup() {
echo
echo "[Copying USER data from /home to $TARGET/@home]"
echo
rsync -a --delete /home/ --exclude=.cache --exclude=.local/share/flatpak --exclude=.local/share/containers $TARGET/\@home/
}
osBackup() {
umount $TARGET
printf "$DISK_PASSWORD" | cryptsetup open ${BTRFS} $ROOT_MAPPER_NAME
if [[ -e "/dev/mapper/$ROOT_MAPPER_NAME" ]]; then
echo
echo "[Mounting.....]"
echo
mount -o $COMPRESSION /dev/mapper/$ROOT_MAPPER_NAME $TARGET
if [[ -e "$TARGET/@$ROOT_NAME/usr/bin/bash" ]]; then
if [ "$1" = "home" ]; then
homeBackup
fi
osSnapshots "$1" "$2" "$3"
else
echo
echo "Aborting Install, $TARGET/@$ROOT_MAPPER_NAME/usr/bin/bash not found!"
echo
echo
exit 1
fi
else
echo
echo "Aborting Install, /dev/mapper/$ROOT_MAPPER_NAME not found!"
echo
echo
exit 1
fi
ls $TARGET/
umount $TARGET
cryptsetup close $ROOT_MAPPER_NAME
}
osRestore() {
partitions
rm -rf $TARGET/usr $TARGET/sbin $TARGET/lib32 $TARGET/libx32 $TARGET/lib $TARGET/vmlinuz* $TARGET/initrd* $TARGET/bin $TARGET/var $TARGET/root $TARGET/opt $TARGET/etc $TARGET/run
clear
echo "[Restoring OS tarfile from $4/$2.tgz]"
echo
tar xfp $4/$2.tgz -C $TARGET/
if [ "$3" = "home" ]; then
echo "[Restoring /home]"
echo
rsync -a --delete /home/ $TARGET/home/
fi
fstab
cp -f gentoo.sh $TARGET/
systemMounts
chmod +x $TARGET/gentoo.sh
chroot $TARGET /gentoo.sh bootloader
chroot $TARGET /gentoo.sh btrfsTweaks
chroot $TARGET /gentoo.sh accounts
chroot $TARGET /gentoo.sh hibernate
chown -R $USER:$USER $TARGET/home/$USER
auto_login
rm -f $TARGET/gentoo.sh
#unmount
}
systemMounts() {
echo
echo "[Checking for BTRFS Partition]"
if [[ -e "$BTRFS" ]]; then
partitions
echo "BTRFS device found"
echo
echo "Mounting Boot,EFI,HOME"
echo
mount /dev/mapper/$ROOT_MAPPER_NAME $TARGET
mount $BTRFS $TARGET
btrfs_filesytem
mkdir -p $TARGET/boot/EFI
mount $EFI $TARGET/boot
#CONFIGURE DATA DIRS (HOME)
mkdir $TARGET/home
mount -o subvol=@home /dev/mapper/$ROOT_MAPPER_NAME $TARGET/home
mkdir $TARGET/home/$USER
mkdir $TARGET/run
mkdir $TARGET/dev
mkdir $TARGET/proc
mkdir $TARGET/sys
mkdir -p $TARGET/var/tmp/portage
mount --types proc /proc $TARGET/proc
mount --rbind /sys $TARGET/sys
mount --make-rslave $TARGET/sys
mount --rbind /dev $TARGET/dev
mount --make-rslave $TARGET/dev
mount --bind /run $TARGET/run
mount --make-slave $TARGET/run
mount -t efivarfs none $TARGET/sys/firmware/efi/efivars
mount -t tmpfs -o size=$TMPFS_SIZE tmpfs $TARGET/var/tmp/portage
else
echo
echo "Aborting Install, $BTRFS not found!"
echo
echo
exit 1
fi
}
unmaskPackages() {
mkdir -p /etc/portage/package.use
echo ">=dev-qt/qtmultimedia-5.0.0 -qml -openal" >/etc/portage/package.use/qtmultimedia
for i in "${MASKED_PACKAGES[@]}"; do
echo "$i ~amd64" >>/etc/portage/package.accept_keywords
done
}
installNvidia() {
ACCEPT_KEYWORDS="~amd64" emerge x11-drivers/nvidia-drivers nvidia-cuda-toolkit www-apps/jellyfin net-im/coturn --autounmask-write
etc-update -q --automode -5
ACCEPT_KEYWORDS="~amd64" emerge x11-drivers/nvidia-drivers nvidia-cuda-toolkit www-apps/jellyfin net-im/coturn
}
configurePortage() {
sed -i "s/-O2/-march=$CPU_TYPE -O2/i" $TARGET/etc/portage/make.conf
echo 'ACCEPT_KEYWORDS="amd64"' >>$TARGET/etc/portage/make.conf
echo "FEATURES=\"$FEATURES\"" >>$TARGET/etc/portage/make.conf
echo "EMERGE_DEFAULT_OPTS=\"$EMERGE_DEFAULT_OPTS\"" >>$TARGET/etc/portage/make.conf
echo "L10N=\"en en-US\"" >>$TARGET/etc/portage/make.conf
mkdir -p $TARGET/var/tmp/portage
if [ -f "./repos.conf" ]; then
echo
echo "Found Local Gentoo Repo"
mkdir -p $TARGET/etc/portage/repos.conf
mkdir -p $TARGET/etc/portage/binrepos.conf
cp -f repos.conf $TARGET/etc/portage/repos.conf/
cp -f gentoobinhost.conf $TARGET/etc/portage/binrepos.conf/gentoobinhost.conf
echo "GENTOO_MIRRORS=\"https://mirrors.poster.place/\"" >>$TARGET/etc/portage/make.conf
echo
echo
fi
chroot $TARGET /usr/bin/emerge --sync
echo
echo "Configuring Binary Package GPG keys"
echo
chroot $TARGET /usr/bin/getuto
echo "USE=\"$USE_FLAGS\"" >>$TARGET/etc/portage/make.conf
echo "MAKEOPTS=\"$MAKEOPTS\"" >>$TARGET/etc/portage/make.conf
echo
echo
echo
echo "[Configuring Profiles]"
echo
echo
echo
GENTOO_PROFILE=$(
chroot $TARGET /usr/bin/eselect profile list | grep -i "desktop/systemd" | grep -Evi 'plasma|gnome' | grep systemd | grep -i stable | head -1 | cut -d '[' -f2 | cut -d ']' -f1
)
chroot $TARGET /usr/bin/eselect profile set $GENTOO_PROFILE
mkdir -p $TARGET/etc/portage/package.license
echo "*/* *" >$TARGET/etc/portage/package.license/license
rm -rf $TARGET/etc/portage/package.accept_keywords
mkdir -p $TARGET/etc/portage/package.mask
echo "dev-lang/rust" >$TARGET/etc/portage/package.mask/rust
}
buildGentoo() {
echo "[Install Base System]"
echo
echo
echo
echo
echo
echo "[Building Base System]"
echo
echo
chroot $TARGET /usr/bin/emerge --update --deep --newuse @world --autounmask-write
chroot $TARGET etc-update -q --automode -5
chroot $TARGET /usr/bin/emerge --update --deep --newuse @world
locale
chroot $TARGET /usr/sbin/systemd-machine-id-setup
echo
echo
echo
echo "[Installing Kernel]"
echo
echo
chroot $TARGET /usr/bin/emerge -uDN dracut sys-kernel/gentoo-kernel-bin sys-kernel/linux-firmware --autounmask-write
chroot $TARGET etc-update -q --automode -5
chroot $TARGET /usr/bin/emerge -uDN dracut sys-kernel/gentoo-kernel-bin sys-kernel/linux-firmware
chroot $TARGET /usr/bin/eselect kernel set 1
echo
echo
echo
echo "[Installing Packages]"
echo
echo
cp -f gentoo.sh $TARGET/usr/bin/gentoo.sh
chroot $TARGET /usr/bin/bash /usr/bin/gentoo.sh install-packages
echo
echo
echo
echo "[Installing the Boot Loader]"
echo
echo
cp -f /tmp/disk $TARGET/tmp/
chroot $TARGET /usr/bin/bash /usr/bin/gentoo.sh bootloader
echo
echo
echo "[Configuring Accounts and post-setup tasks]"
echo
echo
echo 'bash /usr/bin/gentoo.sh accounts' >>$TARGET/setup.sh
echo 'bash /usr/bin/gentoo.sh desktop' >>$TARGET/setup.sh
echo 'bash /usr/bin/gentoo.sh btrfs-tweaks' >>$TARGET/setup.sh
echo 'bash /usr/bin/gentoo.sh hibernate' >>$TARGET/setup.sh
autoLogin
chmod +x $TARGET/usr/bin/gentoo.sh
chmod +x $TARGET/setup.sh
chroot $TARGET /setup.sh
rm -f $TARGET/setup.sh
}
installPackages() {
unmaskPackages
/usr/bin/emerge -uDN $PACKAGES --autounmask-write
/usr/sbin/etc-update -q --automode -5
/usr/bin/emerge -uDN $PACKAGES
eselect repository add librewolf git https://codeberg.org/librewolf/gentoo.git
emaint sync -r guru
emaint sync -r librewolf
emerge -uDN librewolf-bin
torConfig
}
snapshots() {
echo
echo "Creating Snapshots....."
echo
DATE=$(echo $(date +%Y-%m-%d-%H-%M-%S))
CURRENT_ROOT=$(cat /proc/cmdline | cut -d '@' -f2 | cut -d ' ' -f1)
if [[ "$CURRENT_ROOT" == *"previous"* ]]; then
echo "Already booted in Previous"
else
echo "Removing Previous Snapshot"
btrfs sub del /.snapshots/previous
btrfs sub snapshot / /.snapshots/previous
fi
}
btrfsTweaks() {
DISABLE_COW=("/var/lib/docker" "/var/lib/containers" "/volumes" "/var/lib/mysql" "/var/lib/libvirt")
for i in "${DISABLE_COW[@]}"; do
chattr -R +C $i
done
}
liveOSrestore() {
clear
mkdir /tmp/live
LIVE_OS_DM="/dev/mapper/$(mount | grep -i ' / ' | cut -d '/' -f4 | cut -d ' ' -f1)"
LIVE_OS_SUBVOL="@$(mount | grep -i ' / ' | cut -d '@' -f2 | sed 's/)//g')"
partitions
systemMounts
clear
echo "[Transferring Currenting Running OS from $LIVE_OS_DM to $HARD_DISK ]"
echo
mount $LIVE_OS_DM /tmp/live
cd /tmp/live/$LIVE_OS_SUBVOL
rsync -a --delete . --exclude=home/* --exclude=.snapshots/* --exclude=sys/* --exclude=dev/* --exclude=proc/* --exclude=run/* $TARGET/
fstab
cp -f $SCRIPT/gentoo.sh $TARGET/usr/bin/
echo "[Copying Boot Files ]"
echo
rm -f $TARGET/boot/*
rsync -av --delete /boot/ $TARGET/boot/
cp -f /tmp/disk $TARGET/tmp/
echo "bash /usr/bin/gentoo.sh bootloader" >$TARGET/setup.sh
echo 'bash /usr/bin/gentoo.sh accounts' >>$TARGET/setup.sh
echo 'bash /usr/bin/gentoo.sh btrfs-tweaks' >>$TARGET/setup.sh
echo 'bash /usr/bin/gentoo.sh hibernate' >>$TARGET/setup.sh
chmod +x $TARGET/usr/bin/gentoo.sh
chmod +x $TARGET/setup.sh
chroot $TARGET bash /setup.sh
rm -f $TARGET/setup.sh
read -p 'Would you like to run your UserTweaks: ' -e -i 'y' user_tweaks
autoLogin
if [[ $user_tweaks = *y* ]]; then
userTweaks
else
echo
echo "Skipping User Tweaks"
fi
chown -R $USER:$USER $TARGET/home/$USER
cd
umount /tmp/live
#unmount
}
flatpaks() {
echo
echo "Installing Flatpaks......"
echo
flatpak remote-add --user --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo
for i in "${FLATPAKS[@]}"; do
echo $i
flatpak install --user $i -y
done
}
btrfs_filesytem() {
btrfs sub create $TARGET/@$ROOT_NAME
btrfs sub create $TARGET/@.snapshots
btrfs sub create $TARGET/@libvirt
btrfs sub create $TARGET/@home
btrfs sub create $TARGET/@root
btrfs sub create $TARGET/@containers
btrfs sub create $TARGET/@flatpak
echo
echo "Binding BTRFS Root"
echo
umount $TARGET
mount -o $COMPRESSION,subvol=@$ROOT_NAME /dev/mapper/$ROOT_MAPPER_NAME $TARGET
}
userTweaks() {
mkdir $TARGET/home/$USER/.librewolf
mkdir -p $TARGET/home/$USER/.config/waybar
mkdir -p $TARGET/home/$USER/Exodus-linux-x64
mkdir -p $TARGET/home/$USER/.config/wofi
mkdir -p $TARGET/home/$USER/.config/sway
mkdir -p $TARGET/home/$USER/.config/autostart
mkdir -p $TARGET/home/$USER/.config/hypr
mkdir -p $TARGET/home/$USER/.config/rofi
mkdir -p $TARGET/home/$USER/Documents/keys/keepass
mkdir -p $TARGET/home/$USER/dotfiles
mkdir -p $TARGET/home/$USER/server
mkdir -p $TARGET/home/$USER/.config/Exodus
mkdir -p $TARGET/home/$USER/.config/evolution
mkdir -p $TARGET/home/$USER/.config/goa-1.0
mkdir -p $TARGET/home/$USER/.local/share/fonts
$TARGET/home/$USER/.local/share/fonts/
cp -f /home/$USER/.bash* $TARGET/home/$USER/
rsync -av --delete /home/$USER/server/ $TARGET/home/$USER/server/
rsync -av --delete /home/$USER/Exodus-linux-x64/ $TARGET/home/$USER/Exodus-linux-x64/
rsync -av --delete /home/$USER/.local/share/fonts/ $TARGET/home/$USER/.local/share/fonts/
rsync -av --delete /home/$USER/.config/hypr/ $TARGET/home/$USER/.config/hypr/
rsync -av --delete /home/$USER/.config/wofi/ $TARGET/home/$USER/.config/wofi/
rsync -av --delete /home/$USER/.config/sway/ $TARGET/home/$USER/.config/sway/
rsync -av --delete /home/$USER/.config/waybar/ $TARGET/home/$USER/.config/waybar/
rsync -av --delete /home/$USER/.config/rofi/ $TARGET/home/$USER/.config/rofi/
rsync -av --delete /home/$USER/.config/Exodus/ $TARGET/home/$USER/.config/Exodus/
rsync -av --delete /home/$USER/.config/evolution/ $TARGET/home/$USER/.config/evolution/
rsync -av --delete /home/$USER/.config/goa-1.0/ $TARGET/home/$USER/.config/goa-1.0/
rsync -av --delete /home/$USER/.librewolf/ $TARGET/home/$USER/.librewolf/
rsync -av --delete /home/$USER/.config/autostart/ $TARGET/home/$USER/.config/autostart/
rsync -av --delete /home/$USER/Documents/keys/keepass/ $TARGET/home/$USER/Documents/keys/keepass/
rsync -av --delete /home/$USER/dotfiles/ $TARGET/home/$USER/dotfiles/
rsync -av --delete /home/$USER/.config/keepassxc/ $TARGET/home/$USER/.config/keepassxc/
chmod +x $TARGET/home/$USER/dotfiles/scripts/keepass.sh
chroot $TARGET /usr/bin/systemctl disable libvirtd libvirtd.socket firewall.service
}
services() {
echo '[zram0]' >/etc/systemd/zram-generator.conf
echo 'zram-size = ram * 2' >>/etc/systemd/zram-generator.conf
for i in "${SERVICES[@]}"; do
systemctl enable --now $i
done
#Required for Audio to work
systemctl --user enable --now pipewire.socket pipewire-pulse.socket wireplumber.service
systemctl --user enable --now pipewire.service
}
desktop() {
services
}
installSteam() {
eselect repository enable steam-overlay
emerge --sync steam-overlay
emerge -uDN games-util/steam-launcher app-emulation/wine-vanilla --autounmask-write
etc-update -q --automode -5
emerge -uDN @world
emerge -uDN games-util/steam-launcher app-emulation/wine-vanilla
}
locale() {
echo "ln -sf /usr/share/zoneinfo/US/Mountain /etc/localtime" >>$TARGET/setup.sh
echo "hwclock --systohc" >>$TARGET/setup.sh
echo "en_US.UTF-8 UTF-8" >$TARGET/etc/locale.gen
echo "locale-gen" >>$TARGET/setup.sh
}
fstab() {
mkdir $TARGET/etc
echo "Debug $ROOT_MAPPER_NAME"
echo "UUID=$(/sbin/blkid -s UUID -o value $EFI) /boot vfat defaults,fmask=0077,dmask=0077 0 1" >$TARGET/etc/fstab
echo "UUID=$(/sbin/blkid -s UUID -o value /dev/mapper/$ROOT_MAPPER_NAME) / btrfs noatime,nodiratime,autodefrag,$COMPRESSION,subvol=@$ROOT_NAME 0 1" >>$TARGET/etc/fstab
echo "UUID=$(/sbin/blkid -s UUID -o value /dev/mapper/$ROOT_MAPPER_NAME) /.snapshots btrfs noatime,nodiratime,autodefrag,$COMPRESSION,subvol=@.snapshots 0 1" >>$TARGET/etc/fstab
echo "UUID=$(/sbin/blkid -s UUID -o value /dev/mapper/$ROOT_MAPPER_NAME) /var/lib/libvirt btrfs noatime,nodiratime,autodefrag,$COMPRESSION,subvol=@libvirt 0 1" >>$TARGET/etc/fstab
echo "UUID=$(/sbin/blkid -s UUID -o value /dev/mapper/$ROOT_MAPPER_NAME) /var/lib/flatpak btrfs noatime,nodiratime,autodefrag,$COMPRESSION,subvol=@flatpak 0 1" >>$TARGET/etc/fstab
echo "tmpfs /var/log tmpfs defaults,dev,exec 0 0" >>$TARGET/etc/fstab
echo "tmpfs /tmp tmpfs defaults 0 0" >>$TARGET/etc/fstab
echo "tmpfs /home/${USER}/.cache tmpfs rw,user,exec 0 0" >>$TARGET/etc/fstab
echo "tmpfs /home/${USER}/Downloads tmpfs rw,user,exec 0 0" >>$TARGET/etc/fstab
echo "UUID=$(/sbin/blkid -s UUID -o value /dev/mapper/$ROOT_MAPPER_NAME) /home btrfs noatime,nodiratime,autodefrag,$COMPRESSION,subvol=@home 0 1" >>$TARGET/etc/fstab
echo "UUID=$(/sbin/blkid -s UUID -o value /dev/mapper/$ROOT_MAPPER_NAME) /root btrfs noatime,nodiratime,autodefrag,$COMPRESSION,subvol=@root 0 1" >>$TARGET/etc/fstab
echo "UUID=$(/sbin/blkid -s UUID -o value /dev/mapper/$ROOT_MAPPER_NAME) /var/lib/containers btrfs noatime,nodiratime,autodefrag,$COMPRESSION,subvol=@containers 0 1" >>$TARGET/etc/fstab
if [[ $SWAP_CHOICE = *y* ]]; then
echo "$SWAP none swap 0 0" >>$TARGET/etc/fstab
fi
}
accounts() {
echo
echo "Set Password for $USER"
useradd -m -s /bin/bash $USER
echo "$USER:$USER_PASSWORD" | chpasswd
gpasswd -a $USER wheel
gpasswd -a $USER network
gpasswd -a $USER video
gpasswd -a $USER libvirt
gpasswd -a $USER netdev
gpasswd -a $USER adm
gpasswd -a $USER video
echo "$USER ALL=(ALL) ALL" >/etc/sudoers
echo "root ALL=(ALL) ALL" >>/etc/sudoers
echo
echo "Setting ROOT Password:"
echo "root:$ROOT_PASSWORD" | chpasswd
/usr/bin/hostnamectl set-hostname $ROOT_NAME
}
btrfs-tweaks() {
DISABLE_COW=("/var/lib/docker" "/volumes" "/var/lib/mysql" "/var/lib/libvirt")
for i in "${DISABLE_COW[@]}"; do
chattr -R +C $i
done
}
initializeDisk() {
clear
echo
echo "[Gentoo Installer - Initialize Device]"
echo
parted /dev/$HARD_DISK mklabel gpt
parted -a optimal /dev/$HARD_DISK mkpart primary fat32 1MiB 2024MiB
parted -a optimal /dev/$HARD_DISK set 1 esp on
if [[ $SWAP_CHOICE = *y* ]]; then
parted -a optimal /dev/$HARD_DISK mkpart P2 ext3 2024MiB 98%
parted -a optimal /dev/$HARD_DISK mkpart P2 ext3 98% 100%
else
parted -a optimal /dev/$HARD_DISK mkpart P2 ext3 2024MiB 100%
fi
partitionDetection
printf "$DISK_PASSWORD\n$DISK_PASSWORD" | cryptsetup luksFormat ${BTRFS}
printf "$DISK_PASSWORD" | cryptsetup open ${BTRFS} $ROOT_MAPPER_NAME
echo
echo "Formatting....."
echo y | mkfs.btrfs /dev/mapper/$ROOT_MAPPER_NAME -f
echo
echo "Formatting $EFI"
echo
echo y | mkfs.vfat $EFI
if [[ $SWAP_CHOICE = *y* ]]; then
mkswap -f $SWAP
fi
echo "Initialize Complete. Please reboot your machine to avoid any issues"
echo
cryptsetup close $ROOT_MAPPER_NAME
}
wifi() {
iwctl --passphrase $WIRELESS_PASSWORD station $WIRELESS_INTERFACE connect $SSID
}
show-help() {
clear
echo
echo "[gentoo.sh arguments]"
echo
echo "./gentoo.sh wifi"
echo "./gentoo.sh bootloader [disk] [ROOT_NAME] [ROOT_MAPPER_NAME]"
echo "./gentoo.sh initialize"
echo "./gentoo.sh tar [device name] [location]"
echo "./gentoo.sh snapshot"
echo "./gentoo.sh reomve-snapshot"
echo "./gentoo.sh btrfs-tweaks"
echo
}
tweaks() {
clear
echo
echo "Gentoo Installer System Tweaks]"
echo
echo "[1] Reinstall Bootloader"
echo "[2] Chroot into existing OS"
echo "[3] Compile the Kernel"
echo "[4] Upgrade gentoo.sh"
echo "[5] Restore Live OS to removable media"
echo "[6] Enable/Disable Disk Password at Boot"
echo
read -p 'Your Choice: ' choice
if [[ $choice = 1 ]]; then
setDevices
bootloader
elif [[ $choice = 2 ]]; then
setDevices
systemMounts
/usr/bin/chroot $TARGET /bin/bash
elif [[ $choice = 3 ]]; then
compile-kernel
elif [[ $choice = 4 ]]; then
rm -f gentoo.sh
rm -f repos.conf
rm -f gentoobinhost.conf
rm -f /tmp/latest-stage3-amd64-desktop-systemd.txt
wget https://git.poster.place/verita84/sway/raw/branch/main/gentoo.sh
elif [[ $choice = 5 ]]; then
setDevices
liveOSrestore "$HARD_DISK" $ROOT_MAPPER_NAME "none" "none" "$ROOT_NAME"
elif [[ $choice = 6 ]]; then
clear
echo "[Password Protection at Boot]"
echo
echo
setDevices
read -p 'Unlock Disk without password at boot time? ' -e -i "y" pass_change
if [[ $pass_change = *n* ]]; then
AUTO_DECRYPT="False"
bootloader "$HARD_DISK" "$ROOT_NAME" "$ROOT_MAPPER_NAME"
else
AUTO_DECRYPT="True"
bootloader "$HARD_DISK" "$ROOT_NAME" "$ROOT_MAPPER_NAME"
fi
else
tweaks
fi
}
download-setup() {
clear
echo "[Choose Deployment Type]"
echo
echo
setDevices
STAGE3_URL=$(curl https://www.gentoo.org/downloads/ | grep -i stage3-amd64-systemd | head -1 | cut -d '"' -f2-3 | cut -d '"' -f1)
STAGE3_FILE="/tmp/stage3.tar.xz"
if [ -f "$STAGE3_FILE" ]; then
echo
echo "Stage 3 already downloaded....."
echo
else
wget -O /tmp/stage3.tar.xz "$STAGE3_URL"
fi
if [ -f "$STAGE3_FILE" ]; then
echo
echo
echo "Extracting Tar File.........."
echo
echo
systemMounts
echo
echo "Extracting $STAGE3_FILE"
echo
tar xf $STAGE3_FILE -C $TARGET/
fstab
cp -f /etc/resolv.conf $TARGET/etc/
configurePortage
cp -f gentoo.sh $TARGET/usr/bin/
fi
}
menu() {
clear
echo
echo "[Welcome to the Poster.place Gentoo Installer System]"
echo
echo "[1] Setup Disk"
echo "[2] Download Gentoo Installation Files"
echo "[3] Install System"
echo "[4] Automatic Install"
echo "[5] Backup"
echo "[6] Restore"
echo "[7] Tools and Tweaks"
echo "[8] Initialize Disk"
echo
read -p 'Your Choice: ' choice
if [[ $choice = 1 ]]; then
setDevices
read -p "Press enter key to Continue"
menu
elif [[ $choice = 2 ]]; then
download-setup
read -p "Press enter key to Continue"
menu
elif [[ $choice = 3 ]]; then
setDevices
buildGentoo
read -p "Press enter key to Continue"
menu
elif [[ $choice = 4 ]]; then
setDevices
download-setup
buildGentoo
exit 1
elif [[ $choice = 5 ]]; then
clear
echo "[Backup OS]"
echo
read -p 'Backup Home Directory? : ' -e -i 'n' home_backup
read -p 'OS Backup Directory Location : ' -e -i "/mnt" backup_directory
if [[ $home_backup = *n* ]]; then
osBackup "none" "$backup_directory" "$ROOT_NAME"
else
osBackup "home" "$backup_directory" "$ROOT_NAME"
fi
elif [[ $choice = 6 ]]; then
clear
echo "[Restore from Backup]"
echo
echo
rm -f /tmp/disk
setDevices
read -p 'Hostname for Restore: ' -e -i "gentoo" HOSTNAME
read -p 'Restore Directory Image Source: ' -e -i "/mnt" restore_directory
FILE_SCAN=$(ls $restore_directory/gentoo-$HOSTNAME-* | tail -1)
read -p 'Restore Home Directory? : ' -e -i 'n' home_restore
read -p 'Backup file name to restore: ' -e -i "$FILE_SCAN" backup_name
if [[ $home_restore = *n* ]]; then
osRestore "$HARD_DISK" "$backup_name" "none" "$restore_directory" "$BTRFS"
else
osRestore "$HARD_DISK" "$backup_name" "home" "$restore_directory" "$BTRFS"
fi
elif [[ $choice = 7 ]]; then
tweaks
elif [[ $choice = 8 ]]; then
clear
echo "[Initialize Disk]"
echo
echo
setDevices
initializeDisk
read -p "Press enter key to Continue"
menu
else
menu
fi
}
partitions() {
echo
echo "Setting Up Partitions....."
echo printf "$DISK_PASSWORD" | cryptsetup open ${BTRFS} $ROOT_MAPPER_NAME
printf "$DISK_PASSWORD" | cryptsetup open ${BTRFS} $ROOT_MAPPER_NAME
if [[ -e "/dev/mapper/$ROOT_MAPPER_NAME" ]]; then
fstab
else
echo
echo "Aborting Install, /dev/mapper/$ROOT_MAPPER_NAME not found!"
echo
echo
exit 1
fi
}
setDevices() {
if [ -f "/tmp/disk" ]; then
HARD_DISK=$(cat /tmp/disk | head -1)
ROOT_NAME=$(cat /tmp/disk | tail -3 | head -1)
SWAP_CHOICE=$(cat /tmp/disk | tail -1 | head -1)
else
i=0
while [ $i != "n" ]; do
clear
echo
echo "Disks and Partitions:"
echo
cat /proc/partitions
echo
echo "Erase the line and press enter to skip to the next detected disk"
echo
i=$(expr $i + 1)
read -p 'Disk Device to Use: ' -e -i $(lsblk | grep -i disk | grep -Evi 'swap' | cut -d ' ' -f1 | head -$i | tail -1) device
if [[ ! -z $device ]]; then
i="n"
fi
done
read -p 'BTRFS Root Volume name: ' -e -i "gentoo" root_name
read -p 'LUKS Device Mapper Name: ' -e -i "root" device_mapper_name
read -p 'Swap Partition for hibernation? (y/n): ' -e -i "y" SWAP_CHOICE
HARD_DISK=$device
echo $HARD_DISK >/tmp/disk
echo $root_name >>/tmp/disk
echo $device_mapper_name >>/tmp/disk
echo $SWAP_CHOICE >>/tmp/disk
setDevices
fi
partitionDetection
}
hibernateSetup() {
echo "[Sleep]" >/etc/systemd/sleep.conf
echo "AllowSuspend=yes" >>/etc/systemd/sleep.conf
echo "AllowHibernation=yes" >>/etc/systemd/sleep.conf
echo "AllowSuspendThenHibernate=yes" >>/etc/systemd/sleep.conf
echo "HibernateState=disk" >>/etc/systemd/sleep.conf
echo "HibernateMode=platform" >>/etc/systemd/sleep.conf
echo "HibernateDelaySec=1800" >>/etc/systemd/sleep.conf
echo "HandleLidSwitch=suspend-then-hibernate" >>/etc/systemd/logind.conf
echo "HandleLidSwitchExternalPower=suspend-then-hibernate" >>/etc/systemd/logind.conf
unlink /usr/lib/systemd/system/systemd-suspend.service
rm -f /usr/lib/systemd/system/systemd-suspend.service
ln -s /usr/lib/systemd/system/systemd-suspend-then-hibernate.service /usr/lib/systemd/system/systemd-suspend.service
}
bootloader() {
chmod -R 740 /boot/EFI
rm -rf /boot/loader/entries/*
#find /boot -type f -name initrd.\* -exec rm -f {} \;
#find /boot/* -type d -exec rm -rf {} \;
bootctl install
MACHINE_ID=$(cat /etc/machine-id)
KERNEL="kernel-$(ls /boot | grep kernel | cut -d '-' -f2-4 | head -1)"
KERNEL_VERSION=$(echo $KERNEL | cut -d '-' -f2-4)
LOADER_FILE="/boot/loader/entries/$MACHINE_ID-$KERNEL_VERSION.conf"
PREVIOUS_LOADER_FILE="/boot/loader/entries/previous.conf"
clear
echo 'add_dracutmodules+=" crypt dm rootfs-block "' >/etc/dracut.conf
if [[ $SWAP_CHOICE = *y* ]]; then
echo "kernel_cmdline+=\" resume=UUID=$(/sbin/blkid -s UUID -o value ${SWAP}) mitigations=off rd.luks.key=/boot/keyfile.key:UUID=$(/sbin/blkid -s UUID -o value ${EFI}) rd.luks.uuid=$(/sbin/blkid -s UUID -o value ${BTRFS}) root=UUID=$(/sbin/blkid -s UUID -o value /dev/mapper/${ROOT_MAPPER_NAME}) rootflags=subvol=@$ROOT_NAME rw \"" >>/etc/dracut.conf
else
echo "kernel_cmdline+=\" mitigations=off rd.luks.key=/boot/keyfile.key:UUID=$(/sbin/blkid -s UUID -o value ${EFI}) rd.luks.uuid=$(/sbin/blkid -s UUID -o value ${BTRFS}) root=UUID=$(/sbin/blkid -s UUID -o value /dev/mapper/${ROOT_MAPPER_NAME}) rootflags=subvol=@$ROOT_NAME rw \"" >>/etc/dracut.conf
fi
if [ "$AUTO_DECRYPT" == "True" ]; then
echo "$ROOT_MAPPER_NAME UUID=$(/sbin/blkid -s UUID -o value ${BTRFS}) none" >/etc/crypttab
decryptBoot "${BTRFS}"
else
echo "$ROOT_MAPPER_NAME UUID=$(/sbin/blkid -s UUID -o value ${BTRFS}) none luks" >/etc/crypttab
fi
mkdir -p /boot/$MACHINE_ID/$KERNEL_VERSION
plymouth-set-default-theme solar
dracut --regenerate-all -f
echo "MachineID=$MACHINE_ID"
echo "KERNEL IS $KERNEL"
echo "Root_Name=$ROOT_NAME"
echo "BTRFS=$BTRFS"
echo "UEFI Kernel: $KERNEL_VERSION"
echo "default $MACHINE_ID" >/boot/loader/loader.conf
echo "timeout 1" >>/boot/loader/loader.conf
#Generate Previous Boot Entry
echo "title Previous" >$PREVIOUS_LOADER_FILE
echo "version $KERNEL_VERSION" >>$PREVIOUS_LOADER_FILE
if [[ $SWAP_CHOICE = *y* ]]; then
echo "options resume=UUID=$(/sbin/blkid -s UUID -o value ${SWAP}) mitigations=off rd.luks.key=/boot/keyfile.key:UUID=$(/sbin/blkid -s UUID -o value ${EFI}) rd.luks.uuid=$(/sbin/blkid -s UUID -o value ${BTRFS}) root=UUID=$(/sbin/blkid -s UUID -o value /dev/mapper/${ROOT_MAPPER_NAME}) rootflags=subvol=@.snapshots/previous rw " >>$PREVIOUS_LOADER_FILE
else
echo "options mitigations=off rd.luks.uuid=$(/sbin/blkid -s UUID -o value ${BTRFS}) root=UUID=$(/sbin/blkid -s UUID -o value /dev/mapper/${ROOT_MAPPER_NAME}) rootflags=subvol=@previous rw " >>$PREVIOUS_LOADER_FILE
fi
echo "machine-id $MACHINE_ID" >>$PREVIOUS_LOADER_FILE
echo "linux /$KERNEL" >>$PREVIOUS_LOADER_FILE
echo "initrd /$MACHINE_ID/$KERNEL_VERSION/initrd" >>$PREVIOUS_LOADER_FILE
#Generate Main Boot Entry
echo "title Current" >$LOADER_FILE
echo "version $KERNEL_VERSION" >>$LOADER_FILE
if [[ $SWAP_CHOICE = *y* ]]; then
echo "options resume=UUID=$(/sbin/blkid -s UUID -o value ${SWAP}) mitigations=off rd.luks.key=/boot/keyfile.key:UUID=$(/sbin/blkid -s UUID -o value ${EFI}) rd.luks.uuid=$(/sbin/blkid -s UUID -o value ${BTRFS}) root=UUID=$(/sbin/blkid -s UUID -o value /dev/mapper/${ROOT_MAPPER_NAME}) rootflags=subvol=@${ROOT_NAME} rw " >>$LOADER_FILE
else
echo "options mitigations=off rd.luks.uuid=$(/sbin/blkid -s UUID -o value ${BTRFS}) rd.luks.key=/boot/keyfile.key:UUID=$(/sbin/blkid -s UUID -o value ${EFI}) root=UUID=$(/sbin/blkid -s UUID -o value /dev/mapper/${ROOT_MAPPER_NAME}) rootflags=subvol=@${ROOT_NAME} rw " >>$LOADER_FILE
fi
echo "machine-id $MACHINE_ID" >>$LOADER_FILE
echo "linux /$KERNEL" >>$LOADER_FILE
echo "initrd /$MACHINE_ID/$KERNEL_VERSION/initrd" >>$LOADER_FILE
bootctl set-default $MACHINE_ID-$KERNEL_VERSION.conf
#bootctl list
}
compile-kernel() {
cd /usr/src
eselect kernel set 1
cd /usr/src/linux
if [ -f "/usr/src/linux/.config" ]; then
make oldconfig
else
make allyesconfig
fi
time make -j$(cat /proc/cpuinfo | grep -i processor | grep -vi 'model' | wc -l)
time make -j$(cat /proc/cpuinfo | grep -i processor | grep -vi 'model' | wc -l) modules_install
time make install
}
if [ "$1" = "desktop" ]; then
desktop
elif [ "$1" = "tar" ]; then
osSnapshots "$3" "$2"
elif [ "$1" = "upgrade-system" ]; then
upgrade-system
elif [ "$1" = "fstab" ]; then
setDevices
export TARGET=/
fstab
elif [ "$1" = "wifi" ]; then
wifi
elif [ "$1" = "accounts" ]; then
accounts
elif [ "$1" = "hibernate" ]; then
hibernateSetup
elif [ "$1" = "flatpaks" ]; then
flatpaks
elif [ "$1" = "bootloader" ]; then
setDevices
partitionDetection
bootloader
elif [ "$1" = "snapshot" ]; then
snapshots
elif [ "$1" = "steam" ]; then
installSteam
elif [ "$1" = "install-packages" ]; then
installPackages
elif [ "$1" = "btrfs-tweaks" ]; then
btrfsTweaks
elif [ "$1" = "compile-kernel" ]; then
compile-kernel
elif [ "$1" = "remove-snapshot" ]; then
remove-snapshots
elif [ "$1" = "help" ]; then
show-help
else
menu
fi