From b6fb2a84882ce321f2c5d6bdec0fadfd82b2aa97 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micka=C3=ABl=20CHAVE?= Date: Mon, 15 Jun 2026 19:24:37 +0200 Subject: [PATCH] docs(os-recovery): document WinRE recovery flow --- docs/deploy/deployment-flow.md | 1 + docs/deploy/os-recovery.md | 37 +++++++++++++++++++ docs/technical/deployment-orchestrator.md | 29 ++++++++++++--- sidebars.ts | 2 +- static/img/deploy/os-recovery-winre-flow.png | Bin 0 -> 28205 bytes 5 files changed, 63 insertions(+), 6 deletions(-) create mode 100644 docs/deploy/os-recovery.md create mode 100644 static/img/deploy/os-recovery-winre-flow.png diff --git a/docs/deploy/deployment-flow.md b/docs/deploy/deployment-flow.md index 5183e29..9e93cba 100644 --- a/docs/deploy/deployment-flow.md +++ b/docs/deploy/deployment-flow.md @@ -161,3 +161,4 @@ If deployment fails, Foundry Deploy shows the failed step and error message. Use - Review the [Expert Mode](../configure/expert-mode) section to understand which values can be staged from Foundry OSD. - Open [Catalog Overview](../reference/catalog-overview) to understand where operating system and driver choices come from. +- Review [OS Recovery](./os-recovery) before enabling the WinRE last-resort redeployment path. diff --git a/docs/deploy/os-recovery.md b/docs/deploy/os-recovery.md new file mode 100644 index 0000000..a2ba5b3 --- /dev/null +++ b/docs/deploy/os-recovery.md @@ -0,0 +1,37 @@ +--- +title: OS Recovery +description: Recover a machine using a WinRE-first, last-resort deployment flow. +--- + +# OS Recovery + +OS Recovery is the last-resort deployment path when normal provisioning cannot continue. + +It uses the Windows Recovery Environment (WinRE) as the entry point and follows a dedicated menu path: + +**Troubleshoot > Advanced options > Foundry Recovery** + +## What happens in WinRE + +When selected, WinRE starts the Foundry recovery image and runs the recovery bootstrap. + +- `Foundry.Connect`, the bootstrap script, 7-Zip, time zone data, and minimal sanitized configuration are embedded in the WinRE payload. +- `Foundry.Deploy` is not embedded. It is downloaded during recovery boot, then used to redeploy the OS. +- The recovery partition stays intact. +- The existing Windows partition is replaced during redeployment. +- A Foundry recovery marker is written next to `winre.wim`; recovery startup uses it to identify the provisioned disk and fails closed if the target is ambiguous. + +![WinRE OS recovery flow](/img/deploy/os-recovery-winre-flow.png) + +## Key limits + +- A single custom WinRE recovery tool is supported. +- This is not a root recovery menu replacement. +- No enterprise personalization payloads are applied from WinRE. +- Autopilot payloads, network roaming profiles, certificates, OA3 tools, media secrets, and `Foundry.Deploy` binaries are not embedded in WinRE. +- Network access is required for downloading the deployment payload. +- BitLocker on the previous OS partition does not need to be readable for the recovery flow. + +## Validation + +Use `scripts/Test-FoundryOsRecoveryWinRe.ps1` to inspect a mounted or extracted WinRE image. The script checks the WinRE tool files, bootstrap, embedded `Foundry.Connect`, minimal configuration, 7-Zip runtime, and excluded payloads. By default it also checks `reagentc /info`; use `-SkipReAgentC` only when validating an offline image on a machine that is not the deployed target. diff --git a/docs/technical/deployment-orchestrator.md b/docs/technical/deployment-orchestrator.md index a41baee..1bac7d1 100644 --- a/docs/technical/deployment-orchestrator.md +++ b/docs/technical/deployment-orchestrator.md @@ -26,11 +26,12 @@ The deployment pipeline runs in this order: 11. Download driver pack 12. Extract driver pack 13. Apply driver pack or stage deferred first-boot execution -14. Download firmware update -15. Apply firmware update -16. Seal recovery partition -17. Provision Autopilot -18. Finalize deployment and write logs +14. Provision OS Recovery, when enabled +15. Download firmware update +16. Apply firmware update +17. Seal recovery partition +18. Provision Autopilot +19. Finalize deployment and write logs ## Runtime state @@ -53,3 +54,21 @@ Interactive hardware hash upload mode stages the Foundry OOBE registration assis ## Failure behavior If a step fails, orchestration stops, the failure is logged, and Foundry Deploy reports the failed step to the operator. Logs are rebound to the final Windows target location when the Windows partition is available. +## OS Recovery (WinRE) + +The deployment orchestrator also supports a WinRE-based recovery mode for devices that cannot complete normal deployment. This is surfaced as: + +`Troubleshoot > Advanced options > Foundry Recovery` + +The runtime in this mode differs from normal deployment: + +- `Foundry.Connect` is shipped inside the WinRE image and starts the recovery entrypoint. +- `Foundry.Deploy` is not embedded; it is fetched during recovery to perform redeployment. +- Recovery mode preserves EFI, MSR, and Recovery partitions, then formats and replaces the Windows partition. +- Autopilot payloads, network roaming profiles, certificates, OA3 tools, media secrets, and enterprise personalization artifacts are intentionally excluded from the WinRE image. + +Operational limits: + +- Only one custom recovery tool entry is currently available. +- Internet connectivity is required for bootstrap flow to download `Foundry.Deploy`. +- The previous BitLocker-protected OS volume does not need to be readable during recovery. diff --git a/sidebars.ts b/sidebars.ts index 7e28544..35f691c 100644 --- a/sidebars.ts +++ b/sidebars.ts @@ -71,7 +71,7 @@ const sidebars: SidebarsConfig = { slug: '/deploy', description: 'Select deployment options and run the Windows deployment.', }, - items: ['deploy/deployment-flow'], + items: ['deploy/deployment-flow', 'deploy/os-recovery'], }, { type: 'category', diff --git a/static/img/deploy/os-recovery-winre-flow.png b/static/img/deploy/os-recovery-winre-flow.png new file mode 100644 index 0000000000000000000000000000000000000000..4d9b0b60f372af8e76879420b8545cf6485f3bfd GIT binary patch literal 28205 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 literal 0 HcmV?d00001