Sauvegarde Windows 11 et environnements WSL : guide des solutions fiables en 2026
L’évolution de Windows 11 a transformé le système d’exploitation en un écosystème hybride où cohabitent désormais le noyau Windows et des instances Linux via WSL 2. Tous nos guides liés à l’IA locale, comme l’installation d’Ollama ou l’utilisation de Hugging Face Transformers, reposent sur cette architecture, ce qui rend la sauvegarde de WSL 2 critique pour la continuité de vos projets.
Pourtant, les outils de protection natifs restent principalement conçus pour des structures de fichiers NTFS classiques. Pour une protection basique de vos documents personnels, vous pouvez consulter notre guide pour une sauvegarde simple de Windows 11, mais pour les environnements de développement et les données IA, une approche plus technique est indispensable.
Pourquoi les outils natifs de Windows 11 peinent face au WSL 2
S’appuyer sur les fonctionnalités par défaut pour protéger des instances Linux présente des limites structurelles que tout utilisateurs avancés doit intégrer.
L’architecture des disques virtuels (.vhdx)
WSL 2 encapsule chaque distribution dans un disque dur virtuel au format .vhdx. Si vous avez installé vLLM via Docker sur WSL2, vos modèles et environnements ne sont, pour Windows, qu’un unique fichier binaire opaque. Cette encapsulation complique la sauvegarde granulaire.
Le rôle et les limites de VSS (Volume Shadow Copy)
Le service VSS de Windows est performant pour produire un snapshot cohérent au niveau du système de fichiers NTFS. Cependant, l’incohérence potentielle ne vient pas de VSS lui-même, mais du système de fichiers ext4 interne au .vhdx. Si WSL est actif lors du snapshot, des écritures en mémoire côté Linux peuvent ne pas être synchronisées sur le disque virtuel. Le snapshot NTFS sera « propre », mais le système de fichiers Linux à l’intérieur pourrait être marqué comme « dirty » au redémarrage, nécessitant un fsck ou entraînant des pertes de données applicatives.
L’outil « Sauvegarder et restaurer (Windows 7) »
Bien que maintenu pour des raisons de compatibilité, cet utilitaire est limité face aux environnements hybrides modernes. Il ne propose pas de gestion fine des fichiers ouverts de type hyperviseur et manque de la flexibilité nécessaire pour gérer des sauvegardes incrémentielles rapides sur des volumes de données importants, comme ceux générés par Unsloth sur Docker.
Stratégies de sauvegarde : export WSL vs image système
Une stratégie de sauvegarde développeur sur Windows repose sur deux piliers complémentaires.
1. La sauvegarde atomique : export WSL .tar
La seule méthode garantissant une cohérence absolue du système de fichiers Linux reste l’exportation native. Elle permet de figer l’instance et de conserver les permissions Unix, essentielles si vous utilisez VS Code pour ouvrir vos projets Linux.
# Exportation d'une distribution
wsl --export <NomDistribution> D:Backupswsl-distribution.tar
2. La sauvegarde globale : l’image disque
L’image système (Bare Metal) permet de restaurer l’intégralité de l’OS et des configurations logicielles. Elle inclut les fichiers .vhdx, mais doit être couplée à une procédure de mise à l’arrêt pour garantir la santé des données Linux.
Automatiser l’arrêt WSL avant sauvegarde
Pour assurer la cohérence du FS Linux lors d’une sauvegarde par image disque, il est recommandé d’intégrer une commande d’arrêt dans vos tâches planifiées ou vos scripts de pré-backup :
# Script simple de préparation
wsl --shutdown
# Lancer ici votre logiciel de sauvegarde tiers
L’appel à wsl –shutdown force la fermeture de toutes les instances et la libération des descripteurs de fichiers sur les .vhdx, permettant une capture stable par les agents de sauvegarde.
Script PowerShell : Automatisation de l’export WSL
Ce script PowerShell optimisé pour automatiser l’exportation de vos distributions WSL vers un emplacement de sauvegarde (disque externe ou NAS). Ce script inclut une gestion de la cohérence via l’arrêt des instances et l’horodatage des archives.
Il identifie automatiquement vos distributions installées et crée une archive .tar pour chacune d’elles.
#Requires -Version 5.1
<#
.SYNOPSIS
Advanced WSL2 Backup Tool by Xoonity.
.DESCRIPTION
Exports all WSL distributions to .tar archives with logging,
error handling, backup rotation, and prerequisite checks.
Developed by the Engineering Team at Cosmo-Edge.com.
Full Documentation (EN): https://cosmo-edge.com/expert-windows-11-wsl2-vhdx-backup
Tutoriel Complet (FR): https://cosmo-games.com/sauvegarde-expert-windows-11-wsl2-vhdx
.NOTES
Version: 1.1 (2026 Update)
License: MIT License - Copyright (c) 2026 Xoonity
.PARAMETER BackupPath
Target folder for backups (NAS, external drive, etc.)
.PARAMETER RetentionDays
Number of days to keep archives (default: 7)
.PARAMETER Compress
Compress archives to .tar.gz using gzip (slower but saves space)
.EXAMPLE
.wsl-backup.ps1 -BackupPath "F:BackupsWSL" -RetentionDays 14
#>
param(
[string]$BackupPath = "F:BackupWSL",
[int]$RetentionDays = 7,
[switch]$Compress
)
Set-StrictMode -Version Latest
$ErrorActionPreference = "Stop"
# ─────────────────────────────────────────────
# CONFIGURATION
# ─────────────────────────────────────────────
$date = Get-Date -Format "yyyy-MM-dd"
$logFile = Join-Path $BackupPath "backup_$date.log"
# ─────────────────────────────────────────────
# FUNCTIONS
# ─────────────────────────────────────────────
function Write-Log {
param([string]$Message, [string]$Level = "INFO")
$colors = @{ INFO = "White"; SUCCESS = "Green"; WARNING = "Yellow"; ERROR = "Red"; HEADER = "Cyan" }
$timestamp = Get-Date -Format "HH:mm:ss"
$line = "[$timestamp][$Level] $Message"
Write-Host $line -ForegroundColor $colors[$Level]
Add-Content -Path $logFile -Value $line -Encoding UTF8
}
function Format-Size {
param([long]$Bytes)
if ($Bytes -ge 1GB) { return "{0:N2} GB" -f ($Bytes / 1GB) }
if ($Bytes -ge 1MB) { return "{0:N2} MB" -f ($Bytes / 1MB) }
return "{0:N2} KB" -f ($Bytes / 1KB)
}
function Test-Prerequisites {
# Check drive availability
$drive = Split-Path -Qualifier $BackupPath
if (!(Test-Path $drive)) {
Write-Log "Drive $drive is not accessible. Check your backup destination." "ERROR"
exit 1
}
# Check available disk space (warn if < 10 GB)
$freeSpace = (Get-PSDrive -Name $drive.TrimEnd(':') -ErrorAction SilentlyContinue).Free
if ($null -ne $freeSpace -and $freeSpace -lt 10GB) {
Write-Log ("Low disk space on {0} : {1} remaining." -f $drive, (Format-Size $freeSpace)) "WARNING"
}
# Check WSL availability
try {
$null = Get-Command wsl -ErrorAction Stop
} catch {
Write-Log "WSL command not found. Is WSL installed and accessible?" "ERROR"
exit 1
}
# Check admin rights (recommended for wsl --shutdown)
$isAdmin = ([Security.Principal.WindowsPrincipal] `
[Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole(
[Security.Principal.WindowsBuiltInRole]::Administrator)
if (!$isAdmin) {
Write-Log "Script is not running as Administrator. wsl --shutdown may fail." "WARNING"
}
}
function Get-WslDistributions {
# Force UTF-8 encoding to avoid UTF-16 LE artifacts from wsl --list
$prevEncoding = [Console]::OutputEncoding
[Console]::OutputEncoding = [System.Text.Encoding]::UTF8
try {
$raw = wsl --list --quiet 2>&1
} finally {
[Console]::OutputEncoding = $prevEncoding
}
$distros = $raw | ForEach-Object {
# Strip null characters and BOM-like artifacts
$_ -replace 'x00', '' -replace '^xEFxBBxBF', ''
} | Where-Object { $_.Trim() -ne "" }
if (!$distros -or $distros.Count -eq 0) {
Write-Log "No WSL distribution found." "ERROR"
exit 1
}
return $distros
}
function Remove-OldBackups {
$cutoff = (Get-Date).AddDays(-$RetentionDays)
# Le @(...) force PowerShell à traiter le résultat comme un tableau (Array)
$oldFiles = @(Get-ChildItem $BackupPath -Include "*.tar","*.tar.gz" -Recurse |
Where-Object { $_.LastWriteTime -lt $cutoff })
# Désormais .Count fonctionnera même avec un seul fichier trouvé
if ($oldFiles.Count -eq 0) {
Write-Log "No archives older than $RetentionDays days to delete." "INFO"
return
}
foreach ($file in $oldFiles) {
try {
Remove-Item $file.FullName -Force
Write-Log "Deleted old archive: $($file.Name)" "INFO"
} catch {
Write-Log "Could not delete: $($file.Name) — $_" "WARNING"
}
}
}
# ─────────────────────────────────────────────
# MAIN
# ─────────────────────────────────────────────
# Create backup folder if needed
if (!(Test-Path $BackupPath)) {
New-Item -ItemType Directory -Force -Path $BackupPath | Out-Null
}
# Initialize log file
$null = New-Item -ItemType File -Path $logFile -Force
Write-Log "══════════════════════════════════════" "HEADER"
Write-Log " WSL BACKUP — $date" "HEADER"
Write-Log " Destination : $BackupPath" "HEADER"
Write-Log " Retention : $RetentionDays days" "HEADER"
Write-Log "══════════════════════════════════════" "HEADER"
# Prerequisite checks
Test-Prerequisites
# Rotate old backups before starting
Write-Log "Checking archives to rotate..." "INFO"
Remove-OldBackups
# Shutdown WSL to ensure filesystem consistency
Write-Log "Shutting down WSL instances (ensures ext4 consistency)..." "INFO"
wsl --shutdown
Start-Sleep -Seconds 3 # Allow time for complete shutdown
# Retrieve distributions
$distros = Get-WslDistributions
Write-Log "$($distros.Count) distribution(s) found : $($distros -join ', ')" "INFO"
# Backup counters
$successCount = 0
$failCount = 0
$totalStart = Get-Date
foreach ($distro in $distros) {
$cleanDistro = $distro.Trim()
$extension = if ($Compress) { "tar.gz" } else { "tar" }
$fileName = "${cleanDistro}_${date}.${extension}"
$fullPath = Join-Path $BackupPath $fileName
Write-Log "──────────────────────────────────────" "HEADER"
Write-Log "Exporting : $cleanDistro → $fileName" "INFO"
$startTime = Get-Date
try {
if ($Compress) {
# Export via pipe to gzip (requires gzip in PATH or WSL)
wsl --export $cleanDistro - | & gzip -c | Set-Content $fullPath -AsByteStream
} else {
wsl --export $cleanDistro $fullPath
}
# Validate output
if (!(Test-Path $fullPath)) {
throw "Archive not found after export."
}
$fileSize = (Get-Item $fullPath).Length
if ($fileSize -eq 0) {
throw "Archive created but is empty (0 bytes)."
}
$elapsed = (Get-Date) - $startTime
Write-Log ("✔ Success : {0} | Size : {1} | Duration : {2:mm:ss}" -f `
$fileName, (Format-Size $fileSize), $elapsed) "SUCCESS"
$successCount++
} catch {
Write-Log "✖ Error exporting $cleanDistro : $_" "ERROR"
# Clean up partial file if it exists
if (Test-Path $fullPath) { Remove-Item $fullPath -Force }
$failCount++
}
}
# ─────────────────────────────────────────────
# SUMMARY
# ─────────────────────────────────────────────
$totalElapsed = (Get-Date) - $totalStart
Write-Log "══════════════════════════════════════" "HEADER"
Write-Log " BACKUP COMPLETE" "HEADER"
Write-Log (" ✔ Success : {0} | ✖ Errors : {1}" -f $successCount, $failCount) "HEADER"
Write-Log (" Total duration : {0:mm:ss}" -f $totalElapsed) "HEADER"
Write-Log " Log file : $logFile" "HEADER"
Write-Log "══════════════════════════════════════" "HEADER"
# Exit code reflects overall status
exit $failCount
Retrouvez le script sur GitHub : nous maintenons ce script sur notre dépôt GitHub. Vous y trouverez les dernières mises à jour de sécurité et de performance.
Comment utiliser ce script ?
- Enregistrement : Copiez le code ci-dessus dans un fichier nommé backup_wsl.ps1.
- Exécution : Faites un clic droit sur le fichier et choisissez « Exécuter avec PowerShell ».
- Planification : Pour une automatisation totale, vous pouvez créer une tâche dans le Planificateur de tâches Windows ou un autre ordonnanceur Windows pour exécuter ce script chaque semaine.
Pourquoi cette méthode est-elle supérieure à l’image disque ?
- Portabilité : Une archive .tar peut être importée sur n’importe quel autre PC Windows avec une simple commande wsl –import.
- Intégrité : L’arrêt forcé (wsl –shutdown) garantit qu’aucun processus Linux ne modifie le disque virtuel pendant l’opération, évitant ainsi toute corruption du système de fichiers ext4.
- Granularité : Vous pouvez restaurer uniquement une distribution spécifique (par exemple votre environnement de développement IA) sans toucher à votre installation Windows globale.
En combinant ce script avec une image système réalisée via un outil comme Veeam ou Hasleo, vous atteignez un niveau de résilience professionnel pour votre poste de travail hybride.
Comparatif des solutions tierces pour les backup WSL Windows 11
Veeam Agent for Microsoft Windows Free
Considéré comme une référence technique, ce logiciel capture correctement les fichiers .vhdx via VSS. Sa gestion des sauvegardes au niveau bloc permet de ne transférer que les parties modifiées du disque virtuel, ce qui est crucial pour les volumes importants.
- Analyse : Très robuste, mais interface orientée administration système.
Hasleo Backup Suite Free
Solution montante pour le backup de Windows, Hasleo propose une réduction significative du temps de restauration grâce au « Delta Restore » (comparaison bitmap des blocs).
- Analyse : Inclut le clonage de disque et le chiffrement sans frais, une alternative crédible aux solutions payantes.
AOMEI Backupper Standard
Privilégié pour son ergonomie, il permet une mise en place rapide d’une stratégie de sauvegarde.
- Analyse : Moins complet en version gratuite (pas de sauvegarde différentielle), il reste efficace pour des images système ponctuelles.
Important : ces logiciels ne comprennent pas WSL
Il est crucial de comprendre que Veeam, Hasleo ou AOMEI sauvegardent le fichier .vhdx comme un conteneur opaque.
- Ils ne « voient » pas le système de fichiers Linux (ext4) à l’intérieur.
- La restauration granulaire proposée par ces outils concerne vos fichiers Windows (Host), pas les fichiers internes à votre distribution WSL.
- Pour récupérer un fichier précis dans /home/user/, vous devrez soit restaurer tout le .vhdx, soit utiliser l’export .tar.
La règle du 3-2-1 : la base de la résilience
Une stratégie de sauvegarde, aussi sophistiquée soit-elle, ne vaut que par la redondance des supports. Pour un développeur, la perte de son environnement de travail signifie souvent des heures de reconfiguration. Appliquez la méthode universelle 3-2-1 :
- 3 copies de vos données : L’originale sur votre SSD, une sauvegarde locale, et une sauvegarde déportée.
- 2 supports différents : Ne stockez pas tout sur le même disque physique. Utilisez par exemple un disque externe USB-C et un NAS.
- 1 copie hors site : Indispensable en cas de sinistre physique (vol, incendie). Un stockage Cloud chiffré ou un disque dur conservé dans un autre lieu géographique remplit ce rôle.
Le point critique : Le support de récupération WinPE
Posséder une image système est une sécurité de façade si vous n’avez pas anticipé l’incapacité de Windows à démarrer. Si votre table de partition est corrompue ou votre SSD principal défaillant, vous ne pourrez pas accéder à l’interface de restauration de votre logiciel.
La procédure de survie : Tous les outils mentionnés (Veeam, Hasleo, AOMEI) proposent une option « Créer un support de récupération ». Ce processus génère une image Windows PE (un environnement de pré-installation léger) sur une clé USB.
- Dédiez une clé USB (8 Go suffisent) à cet usage unique.
- Générez le support via l’utilitaire de votre logiciel de sauvegarde.
- Testez-la immédiatement : Redémarrez votre PC sur cette clé (via le menu BIOS/UEFI) pour confirmer que le logiciel de restauration se lance et qu’il détecte bien votre disque dur externe contenant vos sauvegardes.
Conclusion : vers une stratégie de sauvegarde hybride
En 2026, la gestion d’un poste de travail Windows 11 exige une approche hybride, calquée sur les besoins des infrastructures serveurs. La sauvegarde « développeur » ne peut plus se contenter des outils natifs si elle intègre des technologies comme Docker ou WSL 2.
La solution la plus équilibrée consiste à combiner :
- OneDrive ou l’Historique des fichiers pour la disponibilité immédiate des documents personnels.
- Une image système régulière (Veeam ou Hasleo) après un wsl –shutdown pour la résilience de l’OS.
- Des exports .tar ponctuels de vos distributions WSL les plus critiques avant chaque changement majeur de configuration.
Cette triple sécurité vous assure de pouvoir restaurer un environnement complet, cohérent et fonctionnel, quelle que soit la gravité de la panne.
Pour ne rien rater, abonnez-vous à Cosmo Games sur Google News et suivez-nous sur X (ex Twitter) en particulier pour les bons plans en direct. Vos commentaires enrichissent nos articles, alors n'hésitez pas à réagir ! Un partage sur les réseaux nous aide énormément. Merci pour votre soutien !
