From c42abbd0f192a5d4a6a58fd901f45d2c06b018b5 Mon Sep 17 00:00:00 2001 From: davidovski Date: Sun, 15 Jan 2023 21:24:17 +0000 Subject: Add installer to iso --- iso/install.sh | 139 ++++++++++++++++++++++ iso/mkiso.sh | 93 +++++++++++++++ iso/root/.profile | 9 ++ iso/root/installer.sh | 313 ++++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 554 insertions(+) create mode 100755 iso/install.sh create mode 100755 iso/mkiso.sh create mode 100644 iso/root/.profile create mode 100755 iso/root/installer.sh (limited to 'iso') diff --git a/iso/install.sh b/iso/install.sh new file mode 100755 index 0000000..89ee11b --- /dev/null +++ b/iso/install.sh @@ -0,0 +1,139 @@ +#!/bin/sh + +default_packages="base linux-libre xipkg dracut grub bash" +additional_packages="doas neofetch vim networkmanager" +default_key="davidovski https://xi.davidovski.xyz/keychain/xi.pub" + +XIPKG="/usr/bin/xi" +XIFLAGS="-ylu" +TMPDIR=/tmp +SYSROOT=$1 + +umask 0022 + +[ ! -e $XIPKG ] && { + git clone https://xi.davidovski.xyz/git/xiutils.git $TMPDIR/xiutils + make && make install + + git clone https://xi.davidovski.xyz/git/xipkg.git $TMPDIR/xipkg + make && make install +} + +echo "Please make sure that you have correctly formatted any partitions and mounted them as desired under $SYSROOT" + +[ $# -eq 0 ] && echo "Please specify where you would like to instal the system" && exit 1 + +[ -e $SYSROOT ] && { + printf "Remove existing system at $SYSROOT? [Y/n] " + read response + [ "$response" != "n" ] && rm -rf $SYSROOT && echo "removed $SYSROOT" +} + +$XIPKG $XIFLAGS sync +mkdir -p $SYSROOT +$XIPKG $XIFLAGS -r $SYSROOT bootstrap +mkdir -p $SYSROOT +$XIPKG $XIFLAGS -r $SYSROOT install $default_packages +$XIPKG $XIFLAGS -r $SYSROOT keyimport $default_key + +configuring_users () { + echo "Setting root password: " + xichroot $SYSROOT passwd + + echo + echo "Creating user" + read -p "Enter username: " username + xichroot $SYSROOT useradd -s /bin/bash -m $username + xichroot $SYSROOT passwd $username +} + +configuring_system () { + read -p "Enter system hostname: " hostname + + echo $hostname > $SYSROOT/etc/hostname + + cat > $SYSROOT/etc/hosts << EOF +127.0.0.1 localhost +::1 localhost +127.0.1.1 $hostname.local $hostname +EOF +} + +configuring_nameservers () { + echo "Configuring nameservers..." + + cat > $SYSROOT/etc/resolv.conf << EOF +nameserver 80.80.80.80 +EOF +} + +generating_fstab () { + echo "Generating fstab..." + xichroot $SYSROOT genfstab -U / > $SYSROOT/etc/fstab +} + +building_initramfs () { + echo "Building initramfs..." + kernel_version=$(ls $SYSROOT/usr/lib/modules | tail -1) + xichroot $SYSROOT mkdir /var/tmp + xichroot $SYSROOT dracut --kver $kernel_version 2>$TMPDIR/dracut.log > $TMPDIR/dracut.log +} + +installing_bootloader () { + read -p "Install Grub? [y]" r + [ "$r" != "n" ] && { + opts="--target=x86_64-efi" + + xichroot $SYSROOT lsblk + read -p "Enter efi directory: " efi_part + opts="$opts --efi-directory=$efi_part" + + read -p "Removable system? [y]" r + [ "$r" != "n" ] && { + opts="$opts --removable" + } + + xichroot $SYSROOT grub-install $opts + xichroot $SYSROOT grub-mkconfig -o /boot/grub/grub.cfg + } +} + +fixing_permissions () { + xichroot $SYSROOT chmod 755 / + xichroot $SYSROOT chmod 755 /usr + xichroot $SYSROOT chmod 755 /usr/bin + xichroot $SYSROOT chmod 755 /usr/lib +} + +downloading_additional_packages () { + echo "Syncing repos..." + xichroot $SYSROOT xi sync + echo "Downloading additional packages..." + xi -r $SYSROOT $XIFLAGS install $additional_packages +} + +steps=" +configuring_nameservers +generating_fstab +building_initramfs +configuring_system +installing_bootloader +configuring_users +fixing_permissions +downloading_additional_packages +" + +len=$(echo "$steps" | wc -l) +i=0 + +echo "Press [return] to enter configuration" +read response + +for step in $steps; do + i=$((i+1)) + clear + hbar -t -T "$(echo $step | sed "s/_/ /g")" $i $len + $step +done + +echo "Installation finished!" diff --git a/iso/mkiso.sh b/iso/mkiso.sh new file mode 100755 index 0000000..925c52a --- /dev/null +++ b/iso/mkiso.sh @@ -0,0 +1,93 @@ +#!/bin/sh + +ISO_NAME="xilinux-$(date -u +%Y%m%d)" +ISO_LABEL="xilinux" +PUBLISHER="davidovski" +SYSLINUX_VER=6.04-pre1 + +XI_ARGS="" + +chroot=/tmp/chroot +isoroot=/tmp/iso +iso_pkgs="linux linux-firmware base dracut grub bash xipkg squashfs-tools lvm2 cryptsetup networkmanager stty xitui" + +create_basesystem () { + xi $XI_ARGS sync + xi $XI_ARGS -r "$chroot" bootstrap + xi $XI_ARGS -r "$chroot" install "$iso_pkgs" + + cat > $chroot/etc/resolv.conf << EOF +nameserver 80.80.80.80 +EOF + + hostname=xilinux + echo xilinux > $chroot/etc/hostname + + cat > $chroot/etc/hosts << EOF +127.0.0.1 localhost +::1 localhost +127.0.1.1 $hostname.local $hostname +EOF + + cp -r ./root $chroot/ + + cat > $chroot/etc/conf.d/agetty << EOF +agetty_options="--autologin root --noclear" +EOF + +} + +build_initramfs () { + kernel_version=$(ls $chroot/usr/lib/modules | tail -1) + mkdir -p "$chroot"/var/tmp + xichroot "$chroot" dracut --nomdadmconf --nolvmconf --xz --add dmsquash-live --add bash --add convertfs --add pollcdrom --force --kver $kernel_version +} + +create_isoroot() { + mkdir -p $isoroot/ + cp $chroot/boot/vmlinuz-** $isoroot/vmlinuz + cp $chroot/boot/initramfs-** $isoroot/initrd.img + + mkdir -p $isoroot/isolinux +} + +install_syslinux () { + curl https://mirrors.edge.kernel.org/pub/linux/utils/boot/syslinux/Testing/$(echo $SYSLINUX_VER | cut -d'-' -f1)/syslinux-$SYSLINUX_VER.tar.xz > syslinux-$SYSLINUX_VER.tar.xz + + tar -C /tmp -xf syslinux-$SYSLINUX_VER.tar.xz + #cp syslinux-$SYSLINUX_VER + cp /tmp/syslinux-$SYSLINUX_VER/bios/core/isolinux.bin $isoroot/isolinux/isolinux.bin + cp /tmp/syslinux-$SYSLINUX_VER/bios/com32/elflink/ldlinux/ldlinux.c32 $isoroot/isolinux/ldlinux.c32 +} + +build_iso () { + cat > $isoroot/isolinux/isolinux.cfg << EOF +default 1 + +label 1 + kernel /vmlinuz + append initrd=/initrd.img splash console=tty0 console=ttyS0,9600 root=live:CDLABEL=xilinux rd.live.dir=/ rd.live.squashimg=filesystem.squashfs rd.live.debug=1 quiet + +EOF + + mksquashfs $chroot $isoroot/filesystem.squashfs -noappend -no-progress -e "/proc/*" -e "/dev/*" -e "/sys/*" + genisoimage -r -V "$ISO_LABEL" -cache-inodes -J -l \ + -allow-limited-size -udf \ + -b isolinux/isolinux.bin -c isolinux/boot.cat \ + -no-emul-boot -boot-load-size 4 -boot-info-table \ + -p "$PUBLISHER " \ + -A "$ISO_LABEL" -o "$ISO_NAME.iso" $isoroot +} + + +[ "$#" = 0 ] && { + create_basesystem + build_initramfs + create_isoroot + install_syslinux + build_iso +} || { + for task in $*; do + $task + done +} diff --git a/iso/root/.profile b/iso/root/.profile new file mode 100644 index 0000000..a15c12b --- /dev/null +++ b/iso/root/.profile @@ -0,0 +1,9 @@ +splash () { + clear + echo "Welcome to xilinux" +} + +[ "$(fgconsole 2>/dev/null)" = "1" ] && exec $HOME/installer.sh + +splash + diff --git a/iso/root/installer.sh b/iso/root/installer.sh new file mode 100755 index 0000000..ed20bf9 --- /dev/null +++ b/iso/root/installer.sh @@ -0,0 +1,313 @@ +#!/bin/sh + +. /usr/lib/xitui.sh +. /usr/lib/glyphs.sh +. /usr/lib/colors.sh + +logfile="installer.log" +default_packages="base linux xipkg dracut grub mksh sudo neofetch vim tzdata" +additional_services="networkmanager xorg iwd" +list_disks () { + lsblk -r | while read -r line; do + set - $line + [ "$6" = "disk" ] && { + printf '"/dev/%s (%s)" ' $1 $4 + } + done +} + +list_partitions () { + ls $1* + echo "none" +} + +partition_disk () { + t_msg "Partitioning $1..." + export EFI_PART=$11 + export SYS_PART=$12 + export SWAP_PART=none + echo " + unit: sectors + sector-size: 512 + + type=ef, start=2048, size=210000 + type=83 + " | sfdisk $1 >$logfile && + t_msg "Partitioned $1!" +} + +welcome_splash () { + t_dialogue "Welcome to the xilinux installer" "" + +} + + +partition_disks () { + # need to use eval to work with spaces in line names + eval "t_radio 'Select install disk' $(list_disks)" + local selected=$(echo $T_RESULT | cut -d' ' -f1) + + t_yesno "${BLUE}Auto-partition $selected disk?\n${RED}(Warning: existing data will be overwritten)" && { + partition_disk $selected || return 1 + } || { + cfdisk $selected && { + t_radio 'Select primary system partition' $(list_partitions $selected) + export SYS_PART=$T_RESULT + + t_radio 'Select efi system partition' $(list_partitions $selected) + export EFI_PART=$T_RESULT + + t_radio 'Select swap partition' $(list_partitions $selected) + export SWAP_PART=$T_RESULT + } + } +} + +format_disks () { + t_msg "Formatting partitions... +${TABCHAR}System Partition +${TABCHAR}EFI Partition +" + + + [ -b "$SYS_PART" ] && mkfs.ext4 $SYS_PART > $logfile + t_msg "Formatting partitions... +${GREEN}${TABCHAR}System partition ${CHECKMARK} (ext4) +${TABCHAR}EFI Partition +" + + [ -b "$EFI_PART" ] && mkfs.fat -F 32 $EFI_PART > $logfile + t_msg "Formatting partitions... +${GREEN}${TABCHAR}System partition ${CHECKMARK} (ext4) +${GREEN}${TABCHAR}EFI Partition ${CHECKMARK} (fat32) +" + + [ -b "$SWAP_PART" ] && mkswap $SWAP_PART > $logfile + return 0 +} + +mount_disks () { + t_msg "Mounting disks..." + export sysroot=/xilinux.mnt + export efi_mntpoint=/xilinux.mnt/boot/efi + + [ ! -f "$sysroot" ] && mkdir -p $sysroot + + [ -b "$SYS_PART" ] && { + mount $SYS_PART $sysroot + } || { + t_prompt "${RED}No system partition is available!" + return 1 + } + + [ -b "$EFI_PART" ] && { + mkdir -p $efi_mntpoint + mount $EFI_PART $efi_mntpoint + } + + [ -b "$SWAP_PART" ] && swapon $SWAP_PART + return 0 +} + +bootstrap_system () { + t_msg "Creating directories..." + xi -vy -r $sysroot bootstrap >> $logfile +} + +install_base () { + t_msg "Installing packages..." + xi -vy -r $sysroot sync >> $logfile + xi -vy -r $sysroot install $default_packages >> $logfile +} + +copy_resolvconf () { + [ ! -d $sysroot/etc ] && mkdir $sysroot/etc + cp /etc/resolv.conf $sysroot/etc/resolv.conf +} + +sync_system () { + t_msg "Syncing system..." + xichroot $sysroot xi sync >> $logfile +} + +generate_fstab () { + t_msg "Generating fstab..." + xichroot $sysroot genfstab -U / > $sysroot/etc/fstab +} + +build_initramfs () { + t_msg "Build initramfs" + + kernel_version=$(ls $SYSROOT/usr/lib/modules | tail -1) + + mkdir -p $sysroot/var/tmp + xichroot $sysroot dracut --kver $kernel_version 2>&1 >> $logfile +} + +install_grub () { + t_yesno "Install grub?" && { + target="x86_64-efi" + opts="--target=$target --efi-directory=$efi_mntpoint" + + t_yesno "Install as removable system?" && opts="$opts --removable" + + t_msg "Installing grub for target $target..." + xichrooot $sysroot grub-install $opts >> $logfile + + t_msg "Creating grub configuration..." + xichrooot $sysroot grub-mkconfig -o /boot/grub/grub.cfg + } || return 0 +} + +enter_password () { + export password="" + t_input_hidden "Enter Password:" + passwd=$T_RESULT + t_input_hidden "Confirm Password:" + local cpasswd=$T_RESULT + + [ "$passwd" = "$cpasswd" ] || { + t_prompt "Passwords do not match!" + enter_password + } + +} + +configure_users () { + t_input_cmd "xichroot $sysroot passwd" "Enter root password" + + t_input "Enter username:" + local username=$T_RESULT + enter_password + + t_msg "Creating user..." + xichroot $sysroot useradd -s /bin/mksh -m $username + printf "$passwd\n$passwd\n" | xichroot $sysroot passwd $username + + t_yesno "Allow this user to use sudo?" && { + echo "$username ALL=(ALL:ALL) ALL" >> $sysroot/etc/sudoers + } + + t_yesno "Set a password for the root user?" && { + enter_password + printf "$passwd\n$passwd\n" | xichroot $sysroot passwd + } + + return 0 +} + +fix_permissions () { + xichroot $sysroot chmod 755 / + xichroot $sysroot chmod 755 /usr + xichroot $sysroot chmod 755 /usr/bin + xichroot $sysroot chmod 755 /usr/lib +} + +set_timezone () { + zoneinfo="$sysroot/usr/share/zoneinfo" + cp $zoneinfo/$1 $sysroot/etc/localtime + echo "$1" > /etc/timezone + + t_cls_ptrn + t_prompt "Successfully set timezone!" +} + +select_timezone () { + t_clean_ptrn + zoneinfo="$sysroot/usr/share/zoneinfo" + selection=$1 + t_paged_radio "Select your timezone: $selection" $(ls "$zoneinfo/$selection") "more..." + [] + selection="$selection/$T_RESULT" + + [ -f "$zoneinfo/$selection" ] && { + + t_yesno "Use $selection as your system timezone? " && { + set_timezone $selection + } || { + select_timezone + } + return 0 + } + + [ -d "$zoneinfo/$selection" ] && { + select_timezone $selection + } || { + t_prompt "The timezone you entered does not exist!" + select_timezone + } +} + +install_additional () { + t_check "Install and configure additional services: " $additional_services + local services=$T_RESULT + + for service in $services; do + service_$service + done +} + +service_networkmanager () { + t_msg "Installing NetworkManager..." + { + xi -ly -r $sysroot install networkmanager + xichroot $sysroot rc-update add networkmanager + } >> $logfile +} + +service_iwd () { + t_msg "Installing iwd..." + { + xi -ly -r $sysroot install iwd + xichroot $sysroot rc-update add iwd + } >> $logfile +} + +service_xorg () { + t_msg "Installing xorg..." + xi -r $sysroot install base-xorg base-fonts >> $logfile + t_check "Select video drivers:" $(xi search xd86-video- | cut -f2 -d/) + [ "${#T_RESULT}" != "0" ] && xi -r $sysroot install $T_RESULT + t_prompt "Installed basic xorg functionality +TODO: preconfigured window managers, for now you need to configure them yourself" +} + + +umount_disks () { + umount -R $sysroot + [ -b "$SWAP_PART" ] && swapoff $SWAP_PART + return 0 +} + +t_init +t_no_cur +checkroot + +steps="welcome_splash +partition_disks +format_disks +mount_disks +bootstrap_system +install_base +copy_resolvconf +sync_system +generate_fstab +build_initramfs +configure_users +fix_permissions +select_timezone +install_additional +umount_disks +" + +for step in $steps; do + t_cls_ptrn + $step 2>> $logfile || { + t_prompt "${RED}An error occured!" + t_clean + exit 1 + } +done +t_prompt "Completed install!" + +t_clean -- cgit v1.2.1