WSL 在不同系统间迁移的流程

本文简单介绍 WSL 在不同系统下迁移的差异和问题,仅在文章撰写时有效,随时间推移,这些经验可能有不适用之处。

前言

其实总体的导入和导出工作很简单,并不需要这样复杂,只需要在原机器使用 --export 导出一个压缩包,再在新机器使用 --import 导入即可,但是这样操作会有一些问题,比如无法在命令行使用 ubuntu 这样的命令来配置,导致无法指定默认用户,每次进去都需要手动从root切换用户

准备工作

在迁移之前,首先需要进行一些准备工作

  1. 一台已经完成安装和配置的 WSL
  2. 在新系统上准备同型号系统的 Microsoft Store 安装包 (用于提供管理程序),本文以 Ubuntu 为例
  3. 在新系统上开启 WSL 并重启,完成 Ubuntu 的安装

导出流程

  1. 首先,完成常量定义,假设迁出机器为 机器A ,迁入机器为 机器B
  2. 在 A 上执行 wsl -l ,查看当前安装的 WSL 名称 (重要),此处为 Ubuntu
  3. 在 A 上执行 wsl -t Ubuntu , 终止机器上的 WSL 进程
  4. 在 A 上执行 wsl --export Ubuntu %userprofile%/desktop/Ubuntu.tar 该命令最后一个参数是生成的压缩包路径,该命令需要几分钟完成,在此处,将会在桌面生成一个名为 Ubuntu.tar 的压缩文件
  5. 将该文件传递到 机器B

导入前准备

  • 首先启用 WSL 功能,powershell 执行

    Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux
  • 然后下载并安装同型号的 Ubuntu 子系统。(以上两步可以直接查看 //aka.ms/wsl)

    如果无法打开应用商店,可以参考 手动下载WSL子系统
  • 从开始菜单中找到 Ubuntu ,点击打开,提示正在安装,使其正常安装完毕,设置好用户名和密码。

导入流程

  1. 关键步骤 B 执行 wsl -t Ubuntu-18.04 (此处我使用了手动安装,因此安装出来的名称为 Ubuntu-18.04, 实际的安装名称请使用 wsl -l 查看)
  2. 关键步骤 B 执行 wsl --unregister Ubuntu-18.04 (和上文一样,需要修改为你自己的安装版名称)
  3. 关键步骤 打开 explorer,定位 %LOCALAPPDATA%\Packages\CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc\LocalState\rootfs
    这是将要部署 tar 文件的位置,这个因为系统不同,中间的路径会出现不同,需要自己手动确认。
  4. 关键步骤 执行 wsl --import Ubuntu-18.04 %LOCALAPPDATA%\Packages\CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc\LocalState\rootfs <PATH TO Tar (tar文件的位置)> 这几个参数很好辨认,一个是 Ubuntu名称,一个是上面找到的安装位置,一个是 tar文件路径,执行导入需要几分钟
  5. 关键步骤 执行 Ubuntu1804 config --default-user <wsl 子系统的用户名> ,这一步用于指定自定义用户名,当你以前安装 wsl 的使用了自定义用户名,迁入之后需要执行这一条才能完成设置,否则每次 wsl 进去都是 root。

总结

最佳的安装流程应该都使用同一个版本的商店应用,这样不会产生 Ubuntu 命令和名称的差异,像我是因为网络环境不同,导致原来从商店安装的 Ubuntu 没法安装,从手动下载的方式安装了 Ubuntu 18.04,所以有了一些差异。

分享一些 WSL 有用的 alias (zsh)


# Alias
alias weather="clear && curl wttr.in/?lang=zh"
alias cls="clear"
alias explorer="explorer.exe"
alias exp="explorer"
alias exp.="exp ."

# auto run
alias start='(){ cmd.exe /C "start $1" > /dev/null 2>&1;}'
alias run="start"

# Use Command With Windows
alias cmd='(){ cmd.exe /C "$*" ;}'
alias win='(){ powershell.exe -Command "$*" ;}'

#winodws Link
alias -s lnk="exp"

# clipBoard
alias wincopy="clip.exe"
alias winpaste="powershell.exe Get-Clipboard"