Restauration Windows Server 2019 sur Red Hat OpenStack Platform 17.1 sans ISO : rescue image, winload.exe et BCD

Procédure complète et reproductible pour remettre en route une VM Windows Server 2019 inamorçable sur Red Hat OpenStack Platform 17.1, sans ISO ni démontage du disque racine : utilisation d’une image de secours, restauration de winload.exe, contrôle BCD et redémarrage autonome.

Sommaire

Contexte et objectif

Dans un laboratoire RHOSP 17.1, l’équipe devait prouver qu’une instance Windows Server 2019 défaillante pouvait être réparée sans lecteur ISO ni intervention intrusive sur le disque racine. Le test a consisté à supprimer le chargeur critique %SystemRoot%\System32\winload.exe, rendant l’OS inamorçable. La VM a ensuite été démarrée sur une image de secours (rescue image) disponible dans Glance, tandis que le disque racine d’origine restait attaché.

Dans ce mode, l’OS de secours voit généralement :

  • C: la partition système de l’image de secours (OS d’assistance)
  • D: le disque racine d’origine contenant l’installation Windows cassée

But opérationnel : restaurer rapidement la capacité de démarrage de Windows afin de débrancher l’image de secours et relancer la VM sur son disque racine, le tout en environnement cloud où seules des images raw/qcow2 sont disponibles.

Architecture de secours dans Red Hat OpenStack Platform 17.1

La fonction « rescue » de Nova démarre l’instance sur une image alternative (Linux ou Windows de secours) et ré-attache le disque racine initial comme volume secondaire. Aucun média amovible n’est requis et l’opération est réversible. Deux cas courants :

  • Racine sur volume Cinder : le volume est rattaché en lecture/écriture au moment du rescue → idéal pour réparer hors ligne.
  • Racine éphémère (disque local) : Nova expose le disque éphémère en device secondaire (ex. /dev/vdb) que l’OS de secours peut monter.

Cheat‑sheet OpenStack côté plateforme

# Sauvegarde avant intervention (racine sur volume Cinder)
openstack volume snapshot create --force --name ws2019-root-pre-fix <VOLUME_ID>

# Démarrage en mode rescue

openstack server rescue --image  

# Vérification des attachments

openstack server show  -f yaml 
-c name -c status -c volumes_attached -c OS-EXT-SRV-ATTR:root_device_name

# Sortie du mode rescue après réparation

openstack server unrescue  

Dans Horizon, l’opération équivalente se fait via Instances → Actions → Rescue, puis Unrescue une fois la correction effectuée.

Identification fiable des volumes dans l’OS de secours

Selon l’image de secours, les lettres peuvent varier. Validez systématiquement les volumes avant d’écrire quoi que ce soit.

diskpart
list disk
list volume
exit

Repères utiles depuis l’OS de secours (CMD ou PowerShell) :

wmic logicaldisk get deviceid, volumename, filesystem, size, freespace
mountvol

Si le disque racine n’a pas de lettre, attribuez‑la temporairement :

diskpart
list volume
select volume &lt;N&gt;
assign letter=D
exit

Restauration rapide du démarrage de Windows Server 2019

Les étapes ci‑dessous reprennent la méthode éprouvée pour un démarrage type BIOS/MBR où winload.exe est requis. Des variantes UEFI sont données plus loin.

Monter et vérifier les volumes

  1. Depuis l’OS de secours (C:), confirmer que le disque d’origine est bien D:.
  2. Vérifier l’intégrité du système de fichiers :
    chkdsk D: /f
  3. Si des erreurs sont corrigées, redémarrez l’OS de secours et relancez chkdsk jusqu’à obtenir un état propre.

Restaurer le fichier manquant winload.exe

Le moyen le plus rapide est de copier le binaire depuis l’OS de secours (ou depuis une VM saine de même build) vers l’installation cassée :

copy C:\Windows\System32\winload.exe  D:\Windows\System32\winload.exe

Réinitialiser les ACL si nécessaire :

icacls D:\Windows\System32\winload.exe /inheritance:e
icacls D:\Windows\System32\winload.exe /setowner "NT Service\TrustedInstaller"

Variante UEFI : validez également la présence de D:\Windows\System32\winload.efi. Si manquant, copiez‑le de la même manière.

