- Start a surrogate instance with an aditional "target" volume
- run bootstrap commands
- shutdown
- make an image from target volume
UBUNTU=resolute
UBUNTU_COMPONENTS=main,universe
PKGS=(
systemd
systemd-boot
systemd-boot-efi
systemd-ukify
systemd-resolved
systemd-timesyncd
systemd-sysv
systemd-cron
systemd-container
systemd-repart
initramfs-tools
linux-image-virtual
dbus-broker
iproute2
openssh-server
less
vim
bash-completion
)
sfdisk /dev/sdb <<EOF
label: gpt
size=512M, type=uefi
size=+, type="linux root (x86-64)"
EOF
mkfs.vfat -n ESP /dev/sdb1
mkfs.ext4 -L ROOT /dev/sdb2
mount --mkdir /dev/sdb2 /mnt/
mount --mkdir /dev/sdb1 /mnt/efi/
uki
mkdir -p /mnt/etc/kernel/
cat <<EOF > /mnt/etc/kernel/install.conf
layout=uki
BOOT_ROOT=/efi
EOF
fstab and kernel command line
# fixed sda1, sda2 until systemd-gpt-auto-generator works
echo 'root=LABEL=ROOT rw console=tty1 console=ttyS0' > /mnt/etc/kernel/cmdline
echo 'LABEL=ESP /efi vfat umask=0077,rw,nodev,nosuid,noexec,nosymfollow 0 0' >> /mnt/etc/fstab
network
mkdir -p /mnt/etc/systemd/network/
cat <<EOF > /mnt/etc/systemd/network/ens2.network
[Match]
Name=ens2
[Network]
DHCP=yes
EOF
repart
mkdir -p /mnt/etc/repart.d/
cat <<EOF > /mnt/etc/repart.d/root.conf
[Partition]
Type=root
GrowFileSystem=true
EOF
# concat array with commas (,)
IFS=","
debootstrap --variant minbase --merged-usr \
--include="${PKGS[*]}" \
--components=$UBUNTU_COMPONENTS \
$UBUNTU /mnt/
chroot /mnt
mount -t proc proc /proc
mount -t sysfs sysfs /sys
mount -t devtmpfs udev /dev
bootctl install --no-variables
dpkg-reconfigure linux-image-6.19.0-6-generic
systemctl --root=/mnt enable systemd-networkd
chroot /mnt apt clean
rm /mnt/etc/machine-id
passwd -R /mnt root
cp .ssh/authorized_keys /mnt/root/.ssh/
umount -R /mnt
poweroff
TODO: