After= was placed in [Service], which systemd ignores ('Unknown key
After'), so the interfaces.d merge + ifreload raced networking.service
on every boot. On losing boots vmbr0 never ran DHCP and the proxmox
guest came up without its LAN IP (bridging still worked, so inner VMs
stayed reachable while the PVE host itself was not).
Move After= to [Unit] ordering against networking.service, and mkdir
/run/network in ExecStartPre: the image-build workaround for
ifupdown2#276 doesn't survive boots since /run is tmpfs.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
134 lines
5.2 KiB
Nix
134 lines
5.2 KiB
Nix
# ready to use customization templates to apply on images
|
|
{ pkgs, lib, system, linux, ... }:
|
|
with linux;
|
|
with scriptsNFiles;
|
|
{
|
|
# essential functionalities like ssh, networking etc
|
|
essentials = {
|
|
impure = true;
|
|
install = [ "htop" "openssh-server" "inetutils-ping" "dnsutils" "cloud-guest-utils" "qemu-guest-agent" ];
|
|
commands = ''
|
|
upload ${grub-ifnames-0}:/etc/default/grub.d/90-ifnames-0.cfg
|
|
upload ${grub-disable-microcode}:/etc/default/grub.d/00-disable-microcode.cfg
|
|
run-command mountpoint -q /boot/efi || mount /boot/efi
|
|
run-command update-grub
|
|
upload ${dhcp-network-for-iface { iface = "eth0"; }}:/etc/systemd/network/00-eth0-dhcp.network
|
|
run ${ssh-service-override-conf-create}
|
|
upload ${grow-root-sh}:/usr/local/sbin/grow-root.sh
|
|
upload ${grow-root-service}:/etc/systemd/system/grow-root.service
|
|
run-command systemctl enable grow-root.service
|
|
truncate /etc/machine-id
|
|
delete /var/lib/dbus/machine-id
|
|
'';
|
|
};
|
|
|
|
# set easy root access
|
|
rooted = {
|
|
impure = true;
|
|
install = [ "openssh-server" ];
|
|
commands = ''
|
|
run ${ssh-service-override-conf-create}
|
|
'';
|
|
run = ''
|
|
# set root password and ssh access
|
|
echo "root:root" | chpasswd
|
|
sed -i '/PasswordAuthentication no/d' "/etc/ssh/sshd_config"
|
|
echo "PasswordAuthentication yes\nPermitRootLogin yes" >> "/etc/ssh/sshd_config"
|
|
'';
|
|
};
|
|
|
|
# install proxmox
|
|
proxmoxOnDebian12 = {
|
|
impure = true;
|
|
diskSize = "+3G";
|
|
smp = 4;
|
|
memSize = 4096;
|
|
install = [ "cloud-guest-utils" ];
|
|
debug = true;
|
|
commands =
|
|
let
|
|
# proxmox makes it very hard to manually add interfaces directly on /etc/network/interfaces while the pve services are not running
|
|
# it also doesn't pick up files in interfaces.d
|
|
# so manually do that via service after boot
|
|
# After= must live in [Unit] — in [Service] systemd ignores it, leaving the
|
|
# merge/ifreload racing networking.service (and ifreload fails outright if it
|
|
# runs before /run/network exists, see ifupdown2#276).
|
|
mergeNetIfacesDService = pkgs.writeText "manual-net-ifaces.d.service" ''
|
|
[Unit]
|
|
After = networking.service
|
|
Wants = networking.service
|
|
|
|
[Service]
|
|
Type = oneshot
|
|
ExecStartPre = /bin/mkdir -p /run/network
|
|
ExecStart = /bin/bash -c "cat /etc/network/interfaces.d/* >> /etc/network/interfaces; rm /etc/network/interfaces.d/*; ifreload -a;"
|
|
|
|
[Install]
|
|
WantedBy = multi-user.target
|
|
'';
|
|
in
|
|
''
|
|
upload ${grub-ifnames-0}:/etc/default/grub.d/90-ifnames-0.cfg
|
|
upload ${grub-disable-microcode}:/etc/default/grub.d/00-disable-microcode.cfg
|
|
|
|
truncate /etc/machine-id
|
|
delete /var/lib/dbus/machine-id
|
|
|
|
upload ${grow-root-sh}:/usr/local/sbin/grow-root.sh
|
|
upload ${grow-root-service}:/etc/systemd/system/grow-root.service
|
|
run-command systemctl enable grow-root.service
|
|
|
|
upload ${mergeNetIfacesDService}:/etc/systemd/system/manual-net-ifaces.d.service
|
|
run-command systemctl enable manual-net-ifaces.d.service
|
|
'';
|
|
run = ''
|
|
# script originally taken and modified from https://pve.proxmox.com/wiki/Install_Proxmox_VE_on_Debian_12_Bookworm
|
|
# exit if error
|
|
set -e
|
|
|
|
# grow root partition
|
|
/usr/local/sbin/grow-root.sh
|
|
|
|
# mount efi for grub changes
|
|
mount /boot/efi || true
|
|
|
|
# add proxmox repo
|
|
echo "deb [arch=amd64] http://download.proxmox.com/debian/pve bookworm pve-no-subscription" > /etc/apt/sources.list.d/pve-install-repo.list
|
|
wget https://enterprise.proxmox.com/debian/proxmox-release-bookworm.gpg -O /etc/apt/trusted.gpg.d/proxmox-release-bookworm.gpg
|
|
apt-get update && apt full-upgrade -y --no-install-recommends;
|
|
|
|
# necessary precursors
|
|
echo "0.0.0.0\t\t`cat /etc/hostname`" >> /etc/hosts; # necessary for SSL certificate creation
|
|
mkdir -p /run/network; # bug https://github.com/CumulusNetworks/ifupdown2/issues/276
|
|
|
|
# install
|
|
apt install -y proxmox-default-kernel proxmox-ve postfix open-iscsi chrony --no-install-recommends;
|
|
|
|
# remove previous kernels
|
|
apt remove -y os-prober linux-image-amd64 'linux-image-6.*';
|
|
|
|
# otherwise grub upgrades make the device unbootable
|
|
echo 'grub-efi-amd64 grub2/force_efi_extra_removable boolean true' | debconf-set-selections -v -u
|
|
rm -rf /boot/efi/*
|
|
grub-install /dev/sda
|
|
grub-install --target=x86_64-efi --removable
|
|
|
|
# disable subscription warning
|
|
# https://dannyda.com/2020/05/17/how-to-remove-you-do-not-have-a-valid-subscription-for-this-server-from-proxmox-virtual-environment-6-1-2-proxmox-ve-6-1-2-pve-6-1-2/
|
|
sed -i -z "s/res === null ||\n\s* res === undefined ||\n\s* \!res ||\n\s* res.data.status.toLowerCase() \!== 'active'/false/g" /usr/share/javascript/proxmox-widget-toolkit/proxmoxlib.js
|
|
|
|
# stop hangs due to network
|
|
systemctl disable systemd-networkd-wait-online.service
|
|
|
|
# create vmbr0 conf, enable dhcp. this conf will be picked by manual-net-ifaces.d.service
|
|
cat >> /etc/network/interfaces.d/vmbr0.conf << EOF
|
|
auto vmbr0
|
|
iface vmbr0 inet dhcp
|
|
bridge-ports eth0
|
|
bridge-stp off
|
|
bridge-fd 0
|
|
|
|
EOF
|
|
'';
|
|
};
|
|
}
|