Contrôler et, au besoin, réparer le magasin BCD

Avant toute modification, sauvegardez :

mkdir D:\BCD_Backup
copy D:\Boot\BCD D:\BCD_Backup\BCD.bak

Inspectez le magasin :

bcdedit /store D:\Boot\BCD /enum all

Les entrées « device » et « osdevice » de l’ID de démarrage ({default} le plus souvent) doivent pointer vers partition=D:. Corrigez au besoin :

bcdedit /store D:\Boot\BCD /set {default} device partition=D:
bcdedit /store D:\Boot\BCD /set {default} osdevice partition=D:
bcdedit /store D:\Boot\BCD /set {default} path \Windows\system32\winload.exe

Si le magasin est corrompu, laissez Windows le reconstruire :

bootrec /scanos
bootrec /rebuildbcd

Réparer MBR, secteur de démarrage et fichiers système

bootrec /fixmbr
bootrec /fixboot
sfc /scannow /offbootdir=D:\ /offwindir=D:\Windows

Astuce : sfc hors ligne restaure les fichiers standards (dont winload.exe) selon le magasin de composants. Si des composants sources manquent, utilisez la section DISM plus bas.

Recréer les fichiers de démarrage au besoin

Si le chargeur (bootmgr) ou les fichiers de démarrage sont absents/brisés, recréez‑les avec BCDBOOT :

# Mode BIOS/MBR (magasin BCD sur D:\Boot)
bcdboot D:\Windows /s D: /f BIOS

En UEFI, ciblez la partition EFI (voir plus bas) avec /f UEFI.

Sortir du mode rescue et redémarrer

  1. Fermez toutes les consoles et programmes ayant des fichiers ouverts sur D:.
  2. Depuis Horizon ou la CLI, exécutez openstack server unrescue <SERVER_ID>.
  3. Démarrez l’instance normalement. Windows doit retrouver winload.exe et un BCD valide.

Cas UEFI vs BIOS : chemins, BCD et commandes

Windows Server 2019 peut démarrer en mode BIOS/MBR ou UEFI/GPT. Les composants et emplacements diffèrent :

Contexte de démarragePartition systèmeEmplacement du BCDChargeur utiliséCommande de recréation
BIOS / MBRActive (NTFS) sur le disque OS
(souvent D: hors ligne)
D:\Boot\BCDwinload.exebcdboot D:\Windows /s D: /f BIOS
UEFI / GPTEFI (FAT32), ~100–300 MB
(lettre à attribuer, ex. S:)
S:\EFI\Microsoft\Boot\BCDwinload.efibcdboot D:\Windows /s S: /f UEFI

Localiser et préparer la partition EFI (UEFI)

diskpart
list disk
select disk &lt;X&gt;
list partition
select partition &lt;Y&gt;   # FAT32 ~100-300 MB
assign letter=S
exit

Puis vérifiez et, si nécessaire, regénérez les fichiers de boot UEFI :

dir S:\EFI\Microsoft\Boot
bcdedit /store S:\EFI\Microsoft\Boot\BCD /enum
bcdboot D:\Windows /s S: /f UEFI

Dépannage approfondi et cas particuliers

« Access is denied » sur bootrec /fixboot

Symptôme courant en UEFI lorsque la partition EFI n’a pas de lettre ou que ses ACL bloquent l’accès.

  1. Attribuez une lettre à l’EFI : diskpart → assign letter=S.
  2. Vérifiez que S: est FAT32. Si la partition est vierge/corrompue, dernier recours (après snapshot) : la reformater en FAT32 puis exécuter bcdboot D:\Windows /s S: /f UEFI.

Erreur 0xc000000e ou 0xc000000f

Généralement un chemin d’OS incorrect ou un BCD orphelin.

bcdedit /store &lt;BCD&gt; /set {default} device partition=D:
bcdedit /store &lt;BCD&gt; /set {default} osdevice partition=D:
bcdedit /store &lt;BCD&gt; /set {default} path \Windows\System32\winload.exe

DISM hors ligne sans ISO

Si sfc ne suffit pas et qu’aucun ISO n’est disponible, deux options :

  • Utiliser le magasin de composants de l’OS de secours s’il s’agit du même build :
