Clé USB multi-boot Ventoy
Approche recommandée pour la reconstruction minfra-v2 : une seule clé USB embarque toutes les ISOs nécessaires (Proxmox VE, Windows 11 unattended, Debian 13, OPNsense…). Drag & drop d’ISO + boot UEFI → menu de choix. Pas besoin de reflasher quand une ISO change.
Contexte
Pourquoi Ventoy ?
- 1 clé = N ISOs (limite = taille disque)
- Ajout / retrait ISO = simple drag & drop (pas de reflash)
- Update Ventoy lui-même sans wiper les ISOs
- Supporte Windows + Linux + BSD + WinPE rescue (>1000 ISOs testées)
- Compatible autounattend.xml Win11 via plugin
ventoy.json
Setup cible reconstruction minfra-v2:
USB 64 GB Ventoy
├── proxmox-ve_8.x.iso (hôte coruscant)
├── en-us_windows_11_business...iso (poste admin + autounattend)
├── debian-13.0-amd64-DVD-1.iso (templates VM Debian)
├── OPNsense-25.x-amd64.iso (firewall — phase later)
├── ventoy/ventoy.json (active autounattend Win11)
└── autounattend.xml (réponses Setup Windows)
Hypothèses:
- Host Windows admin pour flasher (PowerShell)
- Clé USB ≥ 32 GB (64 GB confort)
- Connexion internet pour downloads (~10 GB total)
- Repo
minfra-v2cloné sur le host (pourautounattend.xml)
Récupérer le repo minfra-v2
# === Windows (PowerShell) ===
winget install --id Git.Git -e --source winget --silent
git clone https://github.com/sminard38/minfra-v2.git D:\git\minfra-v2
cd D:\git\minfra-v2\infra\bare-metal\win11
Verify: Test-Path D:\git\minfra-v2\infra\bare-metal\win11\autounattend.xml
Télécharger Ventoy
Dernière release officielle GitHub (zip Windows).
$dest = "$env:USERPROFILE\Downloads\ventoy.zip"
$url = (Invoke-RestMethod https://api.github.com/repos/ventoy/Ventoy/releases/latest).assets |
Where-Object name -like 'ventoy-*-windows.zip' |
Select-Object -ExpandProperty browser_download_url
Invoke-WebRequest $url -OutFile $dest
Expand-Archive $dest -DestinationPath "$env:USERPROFILE\Downloads\Ventoy" -Force
$Global:VentoyDir = (Get-ChildItem "$env:USERPROFILE\Downloads\Ventoy\ventoy-*" -Directory)[0].FullName
Write-Host "Ventoy unzipped: $VentoyDir"
Verify: Test-Path “$VentoyDir\Ventoy2Disk.exe”
Télécharger les ISOs
Sauvegarder dans D:\iso\ (créer le dossier si besoin).
New-Item -ItemType Directory -Path D:\iso -Force | Out-Null
# Proxmox VE — page officielle
Start-Process "https://www.proxmox.com/en/downloads/proxmox-virtual-environment/iso"
# Windows 11 — page officielle (Business Editions ou ISO grand public)
Start-Process "https://www.microsoft.com/software-download/windows11"
# Debian 13 — netinst (700 MB) ou DVD-1 (4.5 GB)
Start-Process "https://www.debian.org/distrib/"
# OPNsense (optionnel, phase later)
# Start-Process "https://opnsense.org/download/"
Vérifier après téléchargement:
Get-ChildItem D:\iso\ | Format-Table Name, @{N='GB';E={[math]::Round($_.Length/1GB,2)}}
Verify: (Get-ChildItem D:\iso*.iso).Count -ge 2
Vérifier les checksums ISO
Téléchargement compromis = install compromis. Vérifier SHA256 contre la page officielle (Microsoft, Proxmox, Debian publient leurs hashes).
Get-ChildItem D:\iso\*.iso | ForEach-Object {
[pscustomobject]@{
Name = $_.Name
SHA256 = (Get-FileHash $_.FullName -Algorithm SHA256).Hash
}
} | Format-List
Comparer manuellement chaque hash avec la valeur publiée par l’éditeur.
Verify: (Get-FileHash D:\iso\proxmox-ve*.iso -Algorithm SHA256).Hash
Sélectionner + préparer la clé USB
Même bloc que la fiche mono-ISO. Filtre amovibles, confirmation WIPE.
# PowerShell admin
$d = @(Get-Disk | Where-Object { $_.BusType -eq 'USB' -or $_.MediaType -eq 'Removable Media' })
if (-not $d) { Write-Host "Aucun disque amovible. Brancher la cle." -ForegroundColor Red; return }
$d | Format-Table Number, FriendlyName, @{N='GB';E={[math]::Round($_.Size/1GB,1)}}, BusType, PartitionStyle -AutoSize
$t = if ($d.Count -eq 1) { $d[0] } else { $d | Where-Object Number -eq [int](Read-Host "Numero") }
if (-not $t -or (Read-Host "Wipe $($t.Number) ($($t.FriendlyName)) ? Taper WIPE") -ne 'WIPE') { return }
Set-Disk -Number $t.Number -IsReadOnly $false -ErrorAction SilentlyContinue
Set-Disk -Number $t.Number -IsOffline $false -ErrorAction SilentlyContinue
Clear-Disk -Number $t.Number -RemoveData -RemoveOEM -Confirm:$false
$Global:DiskNumber = $t.Number
Write-Host "Disque $($t.Number) pret pour Ventoy. `$DiskNumber = $($t.Number)" -ForegroundColor Green
Verify: (Get-Disk -Number $DiskNumber).IsReadOnly -eq $false
Installer Ventoy sur la clé USB
Ventoy2Disk a une CLI cachée (VTOYCLI) pour scripting. Mode GPT obligatoire
pour booter en UEFI moderne.
⚠ DESTRUCTIF : wipe complet de la clé. Ventoy refait son propre partitionnement (1 partition exFAT data + 1 partition EFI 32 MB).
# Install Ventoy en mode GPT/UEFI sur PHYSICALDRIVE$DiskNumber
& "$VentoyDir\Ventoy2Disk.exe" VTOYCLI /I /Drive:PHYSICALDRIVE$DiskNumber /GPT
# Attendre fin install (Ventoy2Disk fork un sous-process)
Start-Sleep -Seconds 8
Get-Volume | Where-Object FileSystemLabel -eq 'Ventoy' | Format-Table DriveLetter, FileSystemLabel, SizeRemaining, Size
Si la CLI échoue (Smart App Control, etc.) : lancer Ventoy2Disk.exe en
GUI, sélectionner la clé, Menu Option → Partition Style → GPT,
clic Install.
Verify: (Get-Volume | Where-Object FileSystemLabel -eq ‘Ventoy’).Count -eq 1
Copier les ISOs sur la clé
Lettre de la partition Ventoy assignée auto (varie selon host). Copie
direct par drag & drop ou Copy-Item.
$ventoy = (Get-Volume | Where-Object FileSystemLabel -eq 'Ventoy').DriveLetter
Write-Host "Partition Ventoy: ${ventoy}:\"
# Copie ISOs (peut prendre 5-15 min selon vitesse USB)
Copy-Item D:\iso\proxmox-ve*.iso "${ventoy}:\" -Verbose
Copy-Item D:\iso\*windows_11*.iso "${ventoy}:\" -Verbose
Copy-Item D:\iso\debian-13*.iso "${ventoy}:\" -Verbose
Get-ChildItem "${ventoy}:\*.iso" | Format-Table Name, @{N='GB';E={[math]::Round($_.Length/1GB,2)}}
Verify: (Get-ChildItem ”$((Get-Volume | Where-Object FileSystemLabel -eq ‘Ventoy’).DriveLetter):*.iso”).Count -ge 2
Activer autounattend Win11 (plugin Ventoy)
Ventoy peut injecter un fichier de réponses dans une ISO Windows au
boot via le plugin auto_install. Crée ventoy/ventoy.json à la racine.
$ventoy = (Get-Volume | Where-Object FileSystemLabel -eq 'Ventoy').DriveLetter
$winIso = (Get-ChildItem "${ventoy}:\*windows_11*.iso")[0].Name
$cfg = @"
{
"control": [
{ "VTOY_DEFAULT_MENU_MODE": "0" },
{ "VTOY_MENU_TIMEOUT": "10" }
],
"auto_install": [
{
"image": "/$winIso",
"template": "/autounattend.xml"
}
]
}
"@
New-Item -ItemType Directory -Path "${ventoy}:\ventoy" -Force | Out-Null
Set-Content -Path "${ventoy}:\ventoy\ventoy.json" -Value $cfg -Encoding utf8
Copy-Item D:\git\minfra-v2\infra\bare-metal\win11\autounattend.xml "${ventoy}:\autounattend.xml" -Force
Verify: Test-Path ”$((Get-Volume | Where-Object FileSystemLabel -eq ‘Ventoy’).DriveLetter):\ventoy\ventoy.json” Verify: Test-Path ”$((Get-Volume | Where-Object FileSystemLabel -eq ‘Ventoy’).DriveLetter):\autounattend.xml”
Valider config Ventoy (JSON)
JSON corrompu = clé boote mais ignore l’unattend. Valider syntaxe.
$ventoy = (Get-Volume | Where-Object FileSystemLabel -eq 'Ventoy').DriveLetter
Get-Content "${ventoy}:\ventoy\ventoy.json" -Raw | ConvertFrom-Json | ConvertTo-Json -Depth 5
Write-Host "ventoy.json OK" -ForegroundColor Green
Verify: Get-Content ”$((Get-Volume | Where-Object FileSystemLabel -eq ‘Ventoy’).DriveLetter):\ventoy\ventoy.json” -Raw | ConvertFrom-Json
Booter la clé Ventoy en UEFI
Insérer clé USB sur machine cible éteinte. Allumer + spammer touche Boot Menu dès logo constructeur.
| Constructeur | Boot Menu | BIOS/UEFI Setup |
|---|---|---|
| Dell | F12 | F2 |
| HP / HPE | F9 | F10 / Esc |
| Lenovo / ThinkPad | F12 | F1 |
| ASUS | F8 / Esc | F2 / Del |
| MSI | F11 | Del |
| Gigabyte / AsRock | F12 | Del |
| Intel NUC | F10 | F2 |
| Surface | Vol- + power | Vol+ + power |
| Mac (Boot Camp) | Option (⌥) | - |
Sélectionner entrée UEFI : (pas Legacy/CSM). Au boot Ventoy → menu
liste les ISOs détectées. Naviguer flèches + Enter.
- Windows 11 → install auto unattended (sacha / ChangeMe!2026)
- Proxmox VE → installer interactif (clavier FR à régler dans installer)
- Debian 13 → installer interactif (locale fr, clavier fr-latin1)
Verify: machine cible affiche menu Ventoy GRUB avec >=2 ISOs listées
Maintenance — ajouter / retirer ISO
Plus besoin de wiper la clé. Drag & drop pur :
$ventoy = (Get-Volume | Where-Object FileSystemLabel -eq 'Ventoy').DriveLetter
# Ajouter une ISO
Copy-Item D:\iso\ubuntu-24.04-server.iso "${ventoy}:\"
# Retirer une ISO obsolete
Remove-Item "${ventoy}:\debian-12*.iso"
# Lister contenu
Get-ChildItem "${ventoy}:\*.iso" | Sort-Object Name
Verify: (Get-ChildItem ”$((Get-Volume | Where-Object FileSystemLabel -eq ‘Ventoy’).DriveLetter):*.iso”).Count -gt 0
Maintenance — mettre à jour Ventoy lui-même
Update du bootloader Ventoy sans toucher aux ISOs (préserve fichiers). Utiliser depuis la dernière release unzippée.
& "$VentoyDir\Ventoy2Disk.exe" VTOYCLI /U /Drive:PHYSICALDRIVE$DiskNumber
Verify: après update, ISOs toujours présentes
Sécurité — mot de passe initial Win11
Identique au flash mono-ISO : autounattend.xml contient ChangeMe!2026
en clair. Au premier login sacha sur la machine cible :
$newPw = bw get password "win-sacha-$(hostname)"
Set-LocalUser -Name sacha -Password (ConvertTo-SecureString $newPw -AsPlainText -Force)
Pour cas sensible : retirer autounattend.xml de la clé après le 1er
install (ré-ajouter quand on relance un build).
$ventoy = (Get-Volume | Where-Object FileSystemLabel -eq 'Ventoy').DriveLetter
Remove-Item "${ventoy}:\autounattend.xml" -Force
Remove-Item "${ventoy}:\ventoy\ventoy.json" -Force
Suite logique
00-poste-admin-win11— variante mono-ISO (legacy, pour systèmes qui ne tolèrent pas Ventoy)01-prerequis-contexte— installer mise/task/ansible/sops/age/bw sur le Win11 fraîchement déployé02-cablage— physique réseau
Hors périmètre
- Persistence Linux sur Ventoy — possible via plugin
persistence, pas utile pour notre cas DR (installs propres) - Memdisk mode pour vieux ISOs non-Ventoy-compatibles — workaround rare, skip
- Ventoy SecureBoot — supporté natif Ventoy ≥1.0.80. Sur machines avec SB strict, importer la clé MOK Ventoy au 1er boot
- Cloud-init Proxmox templates — différé après Proxmox up
- PXE boot — alternative réseau (TFTP + DHCP option 66) pour DR sans clé physique. Phase 2 quand step-ca + OPNsense up