#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