WSL备份与还原
创建时间: 2020-05-30 13:51:24
摘要: win10系统中Linux子系统默认安装在C盘,在使用过程中,其体量会越来越大,挤占C盘原本就不大的磁盘空间,影响系统运转。因此,很有必要将子系统从C盘迁移到别的磁盘。本文介绍如何利用wsl export/import来迁移Linux子系统,以及迁移过程中遇到的问题
1 利用wsl export/import备份还原linux子系统
1.1 wsl命令介绍
通过wsl --help查看命令介绍:
用于运行 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.tarStep4: 然后利用
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子系统默认用户
参考:问题#3974中merkuriy的回答
其思路即修改注册表中相关的键值,即将注册表
计算机\HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Lxss\{...}
中的DefaultUid值设置为子系统用户对应的gid值(通过id -u来获取,或者直接查看/etc/passwd文件)。通过定义PowerShell函数,然后调用来实现,具体代码如下:
# 定义函数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