# vm.nix let pkgs = import {}; in let # 1. SOURCE YOUR DEBIAN IMAGE debianImage = pkgs.fetchurl { name = "debian-13-genericcloud-amd64.qcow2"; url = "https://cloud.debian.org/images/cloud/trixie/latest/debian-13-genericcloud-amd64.qcow2"; hash = "sha256-V9a6DUghJB5j4Vz9Y5aikZ8syhx5Zn2593m8/8xNwIU="; # REPLACE THIS }; # 2. VM DATA DIRECTORY vmDataDir = "/home/${builtins.getEnv "USER"}/.local/share/debian-vm"; # 3. CREATE ALL FILES IN A SCRIPT setupScript = pkgs.writeShellScriptBin "setup-vm-files" '' set -e # Create VM directory mkdir -p "${vmDataDir}" # Create persistent disk if it doesn't exist if [ ! -f "${vmDataDir}/debian-persistent.qcow2" ]; then echo "Creating persistent disk from base image..." ${pkgs.qemu}/bin/qemu-img create -f qcow2 \ -b "${debianImage}" \ -F qcow2 \ "${vmDataDir}/debian-persistent.qcow2" \ 20G fi # Create cloud-init configuration cat > "${vmDataDir}/user-data" << 'EOF' #cloud-config password: nixos chpasswd: { expire: False } ssh_pwauth: True runcmd: - | if [ ! -f /etc/vm-initialized ]; then cd /home/debian sudo -u debian git clone https://github.com/someone/something cd something chmod +x install.sh sudo -u debian ./install.sh touch /etc/vm-initialized fi EOF # Create cloud-init ISO ${pkgs.cloud-utils}/bin/cloud-localds \ "${vmDataDir}/cloud-init.iso" \ "${vmDataDir}/user-data" echo "VM files created in ${vmDataDir}" ''; # 4. LAUNCH SCRIPT runScript = pkgs.writeShellScriptBin "run-debian-vm" '' set -e # Run setup first ${setupScript}/bin/setup-vm-files # Launch QEMU with KVM acceleration ${pkgs.qemu_kvm}/bin/qemu-kvm \ -name "Debian-Persistent-VM" \ -machine accel=kvm \ -cpu host \ -m 2048 \ -drive file="${vmDataDir}/debian-persistent.qcow2",format=qcow2,if=virtio \ -drive file="${vmDataDir}/cloud-init.iso",format=raw,if=virtio \ -netdev user,id=n1,hostfwd=tcp::2222-:22 \ -device virtio-net-pci,netdev=n1 \ -display gtk \ -vga virtio \ "$@" ''; in { system.build.customVM = runScript; }