WSLディストリビューションのバックアップ

Linux
目次

ディストリビューション

wsl --installは指定しなければUbuntuがインストールされます。
当方はAlmaLinux-8をインストールしていますので他ディストリビューションでは動作確認していません。

AlmaLinux-8のインストールは、Microsoft Storeから

基本コマンド

Power Shell

PS C:\> wsl --export WSLDISTRIBUTION BACKUPNAME.tar 

Power Shell スクリプト(Export)

# エクスポートするインスタンス
$wslInstanceName = Read-Host "対象インスタンス名を入力してください (例: Ubuntu)"

# 現在の日時を取得(yyyymmddHHmmss形式)
$currentDateTime = Get-Date -Format "yyyyMMddHHmmss"

# エクスポートファイルを保存するディレクトリ
$exportDirectory = "${wslInstanceName}"

# ディレクトリが存在しない場合は作成
if (-Not (Test-Path $exportDirectory)) {
    New-Item -ItemType Directory -Path $exportDirectory
}

# WSLインスタンスをエクスポート(指定ディレクトリに保存)
$tarFileName = "${exportDirectory}\${wslInstanceName}-${currentDateTime}.tar"
wsl --export $wslInstanceName $tarFileName

# .tarファイルを.zip形式で圧縮
Compress-Archive -Path $tarFileName -DestinationPath "${tarFileName}.zip"

# 圧縮後、元の.tarファイルを削除(オプション)
Remove-Item -Path $tarFileName

# ユーザーに更新内容を入力させる
$updateContent = Read-Host "更新内容を入力してください"

# 現在のreleasenote.txtの内容を一時的に保存
if (Test-Path "releasenote.txt") {
    $currentContent = Get-Content -Path "releasenote.txt"
}

# 新しい行をreleasenote.txtの先頭に追加
$newContent = "${currentDateTime}:${wslInstanceName}: $updateContent"
Set-Content -Path "releasenote.txt" -Value $newContent

# 以前の内容を新しい行の後に追加
if ($currentContent) {
    Add-Content -Path "releasenote.txt" -Value $currentContent
}

Power Shell スクリプト(Import)

# Zipファイル名とWSLのインスタンス名、インストール先のパスを指定
$zipFileName = Read-Host "解凍するZipファイル名を入力してください (例: myBackup20210916.tar.zip)"
$wslInstanceName = Read-Host "新しいWSLインスタンスの名前を入力してください (例: NewLinux)"
$installLocation = Read-Host "WSLインスタンスを保存するディレクトリを入力してください (例: C:\WSL\Instances)"

# もしユーザーが ~ で始めた場合は、それをフルパスに変換
if ($installLocation.StartsWith("~")) {
    $installLocation = $installLocation.Replace("~", $env:USERPROFILE)
}

# ディレクトリが存在しない場合は作成
if (-Not (Test-Path $installLocation)) {
    New-Item -ItemType Directory -Path $installLocation
}

# Zipファイルが存在するか確認
if (-Not (Test-Path $zipFileName)) {
    Write-Host "指定されたZipファイルが見つかりません。"
    Exit
}

# Zipファイルを解凍
$tarFileName = [io.path]::GetFileNameWithoutExtension($zipFileName)
Expand-Archive -Path $zipFileName -DestinationPath . -Force

# WSLインスタンスをインポート
wsl --import $wslInstanceName $installLocation $tarFileName

# オプション: 解凍した.tarファイルを削除
Remove-Item -Path $tarFileName

記事掲載経緯

Docker環境が面倒になった

Docker命みたいなところあったけどWSLとVSCodeあれば事足りると気付きました。

パッケージやらインストールしなきゃいけないのはどっちもじゃん

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

代表猫ナナの筆頭使用人。趣味は観葉植物の世話とベースプレイ。好きな言葉は恩師から教わった「青は藍より出でて藍より青し」と「システムはデジタルにあらず」。

コメント

コメントする

CAPTCHA


目次