Files
nix-debvm/vm.nix
2026-02-07 22:46:25 +02:00

86 lines
2.3 KiB
Nix

# vm.nix
let
pkgs = import <nixpkgs> {};
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;
}