This repository has been archived on 2023-03-15. You can view files and clone it, but cannot push or open issues or pull requests.
infrastructure/bootstrap/build-installer.sh

140 lines
4.3 KiB
Bash

#!/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"