diff options
Diffstat (limited to 'bootstrap')
-rw-r--r-- | bootstrap/README.md | 1 | ||||
-rw-r--r-- | bootstrap/build-installer.sh | 139 |
2 files changed, 140 insertions, 0 deletions
diff --git a/bootstrap/README.md b/bootstrap/README.md new file mode 100644 index 0000000..c96ae5a --- /dev/null +++ b/bootstrap/README.md @@ -0,0 +1 @@ +sudo dnf install smartmontools diff --git a/bootstrap/build-installer.sh b/bootstrap/build-installer.sh new file mode 100644 index 0000000..7ede0c4 --- /dev/null +++ b/bootstrap/build-installer.sh @@ -0,0 +1,139 @@ +#!/bin/bash + +set -e # Exit on error + +DEVICE=$1 + +[[ -z "${DEVICE}" ]] && echo "Usage $0 /dev/sdX" && exit 1 + +udevadm info -n ${DEVICE} -q property +echo "Selected device is ${DEVICE}" +read -p "[Press enter to continue or CTRL+C to stop]" + +echo "Umount ${DEVICE}" +umount ${DEVICE}* || true + +echo "Set partition table to GPT (UEFI)" +parted ${DEVICE} --script mktable gpt + +echo "Create EFI partition" +parted ${DEVICE} --script mkpart EFI fat16 1MiB 10MiB +parted ${DEVICE} --script set 1 msftdata on + +echo "Create OS partition" +parted ${DEVICE} --script mkpart LINUX btrfs 10MiB 4GiB + +echo "Format partitions" +mkfs.vfat -n EFI ${DEVICE}1 +mkfs.btrfs -f -L LINUX ${DEVICE}2 + +ROOTFS_UUID=$(btrfs filesystem show ${DEVICE}2 | grep -Po "uuid: [a-f0-9-]+"|cut -c 7-44) +if [[ -z ${ROOTFS_UUID} ]]; then +echo "Rootfs UUID is <<${ROOTFS_UUID}>>" +echo "WARNING! BUG! The UUID is not set in the fstab. Either because this command failed (empty UUID above) or because of chroot scoping. Please fix it." +echo "Your OS will still be able to boot normally and remount the filesystem as RW but it could crash some apps like fsck" +read -p "[Press enter to continue or CTRL+C to stop]" +fi + +echo "Mount OS partition" +ROOTFS="/tmp/installing-rootfs" +mkdir -p ${ROOTFS} +mount ${DEVICE}2 ${ROOTFS} + +echo "Debootstrap system" +debootstrap --variant=minbase --arch amd64 buster ${ROOTFS} http://deb.debian.org/debian/ + +echo "Mount EFI partition" +mkdir -p ${ROOTFS}/boot/efi +mount ${DEVICE}1 ${ROOTFS}/boot/efi + +echo "Get ready for chroot" +mount --bind /dev ${ROOTFS}/dev +mount -t devpts /dev/pts ${ROOTFS}/dev/pts +mount -t proc proc ${ROOTFS}/proc +mount -t sysfs sysfs ${ROOTFS}/sys +mount -t tmpfs tmpfs ${ROOTFS}/tmp + +echo "Entering chroot, installing Linux kernel and Grub" +cat << EOF | chroot ${ROOTFS} + set -e + export HOME=/root + export PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/sbin + export DEBIAN_FRONTEND=noninteractive + debconf-set-selections <<< "grub-efi-amd64 grub2/update_nvram boolean false" + apt-get remove -y grub-efi grub-efi-amd64 + apt-get update + apt-get install -y linux-image-generic linux-headers-generic grub-efi + grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=debian --recheck --no-nvram --removable + update-grub +EOF + +echo "Install script based on dd" +cat << 'EOF' > ${ROOTFS}/usr/local/sbin/os-install + #!/bin/bash + + set -e + + SOURCE=$1 + TARGET=$2 + # We write partitions until 4GiB = 4 * 1024^3 (https://en.wikipedia.org/wiki/Gibibyte) + # In dd, M means 1048576 bytes = 1024^2 (man dd) + # So we need to copy (4 * 1024^3) / (4 * 1024^2) = 0.5 * 1024 = 1024 blocks + dd if=${SOURCE} of=${TARGET} bs=4M status=progress count=1030 + growpart ${TARGET} 2 + mount ${TARGET}2 /mnt + btrfs filesystem resize max /mnt + umount /mnt + echo "you might want to run: btrfstune -u ${TARGET}2 but you will need to update the fstab" + echo "you might want to change systemd machine UUID" + echo "you might want to change /etc/systemd/network/en.network configuration" +EOF + +chmod +x ${ROOTFS}/usr/local/sbin/os-install + +echo "Entering chroot (bis), installing daemon" +cat << EOF | chroot ${ROOTFS} + set -e + export HOME=/root + export PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/sbin + export DEBIAN_FRONTEND=noninteractive + + # Set fstab + echo "UUID=${ROOTFS_UUID} / btrfs defaults 0 0" > /etc/fstab + + # Install systemd and OpenSSH + apt-get update + apt-get install -y systemd openssh-server sudo btrfs-tools cloud-utils python + systemctl enable ssh + + # Enable systemd services + systemctl enable systemd-networkd systemd-timesyncd systemd-resolved + + # Listen on any ethernet interface for DHCP + tee /etc/systemd/network/en.network << EOG +[Match] +Name=en* + +[Network] +DHCP=ipv4 +EOG + + # Add SSH keys + mkdir -p /root/.ssh + tee /root/.ssh/authorized_keys << EOG +ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDT1+H08FdUSvdPpPKdcafq4+JRHvFVjfvG5Id97LAoROmFRUb/ZOMTLdNuD7FqvW0Da5CPxIMr8ZxfrFLtpGyuG7qdI030iIRZPlKpBh37epZHaV+l9F4ZwJQMIBO9cuyLPXgsyvM/s7tDtrdK1k7JTf2EVvoirrjSzBaMhAnhi7//to8zvujDtgDZzy6aby75bAaDetlYPBq2brWehtrf9yDDG9WAMYJqp//scje/WmhbRR6eSdim1HaUcWk5+4ZPt8sQJcy8iWxQ4jtgjqTvMOe5v8ZPkxJNBine/ZKoJsv7FzKem00xEH7opzktaGukyEqH0VwOwKhmBiqsX2yN quentin@dufour.io +EOG + + echo "Done" +EOF + +echo "Unmounting filesystems" +umount ${ROOTFS}/dev/pts +umount ${ROOTFS}/dev +umount ${ROOTFS}/proc +umount ${ROOTFS}/sys +umount ${ROOTFS}/tmp +umount ${ROOTFS}/boot/efi +umount ${ROOTFS} + +echo "Done" |