WHY 为什么要迁移 WSL
适用于Linux的Windows子系统(Windows Subsystem for Linux,WSL)是微软开发的一个为在 Windows 上能够原生运行Linux二进制可执行文件(ELF格式)的兼容层。
通过 Windows 商店等途径,可以轻松下载各种发行版,一个系统多层套娃装逼。但是有一个小问题。
WSL 一般默认都是安装在C盘(之前如果用户更改了UWP安装目录,还需要修改回系统默认的C盘。
虽然现在很多人已经不分盘了(Windows 逐渐稳定,不用像之前隔年重装)。但很多时候为了重装方便,还是会把 C盘单独分一个盘,当安装多个 WSL 并深度使用后,空间小的C 盘就爆红了(相当于装了N个系统)
为什么不用 LxRunOffline
截至目前 3.5.0 版本(release 中的最新 3.5.0 ),LxRunOffline 是有问题的(今年四月左右就有的):
~
❯ lxrunoffline.exe move -n Debian -d D:\application\wsl\Debian
[ERROR] Couldn't set the case sensitive attribute of the directory "\\?\C:\Users\Paxos\AppData\Local\Packages\TheDebianProject.DebianGNULinux_76v4gfsz19hv4\LocalState\".
Reason: Indicates that the directory trying to be deleted is not empty.
无法迁移,duplicate WSL。
不过有一个不在 release 中的版本修复了这个问题:
但我个人觉得没必要,等 release 中放出了再用吧。所以本篇文章大部分都使用微软的官方命令来实现的。但部分功能为了方便会使用到 LxRunOffline
移动 Windows 商店的 WSL 发行版
使用微软官方提供的 WSL 命令来实现的思路就是先导出,然后注销掉发行版,再重新注册。
缺点就是重新注册后,系统默认的用户会变成 root (uid 1)。
查看电脑上安装的 WSL 发行版可以使用 wsl -l -v
。
下面用 Debian 来作为例子。
首先把 Debian
导出到指定目录 D:\application\wsl\Debian\Debian
.tar (所有数据)
~
❯ wsl --export Debian D:\application\wsl\Debian\Debian.tar
确定导出成功后,就可以注销 Debian
发行版了。
这个命令会删除目前系统中的
Debian
发行版中的所有数据,请确保导出了数据
~ took 18s
❯ wsl --unregister Debian
Unregistering...
注销后,就可以使用导入命令 --import
来导入发行版。
导入的发行版名称还要保持为原来的一样(为了确保 wsl
复制程序能正常工作,如果你不在意也无所谓)
然后指定WSL安装目录到 D:\application\wsl\Debian
安装所用的数据 D:\application\wsl\Debian\Debian.tar
(刚刚导出的数据文件)
然后使用 --version
指定版本号,如果使用一代使用 1
,二代使用 2
~ took 7s
❯ wsl --import Debian D:\application\wsl\Debian "D:\application\wsl\Debian\Debian.tar" --version 1
当发行版导入完毕后,还需要设定进入时的默认用户,因为用户会变成默认 uid
为 1
的 root
。
设定初始用户:
~
❯ debian.exe config --default-user paxos
# 如果你没有 debian 应用程序(卸载了的话),可以用 lxrunoffline 设定 uid
~
❯ lxrunoffline.exe su -n Debian -v 1000
# 如果不想安装可以在 WSL 中使用添加 wsl.conf
echo -e "[user]\ndefault=$myUsername" >> /etc/wsl.conf
看上边的命令,可以看出来WSL 发行版的商店应用几乎没啥用。但商店的应用程序没必要卸载,一来占不了多少空间,二来可以利用这个 alias 快速进入WSL 发行版
移动 Docker 创建的 wsl2
docker 默认存在这里:C:\Users\Paxos(你的用户名)\AppData\Local\Docker\wsl
建议不要移动 docker-desktop 这个 wsl2,根据测试,docker for windows 更新方式是直接注销然后重新安装的。
其中 data 文件夹中的 wsl 体积会是比较大的,对我们这种C盘低保户非常不友好。
lxrunoffline 截至目前无法导出 WSL2,直接迁移也有bug,所以还是用微软官方命令来实现。
关闭所有发行版:
wsl --shutdown
导出 docker-desktop-data:
~
❯ wsl --export docker-desktop-data D:\application\wsl\docker\docker-desktop-data\docker-desktop-data.tar
注销 docker-desktop-data
~
❯ wsl --unregister docker-desktop-data
重新注册
~
❯ wsl --import docker-desktop-data(发行版名称) D:\application\wsl\docker\docker-desktop-data(安装位置) "D:\application\wsl\docker\docker-desktop-data\docker-desktop-data.tar"(安装使用的tar文件位置) --version 2(指定版本)
复制 wsl 发行版
wsl 的版本有1也有2,虽然微软提供了命令可以方便的切换,但我就想要两个同样的系统,但wsl版本不同。
lxrunoffline 的 duplicate 有点bug,修复版本在上面。但我觉得没必要,用官方的命令实现即可
~
❯ wsl --export Debian D:\application\wsl\Debian\Debian.tar
~
❯ wsl --import Debian-2 D:\application\wsl\Debian2 "D:\application\wsl\Debian\Debian.tar" --version 2
利用 lxrunoffline 修改默认用户:
~ took 4s
❯ lxrunoffline.exe su -n Debian-2 -v 1000
~
❯ wsl -l -v
NAME STATE VERSION
* Debian Stopped 1
Debian-2 Stopped 2
docker-desktop Stopped 2
docker-desktop-data Stopped 2
Arch Stopped 2
发表回复