dism /image:D:\ /cleanup-image /restorehealth /source:C:\Windows\WinSxS /limitaccess
  • Copier ponctuellement les binaires manquants depuis une VM Windows saine de même build (méthode ciblée).

Lettre de lecteur différente de D:

Adaptez toutes les commandes. Pour détecter automatiquement la bonne lettre de l’installation Windows hors ligne :

for %i in (D E F G H I J K L M N O P Q R S T U V W X Y Z) do @if exist %i:\Windows\System32\config\SYSTEM echo OS offline = %i:

Vérifications post‑réparation

  • Intégrité fichiers : sfc /scannow /offbootdir=D:\ /offwindir=D:\Windows revient propre.
  • BCD cohérent : bcdedit /store <BCD> /enum montre device/osdevice sur la partition système attendue.
  • Journaux : conservez une trace des commandes (copier/coller ou transcript PowerShell) avec date/heure.

Bonnes pratiques en environnement OpenStack

  • Snapshot systématique avant toute écriture sur le disque racine (volume Cinder ou image éphémère convertie en snapshot).
  • Lecture seule d’abord : réparez le minimum viable (chargeur, BCD) puis testez un unrescue.
  • Préparer une image de secours Windows de même version que la cible (idéal pour sfc/dism).
  • Consistance des drivers paravirt : vérifiez que l’image de secours dispose des mêmes pilotes virtio/Red Hat nécessaires pour voir les volumes.
  • Contrôle de l’ordre des disques : en cas de doute, identifiez les devices via leurs GUID (diskpart → detail disk) et notez les correspondances.

Tableau de décision rapide

SymptômeCause probableAction recommandée
Fichier winload.exe manquantSuppression/altération fichierCopie depuis OS de secours → sfc hors ligne
BCD invalide / OS introuvableEntrées device/osdevice erronéesbcdedit pour corriger, ou bootrec /rebuildbcd
bootrec /fixbootAccess is deniedEFI sans lettre / ACL bloquantesAssigner lettre à EFI → bcdboot UEFI
Erreur 0xc000000e / 0xc000000fChemin chargeur ou partition incorrecteCorriger path, device, osdevice dans BCD
sfc ne répare pasMagasin de composants manquantdism avec source WinSxS du secours (même build)

Script de réparation hors ligne automatisé (optionnel)

Ce script CMD couvre 80 % des cas BIOS/MBR : détection de la partition Windows, copie de winload.exe, vérification BCD et réparation standard. À exécuter depuis l’OS de secours en administrateur.

@echo off
setlocal enabledelayedexpansion

rem --- Détecter la lettre de l'installation offline ---
for %%L in (D E F G H I J K L M N O P Q R S T U V W X Y Z) do (
if exist %%L:\Windows\System32\config\SYSTEM (
set OFF=%%L:
goto :FOUND
)
)
echo [ERREUR] Impossible de trouver l'installation Windows offline.& exit /b 1
:FOUND
echo [INFO] Installation offline detectee sur %OFF%

rem --- Vérifications disque ---
chkdsk %OFF% /f

rem --- Restaurer winload.exe si absent ---
if not exist %OFF%\Windows\System32\winload.exe (
echo [INFO] Restauration de winload.exe
copy C:\Windows\System32\winload.exe %OFF%\Windows\System32\winload.exe
icacls %OFF%\Windows\System32\winload.exe /inheritance:e
icacls %OFF%\Windows\System32\winload.exe /setowner "NT Service\TrustedInstaller"
)

rem --- Sauvegarde du BCD ---
if exist %OFF%\Boot\BCD (
if not exist %OFF%\BCD_Backup mkdir %OFF%\BCD_Backup
copy %OFF%\Boot\BCD %OFF%\BCD_Backup\BCD.bak
)

rem --- Correction BCD ---
bcdedit /store %OFF%\Boot\BCD /enum 1>nul 2>&1
if errorlevel 1 (
echo [INFO] BCD corrompu ou manquant, reconstruction...
bootrec /scanos
bootrec /rebuildbcd
) else (
echo [INFO] Correction des entrees device/osdevice...
bcdedit /store %OFF%\Boot\BCD /set {default} device partition=%OFF%
bcdedit /store %OFF%\Boot\BCD /set {default} osdevice partition=%OFF%
bcdedit /store %OFF%\Boot\BCD /set {default} path \Windows\System32\winload.exe
)

