forked from Deuxfleurs/infrastructure
140 lines
4.3 KiB
Bash
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"
|