RudderVirt

#Linux from an ISO

When there's no cloud image (or you need a specific install layout), boot from an ISO and drive the installer with a preseed/kickstart file served via the HTTP directory.

sequenceDiagram participant Aileron participant VM as VM<br/>(blank disk + ISO) Aileron->>VM: power on VM->>VM: boots from ISO Aileron->>VM: bootCommand types preseed URL via VNC VM->>Aileron: HTTP GET /preseed.cfg Aileron-->>VM: preseed.cfg content VM->>VM: runs unattended install VM->>VM: reboots into installed system Aileron->>VM: SSH connects Aileron->>VM: runs provisioners
network:
    subnets:
        - name: lan
          cidr: '10.0.0.0/24'
files:
    - name: preseed.cfg
      inline: |
          d-i auto-install/enable boolean true
          d-i debian-installer/locale string en_US.UTF-8
          d-i keyboard-configuration/xkb-keymap select us
          d-i mirror/country string manual
          d-i mirror/http/hostname string deb.debian.org
          d-i mirror/http/directory string /debian
          d-i passwd/user-fullname string skills
          d-i passwd/username string skills
          d-i passwd/user-password password skills
          d-i passwd/user-password-again password skills
          # ... full preseed ...
httpDirectory:
    files:
        - name: preseed.cfg
vms:
    - name: builder
      source:
          blank: true
      resources:
          cpu: 2
          memory: '4Gi'
      disks:
          - name: rootdisk
            size: '25Gi'
      isos:
          - url: 'https://cdimage.debian.org/.../debian-12.9.0-amd64-netinst.iso'
            checksum: '1257373c...'
      communicator:
          sshUsername: skills
          sshPassword: skills
          sshTimeout: 60m
      nics:
          - name: eth0
            subnet: lan
            ip: '10.0.0.10'
      efiFirmware:
          secureBoot: false
      bootCommand:
          - '<wait20>'
          - '<down><down><enter>'
          - '<wait><down><down><enter>'
          - '<wait70>'
          - '<leftCtrlOn>a<leftCtrlOff>'
          - 'http://{{ .HTTPIP }}:{{ .HTTPPort }}/preseed.cfg'
          - '<enter>'
      provisioners:
          - name: verify
            type: shell
            shell:
                executeCommand: "echo 'skills' | sudo -S sh -c '{{ .Command }}'"
                inline: |
                    cat /etc/debian_version
                    uname -a
timeout: 90m