rem --- Reparation boot code & systeme ---
bootrec /fixmbr
bootrec /fixboot
sfc /scannow /offbootdir=%OFF%\ /offwindir=%OFF%\Windows

echo [OK] Terminé. Vous pouvez quitter le mode rescue et redemarrer l'instance.
endlocal 

Cheat‑sheet des commandes côté Windows

OutilCommandeFinalité
diskpartlist volume, assign letter=Identifier et monter les partitions (OS ou EFI)
chkdskchkdsk D: /fAssainir le système de fichiers avant réparation
icacls/inheritance:e, /setowner TrustedInstallerRéparer les ACL après copie de binaires système
bcdedit/store ... /set ...Corriger les entrées BCD device/osdevice/path
bootrec/fixmbr, /fixboot, /rebuildbcdRéparer MBR/secteur de boot et reconstruire le magasin BCD
sfc/scannow /offbootdir /offwindirVérification/réparation hors ligne des fichiers système
dism/image:... /restorehealthRéparer le magasin de composants (sans ISO si source disponible)
bcdboot/s ... /f BIOS|UEFIRecréer les fichiers de démarrage et un BCD valide

Procédure récapitulative « dualité secours / production »

ÉtapeDepuisActionValidation attendue
Snapshot préventifOpenStackCréer snapshot volume racineSnapshot présent et disponible
Entrée en mode rescueOpenStackserver rescue avec image de secoursInstance RESCUE, console OK
Vérif. volumesOS de secoursdiskpart, chkdskOS cassé visible sur D:
Restauration chargeurOS de secoursCopie winload.exe, bcdedit/bootrecBCD valide, SFC propre
Sortie rescueOpenStackserver unrescueInstance ACTIVE, boot OK

Pourquoi cette méthode fonctionne

Le couple OS de secours + réparation hors ligne reproduit la logique d’un média WinPE/ISO tout en respectant les contraintes cloud : impossible de monter un ISO, mais possible d’attacher un disque de secours et d’accéder au volume racine en lecture/écriture. La restauration ciblée du chargeur (winload.exe ou winload.efi) et la correction du BCD suffisent dans la majorité des incidents de démarrage, sans réinstallation complète ni conversion d’image.

Résultat

Après application des étapes ci‑dessus, la VM Windows Server 2019 redémarre normalement sur son disque racine. La procédure s’apparente à un bare‑metal recovery maîtrisé dans un cloud OpenStack, aligné avec les contraintes d’images raw/qcow2 et l’absence de média d’installation.

Annexes utiles

Exemple d’audit rapide BCD (UEFI)

diskpart
select disk 0
list partition
select partition 1        # si EFI identifiée
assign letter=S
exit

bcdedit /store S:\EFI\Microsoft\Boot\BCD /enum all

rem Pour forcer un nouveau BCD propre
ren S:\EFI\Microsoft\Boot\BCD BCD.bad
bcdboot D:\Windows /s S: /f UEFI 

Nettoyage et redémarrage sûrs

  • Supprimez les lettres temporaires attribuées aux partitions système (diskpart → select volume → remove letter=S) pour éviter les surprises une fois en production.
  • Vérifiez l’ordre de boot dans le firmware virtuel si la plateforme le permet (rarement nécessaire avec RHOSP).

Checklist de fin d’intervention

  • Snapshot final post‑réparation pour documenter l’état sain.
  • Journal d’exécution des commandes conservé dans votre référentiel (ticket, change request).
  • Plan de réversibilité : en cas d’échec, revert du snapshot Cinder.

En résumé : sans ISO, la combinaison image de secours + réparation BCD/chargeur permet une remise en service rapide, traçable et compatible cloud de Windows Server 2019 sur Red Hat OpenStack Platform 17.1. Conservez des images de secours cohérentes avec vos builds Windows et automatisez les séquences clés (diskpart, bcdedit, bootrec, sfc, bcdboot) pour réduire davantage le MTTR.

Sommaire