如何在系统重置或重新安装之前备份(WSL)Windows 10的Linux子系统?

我的问题是,由于一些问题,我不得不重置或重新安装Windows,但我花了很多时间来配置WSL进行开发,不想失去它。 有没有办法备份整个WSL及其设置、已安装的模块、插件、用户等,并在重置或重新安装Windows后恢复它?我在这个话题上搜索了很多,但找不到任何有用的信息。 否则,如果没有备份的方法,Windows 10重置会完全删除WSL吗?
4个回答

Windows 10 v1903 包含了一个内置的WSL导出/导入命令。具体来说,wsl --export会生成一个tar文件,而wsl --import则用于导入之前导出的tar文件。您可以将此文件在不同计算机之间移动。

您还可以使用-来指定标准输入/输出,这样您就可以直接传输到另一台计算机,并使用类似ssh的远程shell进行导入。


1wsl --import 还可以导入 tar.gz 文件。这些命令在内部启动 %SystemRoot%\System32\lxss\tools\bsdtar ELF64 二进制文件。 - Biswapriyo
1为了帮助那些紧张的人,我提供一点经验数据:wsl --export 可能比你想象的要花更长时间。在我的机器上,它大约花费了10分钟只写了几兆字节,然后最终生成了一个3.2GB的tar文件。 - scruss
WSL2有一些严重的内存占用倾向,但这只是...导出一个相当旧的发行版使内存使用量飙升到29 GB,并且使我的机器变得非常缓慢! - DividedByZero
1@DividedByZero 实际上,对于这个问题有一个解决方法。请参考 https://github.com/microsoft/WSL/issues/4166#issuecomment-526725261 - David Jung
2当你运行这个命令时,显然会终止当前正在运行的WSL。 - AmanicA
命令是 wsl --export distro-name file-name.tar,用于导出发行版名称。要获取发行版名称,请使用命令 wsl --list -v - buncis
我浪费了几个世纪的时间来解决“访问被拒绝”错误。原来必须明确指定.tar目标文件!!例如:wsl --export <distro> ..\wsl_backup.tar,而不能依赖默认文件名。真是愚蠢透顶。 - bloody

如何备份?

有很多方法,但其中一种常见做法是使用 tar 创建要备份的文件的存档(以便在重新创建环境时重新安装所有内容)。编写一个简单的 backup.sh 脚本可以更轻松地按照定期计划进行反复备份。

备份什么?

大部分配置都存储在 Linux 的 .___ 配置文件中,通常位于您的 ~/ 文件夹中。您可能还希望备份您的 /etc/ssh/ssh_config 和其他类似的系统配置文件,不过请小心处理包含特定实例密钥/数据等的复杂配置文件。

您可以使用 dpkg-query -f '${binary:Package}\n' -W 生成您的 apt 包列表,并将其输出到一个文件中,该文件也可以进行备份。

备份到哪里?

你可以将这些tar存档复制到另一个位置。我们建议将其复制到一个可访问Windows的文件夹(例如/mnt/c/backups),然后可以将它复制到OneDrive、DropBox、外部硬盘驱动器、FTP或其他地方。 2020-02-18更新: 在Windows 10 1903中,我们提供了一个更新的wsl.exe工具,它包括将发行版的内容导出/导入到外部存档的功能,极大地简化了备份和/或在计算机之间移动发行版的过程! 希望对你有所帮助。

备份和恢复完整的WSL Linux发行版,您可以尝试以下步骤:(1)创建一个包含文件系统的.tar.gz文件,(2)使用互联网上提供的一些安装工具来恢复备份副本:
  • LxRunOffline 提供了复制和安装自定义Linux发行版的选项。您可以从.tar.gz文件安装发行版。
  • WSL-DistroLauncher 允许您从rootfs.tar.gz文件安装发行版。
  • WSLInstall 是另一个用于WSL的Linux安装程序。

创建备份

根据问题报告,您可以使用WSL中的tar命令来创建备份。请注意,在复制过程中需要忽略一些文件夹(例如/mnt)。

# cd /
# tar vzcpf /mnt/c/tmp/ubuntu_`date +%Y%m%d_%H`.tar.gz --exclude=/proc --exclude=/dev --exclude=/mnt --exclude=/media --exclude=/lost+found  --exclude=/tmp --exclude=/sys  --exclude=/run / > /mnt/c/tmp/ubuntu_`date +%Y%m%d_%H`.log 2> /mnt/c/tmp/ubuntu_`date +%Y%m%d_%H`.error
你必须创建或稍后移动备份文件到有效的 /mnt/c 子文件夹中。在这个例子中,文件被创建在 /mnt/c/tmp 中。
使用lxRunOffline进行恢复 使用lxRunOffline,您可以使用Windows命令行将生成的tar文件作为新的WSL发行版进行安装。
# lxrunoffline install -n <distro name> -d <installation folder> -f <file>
C:\wsl> lxrunoffline install -n mybackup -d c:\wsl\mybackup -f c:\tmp\ubuntu_20180729_00.tar.gz
运行备份,您可以使用相同的lxRunOffline命令。
# lxrunoffline run -n <distro name> -w
C:\wsl> lxrunoffline run -n mybackup  -w

使用 DistroLauncher 进行恢复

有许多基于Microsoft 示例的 Linux 发行版启动器。我认为你可以尝试Yuk7 版本

你必须下载一个发行版文件和 launcher.exe。要使用上述相同的发行版文件,你必须将备份文件重命名为 rootfs.tar.gz,并将启动器重命名为你想要的发行版名称。然后,你必须以管理员身份运行启动器(我在以普通用户身份运行时遇到了错误)。

c:\wsl> ren launcher.exe mybackup.exe
c:\wsl> ren .\ubuntu_20180729_00.tar.gz rootfs.tar.gz
c:\wsl> .\mybackup.exe
第一次运行启动器时,它会安装和运行发行版。下一次则会运行 Linux 发行版。

非常感谢!Yuk7的wsdl启动器在启动时一直失败,而我没有注意到lxRunOffline的问题。这是我找到的唯一一处记录了正确tar命令来修复我的wsldl问题的地方。 - AndrewD

虽然Jaime的回答很完美,但是当使用launcher.exe安装tar包时(我特指将WSL安装从一台机器移动到另一台机器),/tmp文件夹却没有被重新创建。 所以必须手动创建/tmp并分配所需权限。 对我有效的方法是:

https://www.cyberciti.biz/faq/mysqld-innodb-error-unable-to-create-temporary-file/

# chown root:root /tmp
# chmod 1777 /tmp
## test it ##
# /etc/init.d/mysqld start