WSL архивиране и възстановяване с PowerShell
Три готови PowerShell функции за WSL – wslbackup, wslstatus и wslrestore: код, параметри, примери за употреба и работен процес стъпка по стъпка.
Зависимости
Windows Subsystem for Linux (WSL 2)PowerShell 5.1+ или PowerShell 7+ Употреба
Импортирайте функциите във вашия PowerShell $PROFILE или ги изпълнете директно в конзолата. Работата с Windows Subsystem for Linux (WSL) се превърна в стандарт за много софтуерни инженери, системни администратори и DevOps специалисти. Независимо дали използвате Ubuntu, Debian или друга дистрибуция, редовният backup е това, което ви спестява часове преинсталиране, ако нещо се обърка.
В тази статия са събрани три PowerShell функции, които покриват ежедневната поддръжка на WSL:
| Функция | Какво прави |
|---|---|
wslbackup |
Архивира дистрибуция в .tar файл с дата в името |
wslstatus |
Показва инсталираните дистрибуции и заетото място във всяка |
wslrestore |
Импортира .tar архив като нова дистрибуция |
Първо ще подготвим PowerShell профила, за да са функциите винаги налични във всеки нов терминал. След това за всяка функция ще намерите готовия код, обяснение как се извиква и примери.
Преди да започнете
Проверете, че WSL работи, и запишете точното име на дистрибуцията си – то ще ви трябва като параметър:
wsl --version
wsl --list --verbose
Примерен изход:
NAME STATE VERSION
* Ubuntu Running 2
Името е в колоната NAME (тук – Ubuntu). Ако при вас е например Ubuntu-24.04 или Debian, ще го подавате чрез -Distro.
Подготовка: PowerShell профил
Най-удобно е функциите да живеят във вашия PowerShell профил – скрипт, който PowerShell изпълнява при всяко стартиране. Така wslbackup, wslstatus и wslrestore са налични във всеки нов терминал. Подготовката се прави еднократно.
Ако искате само да пробвате, можете да поставите функция директно в конзолата. Тя обаче изчезва при затваряне на прозореца.
Стъпка 1 – Разрешете изпълнението на скриптове
Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy RemoteSigned
В Windows PowerShell 5.1 скриптовете (включително профилът) по подразбиране са блокирани и без тази команда функциите няма да се заредят. В PowerShell 7 политиката обикновено вече е RemoteSigned. Можете да проверите с:
Get-ExecutionPolicy -List
Стъпка 2 – Създайте профила, ако още го няма
if (-not (Test-Path $PROFILE)) { New-Item -ItemType File -Path $PROFILE -Force | Out-Null }
-Force създава и липсващите папки по пътя (например Documents\PowerShell). Правете тази стъпка преди notepad $PROFILE, защото Notepad не създава липсващи папки.
Стъпка 3 – Отворете профила
notepad $PROFILE
Стъпка 4 – Добавете функциите
Поставете във файла функциите от разделите по-долу – най-лесно е да ги добавяте една по една. След това запишете (Ctrl+S) и затворете Notepad.
Ако ползвате Windows PowerShell 5.1, запишете файла с кодировка UTF-8 with BOM (File → Save As → Encoding). Без BOM версия 5.1 чете файла като ANSI и кирилицата и емотиконите в съобщенията се показват като нечетими знаци. PowerShell 7 чете UTF-8 без проблеми.
Стъпка 5 – Заредете профила и проверете
. $PROFILE
Get-Command wslbackup, wslstatus, wslrestore
Внимавайте с точката в началото на първия ред: . $PROFILE (точка, интервал, $PROFILE). Във всеки нов терминал профилът се зарежда автоматично.
Профилите на Windows PowerShell 5.1 и PowerShell 7 са различни файлове. Променливата
$PROFILEсочи към този на терминала, в който я изпълнявате. Ако ползвате и двата, добавете функциите и в двата.
1. Архивиране: wslbackup
Кодът
function wslbackup {
param(
[string]$Distro = "Ubuntu",
[string]$BackupDir = "D:\WSL_Backups_2026"
)
# Създава папката за архиви, ако я няма
if (-not (Test-Path $BackupDir)) {
New-Item -ItemType Directory -Path $BackupDir -Force | Out-Null
}
$stamp = Get-Date -Format "yyyy-MM-dd_HH-mm"
$targetPath = Join-Path $BackupDir "${Distro}_Backup_$stamp.tar"
Write-Host "🛑 Спиране на WSL..." -ForegroundColor Yellow
wsl --shutdown
Start-Sleep -Seconds 3
Write-Host "📦 Архивиране на '$Distro' в $targetPath ..." -ForegroundColor Cyan
wsl --export $Distro $targetPath
if ($LASTEXITCODE -eq 0) {
$sizeGB = [math]::Round((Get-Item $targetPath).Length / 1GB, 2)
Write-Host "✅ Бекъпът завърши успешно ($sizeGB GB)." -ForegroundColor Green
} else {
Write-Host "❌ Грешка при създаване на бекъп!" -ForegroundColor Red
# Изтриваме недовършения файл, за да не го вземем по погрешка за валиден архив
Remove-Item $targetPath -ErrorAction SilentlyContinue
}
}
Как се използва
# Архивира дистрибуцията "Ubuntu" в D:\WSL_Backups_2026
wslbackup
# Архивира друга дистрибуция
wslbackup -Distro Debian
# Архивира в друга папка
wslbackup -Distro Ubuntu -BackupDir "E:\Backups\WSL"
| Параметър | По подразбиране | Значение |
|---|---|---|
-Distro |
Ubuntu |
Името на дистрибуцията (колоната NAME от wsl -l -v) |
-BackupDir |
D:\WSL_Backups_2026 |
Папката, в която се записва архивът |
Резултатът е файл от вида:
D:\WSL_Backups_2026\Ubuntu_Backup_2026-09-20_14-30.tar
Датата е във формат година-месец-ден, така че файловете се подреждат хронологично по име. Часът и минутите в името гарантират, че втори бекъп в същия ден не презаписва първия.
Какво се случва при изпълнение
- Създава се папката
BackupDir, ако не съществува. wsl --shutdownспира всички WSL 2 виртуални машини, така че файловата система да не се променя по време на архивирането.Start-Sleep -Seconds 3дава кратка пауза за пълното спиране.wsl --exportзаписва цялата файлова система на дистрибуцията в.tarфайл.- Функцията проверява
$LASTEXITCODEи показва размера на архива или съобщение за грешка.
Проверка на резултата
Get-ChildItem D:\WSL_Backups_2026 |
Select-Object Name, @{n='GB'; e={ [math]::Round($_.Length / 1GB, 2) }}, LastWriteTime
Какво да имате предвид
wsl --shutdownспира всички дистрибуции и затваря отворените WSL терминали, VS Code Remote сесиите и Docker Desktop backend-а, ако го ползвате. Запишете работата си преди да стартирате функцията.- Архивът е некомпресиран
.tar, така че заема приблизително толкова, колкото е заетото място в дистрибуцията. Проверете, че на целевия диск има достатъчно свободно място. - Времето зависи от размера на дистрибуцията – при десетки гигабайти може да отнеме минути.
2. Статус и дисково пространство: wslstatus
Кодът
function wslstatus {
Write-Host "🖥️ WSL Статус" -ForegroundColor Cyan
Write-Host "=================="
# wsl.exe извежда списъците си в UTF-16, затова кодировката се сменя
# само за тези две команди и после се връща
$prevEncoding = [Console]::OutputEncoding
try {
[Console]::OutputEncoding = [System.Text.Encoding]::Unicode
Write-Host "`n📦 Инсталирани дистрибуции:" -ForegroundColor Yellow
wsl --list --verbose
$names = @(wsl --list --quiet | ForEach-Object { $_.Trim() } | Where-Object { $_ })
}
finally {
[Console]::OutputEncoding = $prevEncoding
}
Write-Host "`n💾 Дисково пространство (root /):" -ForegroundColor Yellow
foreach ($name in $names) {
# df -hP дава един ред за "/" и приключва мигновено
$line = wsl -d $name -e df -hP / 2>$null | Select-Object -Last 1
if ($LASTEXITCODE -eq 0 -and $line) {
$c = $line -split '\s+' # [1]=Size [2]=Used [4]=Use%
Write-Host (" 📌 {0}: {1} използвани от {2} ({3})" -f $name, $c[2], $c[1], $c[4]) -ForegroundColor Green
} else {
Write-Host " 📌 ${name}: не може да се измери" -ForegroundColor DarkGray
}
}
}
Как се използва
Функцията няма параметри – просто я извикайте:
wslstatus
Примерен изход (стойностите при вас ще са различни):
🖥️ WSL Статус
==================
📦 Инсталирани дистрибуции:
NAME STATE VERSION
* Ubuntu Running 2
Debian Stopped 2
💾 Дисково пространство (root /):
📌 Ubuntu: 18G използвани от 1007G (2%)
📌 Debian: 3.1G използвани от 1007G (1%)
Първата част е стандартният списък на wsl --list --verbose: звездичката * отбелязва дистрибуцията по подразбиране, а колоните STATE и VERSION показват дали работи и дали е WSL 1 или 2. Втората част показва за всяка дистрибуция колко е заето от виртуалния диск.
Как да четете резултата
- „използвани“ е реално заетото място във файловата система на дистрибуцията.
- „от 1007G“ е горната граница на виртуалния диск, не свободното място на вашия физически диск. Стойността зависи от версията на WSL.
- Файлът
ext4.vhdxна Windows страната не се свива автоматично, когато изтривате файлове в Linux. Затова заетото място вwslstatusможе да е по-малко от размера на файла на диска.
Какво да имате предвид
-
За да измери мястото, функцията изпълнява команда във всяка дистрибуция, а това стартира спряните. Ако искате да ги оставите спрани, ползвате само
wsl --list --verbose. -
Помощните дистрибуции на Docker Desktop (
docker-desktop) може да не върнат стойност – за тях ще видите „не може да се измери“. -
Ако искате точно да преброите какво заема дадена папка, изпълнете
duсъс-x(само една файлова система):wsl -d Ubuntu -e du -shx /homeПолзвайте
-xвинаги, когато обхождате/: без негоduнавлиза в/mnt/cи другите монтирани Windows дискове и работи много дълго.
3. Възстановяване: wslrestore
Кодът
function wslrestore {
param(
[Parameter(Mandatory = $true)]
[string]$BackupFile,
[string]$DistroName = "Ubuntu_Restored",
[string]$InstallLocation = "D:\WSL\Restored"
)
if (-not (Test-Path $BackupFile)) {
Write-Host "❌ Файлът за бекъп не е намерен: $BackupFile" -ForegroundColor Red
return
}
Write-Host "🔄 Започва възстановяване на $DistroName..." -ForegroundColor Cyan
# Папката, в която ще се запише виртуалният диск на новата дистрибуция
New-Item -ItemType Directory -Force -Path $InstallLocation | Out-Null
wsl --import $DistroName $InstallLocation $BackupFile
if ($LASTEXITCODE -eq 0) {
Write-Host "✅ Възстановяването завърши успешно!" -ForegroundColor Green
Write-Host "📦 Дистрибуция: $DistroName"
Write-Host "📁 Инсталирана в: $InstallLocation"
Write-Host "💡 За да стартирате: wsl -d $DistroName"
} else {
Write-Host "❌ Възстановяването не успя!" -ForegroundColor Red
}
}
Как се използва
# Най-простият вариант – само файлът е задължителен
wslrestore -BackupFile "D:\WSL_Backups_2026\Ubuntu_Backup_2026-09-20_14-30.tar"
# Със собствено име и папка
wslrestore -BackupFile "D:\WSL_Backups_2026\Ubuntu_Backup_2026-09-20_14-30.tar" `
-DistroName "Ubuntu_DevEnv" `
-InstallLocation "D:\WSL\Instances\Ubuntu_DevEnv"
| Параметър | По подразбиране | Значение |
|---|---|---|
-BackupFile |
– (задължителен) | Пътят до .tar архива |
-DistroName |
Ubuntu_Restored |
Името на новата дистрибуция |
-InstallLocation |
D:\WSL\Restored |
Папка за ext4.vhdx на новата дистрибуция |
След успешно изпълнение проверете и стартирайте новата дистрибуция:
wsl --list --verbose
wsl -d Ubuntu_DevEnv
Правила, които е важно да знаете
wslrestoreне презаписва съществуваща дистрибуция, а създава нова. Ако името вече е заето,wsl --importвръща грешка – изберете друго-DistroName.- Всяка дистрибуция има нужда от своя папка в
-InstallLocation. Не ползвайте една и съща папка за две дистрибуции. - Оригиналът остава недокоснат, докато не решите да го изтриете.
След възстановяване: потребител по подразбиране
Импортирана дистрибуция обикновено се отваря като root, а не като вашия потребител. Поправя се веднъж:
wsl -d Ubuntu_DevEnv -u root
След това, вече в Linux терминала (заменете USERNAME с вашето потребителско име и първо прегледайте файла, за да не дублирате секция [user]):
cat /etc/wsl.conf
printf '[user]\ndefault=USERNAME\n' >> /etc/wsl.conf
exit
Накрая рестартирайте дистрибуцията, за да влезе в сила промяната:
wsl --terminate Ubuntu_DevEnv
wsl -d Ubuntu_DevEnv
⚠️ Изтриване на оригинала. Ако искате да заместите старата дистрибуция с възстановената, командата
wsl --unregister <име>я изтрива необратимо, заедно с всички данни в нея. Правете го само след като сте стартирали възстановената дистрибуция и сте се уверили, че файловете ви са там.
4. Пример за пълен работен процес
Така изглежда типичен цикъл – проверка, бекъп, проверка на архива и (при нужда) възстановяване:
# 1. Какво имам и колко място заема
wslstatus
# 2. Правя бекъп
wslbackup
# 3. Проверявам, че архивът е на мястото си
Get-ChildItem D:\WSL_Backups_2026 | Sort-Object LastWriteTime -Descending | Select-Object -First 3
# 4. При нужда – възстановявам като нова дистрибуция (на друг компютър или за тест)
wslrestore -BackupFile "D:\WSL_Backups_2026\Ubuntu_Backup_2026-09-20_14-30.tar" -DistroName "Ubuntu_Test"
# 5. Проверявам, че всичко е наред
wsl -d Ubuntu_Test
Добра практика е периодично да тествате възстановяването, а не само архивирането. Бекъп, който никога не е бил възстановяван, не е доказано работещ.
Заключение
С wslbackup, wslstatus и wslrestore разполагате с пълен цикъл за поддръжка на WSL: правите архив с една команда, следите заетото място и можете да пренесете или възстановите среда за минути. Веднъж добавени в $PROFILE, те са достъпни от всеки нов терминал.