MorFans Dev
折腾 - 开发 - 分享

Docker WSL1/2 迁移 Linux 发行版目录

Docker WSL1/2 迁移 Linux 发行版目录

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

当发行版导入完毕后,还需要设定进入时的默认用户,因为用户会变成默认 uid1root

设定初始用户:

~
❯ 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
赞赏
魔帆博客,版权所有 | 如未注明,均为原创
本站均采用 BY-NC-ND 协议 (署名-非商业性使用-禁止演绎) 进行授权。
转载请注明来自本站文章:Docker WSL1/2 迁移 Linux 发行版目录(https://www.morfans.cn/archives/3114)

野小新

文章作者

野小新很野~

发表回复

textsms
account_circle
email

Docker WSL1/2 迁移 Linux 发行版目录
WHY 为什么要迁移 WSL 适用于Linux的Windows子系统(Windows Subsystem for Linux,WSL)是微软开发的一个为在 Windows 上能够原生运行Linux二进制可执行文件(ELF格式)的兼容层。 …
扫描二维码继续阅读
2022-02-09