diff --git a/elf_os.sh b/elf_os.sh index 2375fa4..fad78a7 100755 --- a/elf_os.sh +++ b/elf_os.sh @@ -4,6 +4,16 @@ SCRIPT_DIR="$(cd "$(dirname "$BASH_SOURCE[0]")" && pwd)" . "$1" +ROOT_PARTITION_MAP="" +ROOT_PARTITION_MAP_NAME="" +if [[ $ENCRYPT_DISK = "true" ]] +then + ROOT_PARTITION_MAP="/dev/mapper/cryptelfroot" + ROOT_PARTITION_MAP_NAME="cryptelfroot" +else + ROOT_PARTITION_MAP="${ROOT_PARTITION}" +fi + function run(){ echo "[ ] $1" echo "# $1" >>install.log @@ -32,205 +42,319 @@ function run-chroot(){ echo >>install.log } +function preperations() { + echo + echo === preperations + echo + + run "install git" "pacman -Sy --noconfirm git" + run "enable ntp" "timedatectl set-ntp true" + run "set timezone" "timedatectl set-timezone Europe/Amsterdam" +} + +function format_disk() { + echo + echo === format disk + echo + + run "applly partion table" "sfdisk $DISK <$SFDISK_FILE" + run "format boot partition" "mkfs.fat -F 32 ${UEFI_PARTITION}" + run "format swap partition" "mkswap ${SWAP_PARTITION}" + if [[ $ENCRYPT_DISK = "true" ]]; then + echo -n "$PASS" >keyfile.luks + run "encrypt root partition" "cryptsetup luksFormat --batch-mode --key-file keyfile.luks ${ROOT_PARTITION}" "rm keyfile.luks" + run "map root partitaion" "cryptsetup open --batch-mode --key-file keyfile.luks ${ROOT_PARTITION} ${ROOT_PARTITION_MAP_NAME}" "rm keyfile.luks" + rm keyfile.luks + run "format root partition" "mkfs.btrfs ${ROOT_PARTITION_MAP}" + else + run "format root partition" "mkfs.btrfs ${ROOT_PARTITION}" + fi + + run "mount root partition" "mount ${ROOT_PARTITION_MAP} /mnt" + run "create root btrfs subvolume" "btrfs subvolume create /mnt/@elfRoot_a" + run "create root btrfs subvolume" "btrfs subvolume create /mnt/@elfRoot_b" + run "create home btrfs subvolume" "btrfs subvolume create /mnt/@home" + run "create home btrfs subvolume" "btrfs subvolume create /mnt/@var" + run "unmount btrfs" "umount /mnt" + if [[ $ENCRYPT_DISK = "true" ]]; then + run "unmap root partitaion" "cryptsetup close ${ROOT_PARTITION_MAP_NAME}" + fi +} + +function mount_disk() { + subvol="@elfRoot_$1" + echo + echo === mount disk with subvol $1 + echo + + if [[ $ENCRYPT_DISK = "true" ]]; then + run "map root partitaion" "cryptsetup open --batch-mode --key-file keyfile.luks ${ROOT_PARTITION} ${ROOT_PARTITION_MAP_NAME}" + fi + run "mount root subvolume" "mount -o subvol=$subvol ${ROOT_PARTITION_MAP} /mnt" + run "mount home subvolume" "mount --mkdir -o subvol=@home ${ROOT_PARTITION_MAP} /mnt/home" + run "mount home subvolume" "mount --mkdir -o subvol=@var ${ROOT_PARTITION_MAP} /mnt/var" + run "mount boot partition" "mount --mkdir ${UEFI_PARTITION} /mnt/boot" + run "enable swap" "swapon ${SWAP_PARTITION}" +} + +function umount_disk() { + echo + echo === mount disk + echo + + run "mount root subvolume" "umount -R /mnt" + run "unmap root partitaion" "cryptsetup close ${ROOT_PARTITION_MAP_NAME}" + run "enable swap" "swapoff ${SWAP_PARTITION}" +} + +function install_base() { + echo + echo === install arch + echo + + run "install base of arch" "pacstrap /mnt base linux linux-firmware" + run "intall utitlities" "pacstrap /mnt btrfs-progs man vim sudo" + run "intall networkmanager" "pacstrap /mnt networkmanager" + run "generate fstab" "genfstab -U /mnt >>/mnt/etc/fstab" +} + +function set_locals() { + echo + echo === set locals + echo + + run-chroot "set timezone" "ln -sf /usr/share/zoneinfo/Europe/Amsterdam /etc/localtime" + run-chroot "set hwclock to UTC" "hwclock --systohc" + run-chroot "update locals.gen" "sed --in-place -E -e 's/^#?en_GB.UTF-8/en_GB.UTF-8/' -e 's/^#?en_US.UTF-8/en_US.UTF-8/' /etc/locale.gen" + run-chroot "generate locals" "locale-gen" + run-chroot "config locals" "echo \"LANG=en_GB.UTF-8\" >/etc/locale.conf" + run-chroot "set hostname" "echo \"$HOSTNAME\" >/etc/hostname" + run-chroot "create hosts file" "cat >/etc/hosts </boot/loader/entries/elfA.conf </boot/loader/entries/elfB.conf </boot/loader/loader.conf <>/etc/sudoers" + run "clone keys repo" "git clone https://gitea.finnvanreenen.nl/LailaTheElf/keys.git /mnt/opt/keys" + run-chroot "create authoized keys" "cd /opt/keys/ssh && cat ${USER_SSH_KEYS} > /home/${USERNAME}/.ssh/authorized_keys" +} + +function miscellaneous() { + echo + echo === miscellaneous + echo + + run "set udev rules" "cp $SCRIPT_DIR/configs/udev/*.rules /mnt/etc/udev.d/rules/" +} + +function prepair_firt_boot() { + echo + echo === prepair first boot + echo + + run "copy config files" "cp -r $SCRIPT_DIR/configs /mnt/opt/elfOS_configFiles" + run "copy fist boot script" "cp $SCRIPT_DIR/first-boot.sh /mnt/first-boot.sh && chmod 700 /mnt/first-boot.sh" + run "make script executable" "cp $SCRIPT_DIR/first-boot.sh /mnt/first-boot.sh" + run "create fist boot config" "cat >/mnt/first-boot.env </mnt/etc/systemd/system/first_boot.service <install.log -if [[ $ENCRYPT_DISK = "true" ]] -then +case $2 in + install) + if [[ $ENCRYPT_DISK = "true" ]] + then + echo -n "disk encryption password: " + read -s PASS + echo + echo -n "retype password: " + read -s PASSRE + echo + if [ "$PASS" != "$PASSRE" ]; then + echo "password do not match" + exit 1 + fi + fi -echo -n "disk encryption password: " -read -s PASS -echo -echo -n "retype password: " -read -s PASSRE -echo -if [ "$PASS" != "$PASSRE" ]; then - echo "password do not match" - exit 1 -fi + echo -n "password for $USERNAME: " + read -s PASS_USER + echo + echo -n "retype password: " + read -s PASSRE_USER + echo -fi + if [ "$PASS_USER" != "$PASSRE_USER" ]; then + echo "password do not match" + exit 2 + fi -echo -n "password for $USERNAME: " -read -s PASS_USER -echo -echo -n "retype password: " -read -s PASSRE_USER -echo + echo -n "are you sure you want to format ${DISK} (y/N): " + read -s confirm + echo + if [ "$confirm" != "y" ]; then + echo "exit" + exit 2 + fi -if [ "$PASS_USER" != "$PASSRE_USER" ]; then - echo "password do not match" - exit 2 -fi -echo + preperations + format_disk + mount_disk a + install_base + set_locals + install_bootloader + create_user + miscellaneous + prepair_firt_boot + umount_disk + copy_a_to_b + ;; + reinstall_*) + if [[ $ENCRYPT_DISK = "true" ]]; then + echo -n "disk encryption password: " + read -s PASS + echo + fi + + echo -n "password for $USERNAME: " + read -s PASS_USER + echo + echo -n "retype password: " + read -s PASSRE_USER + echo + if [ "$PASS_USER" != "$PASSRE_USER" ]; then + echo "password do not match" + exit 2 + fi + echo + + preperations + if [[ "$2" = "reinstall_a"]]; then + mount_disk a + else + mount_disk b + fi + install_base + set_locals + install_bootloader + create_user + miscellaneous + prepair_firt_boot + umount_disk + ;; + bootloader) + if [[ $ENCRYPT_DISK = "true" ]]; then + echo -n "disk encryption password: " + read -s PASS + echo + fi + + preperations + mount_disk a + install_bootloader + umount_disk + ;; + *) + echo "$0 " + echo + echo "action:" + echo " install: install the full os" + echo " reinstall_a: re install os on system A" + echo " reinstall_b: re install os on system B" + echo " bootloader: re setup the bootloader" + ;; +esac echo -echo === setup localisation +echo === reboot echo -run "install git" "pacman -Sy --noconfirm git" -run "enable ntp" "timedatectl set-ntp true" -run "set timezone" "timedatectl set-timezone Europe/Amsterdam" - -echo -echo === setup partitions -echo - -run "applly partion table" "sfdisk $DISK <$SFDISK_FILE" -run "format boot partition" "mkfs.fat -F 32 ${UEFI_PARTITION}" -run "format swap partition" "mkswap ${SWAP_PARTITION}" -ROOT_PARTITION_MAP="" -if [[ $ENCRYPT_DISK = "true" ]] -then -ROOT_PARTITION_MAP="/dev/mapper/cryptelfroot" -ROOT_PARTITION_MAP_NAME="cryptelfroot" -echo -n "$PASS" >keyfile.luks -run "encrypt root partition" "cryptsetup luksFormat --batch-mode --key-file keyfile.luks ${ROOT_PARTITION}" "rm keyfile.luks" -run "map root partitaion" "cryptsetup open --batch-mode --key-file keyfile.luks ${ROOT_PARTITION} ${ROOT_PARTITION_MAP_NAME}" "rm keyfile.luks" -rm keyfile.luks -run "format root partition" "mkfs.btrfs ${ROOT_PARTITION_MAP}" -else -ROOT_PARTITION_MAP="${ROOT_PARTITION}" -run "format root partition" "mkfs.btrfs ${ROOT_PARTITION}" -fi - -run "mount root partition" "mount ${ROOT_PARTITION_MAP} /mnt" -run "create root btrfs subvolume" "btrfs subvolume create /mnt/@elfRoot_a" -run "create root btrfs subvolume" "btrfs subvolume create /mnt/@elfRoot_b" -run "create home btrfs subvolume" "btrfs subvolume create /mnt/@home" -run "create home btrfs subvolume" "btrfs subvolume create /mnt/@var" -run "unmount btrfs" "umount /mnt" -run "mount root subvolume" "mount -o subvol=@elfRoot_a ${ROOT_PARTITION_MAP} /mnt" -run "mount home subvolume" "mount --mkdir -o subvol=@home ${ROOT_PARTITION_MAP} /mnt/home" -run "mount home subvolume" "mount --mkdir -o subvol=@var ${ROOT_PARTITION_MAP} /mnt/var" -run "mount boot partition" "mount --mkdir ${UEFI_PARTITION} /mnt/boot" -run "enable swap" "swapon ${SWAP_PARTITION}" - -echo -echo === install arch -echo - -run "install base of arch" "pacstrap /mnt base linux linux-firmware" -run "intall utitlities" "pacstrap /mnt btrfs-progs man vim sudo" -run "intall networkmanager" "pacstrap /mnt networkmanager" -run "generate fstab" "genfstab -U /mnt >>/mnt/etc/fstab" - -echo -echo === set locals -echo - -run-chroot "set timezone" "ln -sf /usr/share/zoneinfo/Europe/Amsterdam /etc/localtime" -run-chroot "set hwclock to UTC" "hwclock --systohc" -run-chroot "update locals.gen" "sed --in-place -E -e 's/^#?en_GB.UTF-8/en_GB.UTF-8/' -e 's/^#?en_US.UTF-8/en_US.UTF-8/' /etc/locale.gen" -run-chroot "generate locals" "locale-gen" -run-chroot "config locals" "echo \"LANG=en_GB.UTF-8\" >/etc/locale.conf" -run-chroot "set hostname" "echo \"$HOSTNAME\" >/etc/hostname" -run-chroot "create hosts file" "cat >/etc/hosts </boot/loader/entries/elfA.conf </boot/loader/entries/elfB.conf </boot/loader/loader.conf <>/etc/sudoers" -run "clone keys repo" "git clone https://gitea.finnvanreenen.nl/LailaTheElf/keys.git /mnt/opt/keys" -run-chroot "create authoized keys" "cd /opt/keys/ssh && cat ${USER_SSH_KEYS} > /home/${USERNAME}/.ssh/authorized_keys" - -echo -echo === miscellaneous -echo - -run "set udev rules" "cp $SCRIPT_DIR/configs/udev/*.rules /mnt/etc/udev.d/rules/" - -echo -echo === prepair first boot -echo - -run "copy config files" "cp -r $SCRIPT_DIR/configs /mnt/opt/elfOS_configFiles" -run "copy fist boot script" "cp $SCRIPT_DIR/first-boot.sh /mnt/first-boot.sh && chmod 700 /mnt/first-boot.sh" -run "make script executable" "cp $SCRIPT_DIR/first-boot.sh /mnt/first-boot.sh" -run "create fist boot config" "cat >/mnt/first-boot.env </mnt/etc/systemd/system/first_boot.service <