WSL 系统间迁移流程
WSL 在不同系统间迁移的流程
本文简单介绍 WSL 在不同系统下迁移的差异和问题,仅在文章撰写时有效,随时间推移,这些经验可能有不适用之处。
前言
其实总体的导入和导出工作很简单,并不需要这样复杂,只需要在原机器使用 --export
导出一个压缩包,再在新机器使用 --import
导入即可,但是这样操作会有一些问题,比如无法在命令行使用 ubuntu 这样的命令来配置,导致无法指定默认用户,每次进去都需要手动从root切换用户
准备工作
在迁移之前,首先需要进行一些准备工作
- 一台已经完成安装和配置的 WSL
- 在新系统上准备同型号系统的 Microsoft Store 安装包 (用于提供管理程序),本文以 Ubuntu 为例
- 在新系统上开启 WSL 并重启,完成 Ubuntu 的安装
导出流程
- 首先,完成常量定义,假设迁出机器为 机器A ,迁入机器为 机器B
- 在 A 上执行
wsl -l
,查看当前安装的 WSL 名称 (重要),此处为 Ubuntu - 在 A 上执行
wsl -t Ubuntu
, 终止机器上的 WSL 进程 - 在 A 上执行
wsl --export Ubuntu %userprofile%/desktop/Ubuntu.tar
该命令最后一个参数是生成的压缩包路径,该命令需要几分钟完成,在此处,将会在桌面生成一个名为Ubuntu.tar
的压缩文件 - 将该文件传递到 机器B
导入前准备
首先启用 WSL 功能,powershell 执行
Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux
然后下载并安装同型号的 Ubuntu 子系统。(以上两步可以直接查看 //aka.ms/wsl)
如果无法打开应用商店,可以参考 手动下载WSL子系统
- 从开始菜单中找到 Ubuntu ,点击打开,提示正在安装,使其正常安装完毕,设置好用户名和密码。
导入流程
- 关键步骤 B 执行
wsl -t Ubuntu-18.04
(此处我使用了手动安装,因此安装出来的名称为 Ubuntu-18.04, 实际的安装名称请使用wsl -l
查看) - 关键步骤 B 执行
wsl --unregister Ubuntu-18.04
(和上文一样,需要修改为你自己的安装版名称) - 关键步骤 打开 explorer,定位
%LOCALAPPDATA%\Packages\CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc\LocalState\rootfs
这是将要部署 tar 文件的位置,这个因为系统不同,中间的路径会出现不同,需要自己手动确认。 - 关键步骤 执行
wsl --import Ubuntu-18.04 %LOCALAPPDATA%\Packages\CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc\LocalState\rootfs <PATH TO Tar (tar文件的位置)>
这几个参数很好辨认,一个是 Ubuntu名称,一个是上面找到的安装位置,一个是 tar文件路径,执行导入需要几分钟 - 关键步骤 执行
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"