WSL备份与还原

1 利用wsl export/import备份还原linux子系统

1.1 wsl命令介绍

通过wsl --help查看命令介绍:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
用于运行 Linux 二进制文件的参数:
如果未提供任何命令行,wsl.exe 将启动默认 shell。
--exec, -e <CommandLine>
在不使用默认 Linux shell 的情况下执行指定的命令。
--
按原样传递剩余的命令行。

选项:
--distribution, -d <DistributionName>
运行指定的分发。
--user, -u <UserName>
以指定用户身份运行。
用于管理 Windows Subsystem for Linux 的参数:
--export <DistributionName> <FileName>
将分发导出到 tar 文件。 文件名可为 - 以便标准输出。
--import <DistributionName> <InstallLocation> <FileName>
将指定的 tar 文件作为新分发导入。 文件名可为 - 以便标准输入。
--list, -l [选项]
列出分发。
选项:
--all
列出所有分发,包括当前 正在安装或卸载的分发。
--running
仅列出当前正在运行的分发。
-setdefault, -s <DistributionName>
将分发设置为默认值。
--terminate, -t <DistributionName>
终止分发。
--unregister <DistributionName>
注销分发。
--upgrade <DistributionName>
将分发升级为 WslFs 文件系统格式。
--help
显示用法信息。

1.2 子系统备份与还原

  • Step1: 通过wsl -l -running查看正在运行的子系统
  • Step2: 若有正在运行的子系统,则通过wsl -t <DistributionName>来终止其运行
  • Step3: 利用wsl --export <DistributionName> <FileName>来备份子系统,结果会得到一个tar归档文件。
    假设有名为Ubuntu-18.04的子系统, 想要将结果文件保存为Ubuntu1804.tar
    (同时指定其路径即为D:\wsl\Ubuntu1804.tar),则调用的命令为
    wsl --export Ubuntu-18.04 D:\wsl\Ubuntu1804.tar
  • Step4: 然后利用wsl --import <DistributionName> <InstallLocation> <FileName>来恢复子系统。
    例如wsl --import Ubuntu D:\wsl\Ubuntu1804\ D:\wsl\Ubuntu1804.tar(将新恢复的子系统命名为Ubuntu)
  • Step5(可选):使用wsl --unregister Ubuntu-18.04注销原始子系统。

2 问题及解决方案

2.1 问题描述

新还原的Ubuntu子系统的默认用户会变成root,无论是在Windows Terminal中打开Ubuntu还是在vscode中通过Remote-WSL启动Ubuntu,默认的用户都是root(在原始子系统中vscode-server是安装在个人用户目录下的,还原后默认用户为root就会重新在root目录中重装,且无法使用原来安装的插件,因此必须要想法办修改子系统默认用户)。

2.2 修改wsl子系统默认用户

参考:问题#3974merkuriy的回答

其思路即修改注册表中相关的键值,即将注册表
计算机\HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Lxss\{...}
中的DefaultUid值设置为子系统用户对应的gid值(通过id -u来获取,或者直接查看/etc/passwd文件)。通过定义PowerShell函数,然后调用来实现,具体代码如下:

1
2
3
4
5
6
7
8
# 定义函数WSL-SetDefaultUser,接收参数distro和user
Function WSL-SetDefaultUser ($distro, $user) { Get-ItemProperty Registry::HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Lxss\*\ DistributionName | Where-Object -Property DistributionName -eq $distro | Set-ItemProperty -Name DefaultUid -Value ((wsl -d $distro -u $user -e id -u) | Out-String); };

# 调用函数,此处对应发行版名称Ubuntu,用户名为yz: WSL-SetDefaultUser <DistroName> <UserName>
WSL-SetDefaultUser Ubuntu yz

# 取消函数定义
Remove-Item Function:WSL-SetDefaultUser