Назад към каталога
Илюстрация на автоматизация: терминал, зъбчати колела и конвейер от задачи
Автоматизация ⭐ Препоръчан v1.0.0 • 20.09.2026 г. • 📄 other

WSL архивиране и възстановяване с PowerShell

Три готови PowerShell функции за WSL – wslbackup, wslstatus и wslrestore: код, параметри, примери за употреба и работен процес стъпка по стъпка.

Зависимости

Windows Subsystem for Linux (WSL 2)PowerShell 5.1+ или PowerShell 7+

Употреба

Импортирайте функциите във вашия PowerShell $PROFILE или ги изпълнете директно в конзолата.
wslpowershelllinuxbackupwindows

Работата с 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

Датата е във формат година-месец-ден, така че файловете се подреждат хронологично по име. Часът и минутите в името гарантират, че втори бекъп в същия ден не презаписва първия.

Какво се случва при изпълнение

  1. Създава се папката BackupDir, ако не съществува.
  2. wsl --shutdown спира всички WSL 2 виртуални машини, така че файловата система да не се променя по време на архивирането.
  3. Start-Sleep -Seconds 3 дава кратка пауза за пълното спиране.
  4. wsl --export записва цялата файлова система на дистрибуцията в .tar файл.
  5. Функцията проверява $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, те са достъпни от всеки нов терминал.