WSL2教程WSL迁移到非系统盘
Posted 花花少年
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了WSL2教程WSL迁移到非系统盘相关的知识,希望对你有一定的参考价值。
一、问题引入
默认情况下,WSL会安装在C盘(系统盘),而C盘空间有限,随着WSL子系统的使用,C盘空间越来越少,最后有可能出现C盘不足导致WSL系统崩溃。
有效的解决方法是,将WSL子系统迁移到其他盘(非系统盘)。
二、WSL磁盘迁移(方式一)
1. 整体流程
亲测有效。
2. 查看wsl状态
查看wsl下的Linux是否为关闭状态,当wsl为Stopped才能进行下一步。
wsl -l -v
C:\\Users\\xxx\\Desktop>wsl -l -v
NAME STATE VERSION
* Ubuntu Stopped 2
3. 导出系统镜像
以压缩包的形式导出到其他盘。
wsl --export Ubuntu D:\\UbuntuWSL\\ubuntu.tar
4. 注销原有的linux系统
wsl --unregister Ubuntu
5. 查看系统状态
查看是否真的注销成功。
wsl -l -v
6. 导入系统
wsl --import <导入的Linux名称> <导入盘的路径> <ubuntu.tar的路径> --version 2 (代表wsl2)
wsl --import Ubuntu D:\\UbuntuWSL\\ D:\\UbuntuWSL\\ubuntu.tar --version 2
7. 修改默认用户
打开wsl ubuntu之后,默认以root身份登录。
ubuntu.exe config --default-user vincent
在导入任意盘linux系统时,我起名Ubuntu,所以这里是ubuntu.exe;如果你起的名字是Ubuntu-20.04,那这里就是ubuntu2004.exe;如果你起的名字是ubuntu-18.04,那这里就是ubuntu1804.exe。
vincent是原有wsl ubuntu的用户名称。
三、WSL磁盘迁移(方式二)
1. 整体流程
亲测有效。
2. 下载Move WSL工具
3. 停止WSL子系统
在PowerShell中运行如下命令,停止正在运行的Linux子系统。
wsl --shutdown
4. 查看wsl状态
查看wsl下的Linux是否为关闭状态,当wsl为Stopped才能进行下一步。
wsl -l -v
C:\\Users\\xxx\\Desktop>wsl -l -v
NAME STATE VERSION
* Ubuntu Stopped 2
5. 开始移动
cd d:\\move-wsl-master
.\\move-wsl.ps1
选择要移动的目标,比如移动Ubuntu-18.04,则输入 1 并回车,然后会提示让我们输入移动的目标路径。
输入目标路径如 D:\\WSL
然后回车,便会执行移动。根据移动目标的大小,时间可长可短,请耐心等待。
移动过程中,可以看到脚本会先将移动目标导出到一个tar文件,然后再将tar文件导入到 ext4.vhdx 文件中。
移动完成后,脚本会删掉原来C盘中的相应内容,释放C盘空间。
6. 修改默认用户
操作步骤,参考方式一。
四、回收Docker环境中的空间
Docker用久了会残留很多无用的Image。这些Image文件少则几十上百兆,多则几个G,给本就捉襟见肘的磁盘空间造成巨大浪费, 这时可以删掉不需要的Image文件。但你可能愕然发现,即使删掉了好几个Image,磁盘依然没有苗条下来。
这是因为ext4.vhdx磁盘空间会根据加载的数据自动增长,但是无法自动回收。下面是手动回收的步骤。
1. 停止WSL子系统
在PowerShell中运行如下命令,停止正在运行的Linux子系统。
wsl --shutdown
2. 运行diskpart释放空间
# open window Diskpart
diskpart
# 选择虚拟机文件执行瘦身
select vdisk file="D:\\WSL\\docker-desktop-data\\ext4.vhdx"
attach vdisk readonly
compact vdisk
detach vdisk
exit
五、FAQ
Q:WSL出现“灾难性故障”
错误原因:
磁盘空间不足导致WSL系统奔溃
解决办法:
清理磁盘垃圾,腾出磁盘空间
# 停止WSL
net stop LxssManager
# 重新打开wsl终端
Windows10 Linux子系统安装/迁移到非系统盘
一、通过wsl命令迁移、备份Linux分发
操作步骤
wsl(.exe)命令用法:
wsl -h 命令行选项无效: -h 版权所有 (c) Microsoft Corporation。保留所有权利。 用法: wsl.exe [参数] [选项...] [命令行] 用于运行 Linux 二进制文件的参数: 如果未提供命令行,wsl.exe 将启动默认的 shell。 --exec, -e <命令行> 执行指定的命令而不使用默认的 Linux shell。 -- 按原样传递剩余的命令行。 选项: --distribution, -d <分发版> 运行指定的分发。 --user, -u <用户名> 以指定用户身份运行。 用于管理适用于 Linux 的 Windows 子系统的参数: --export <分发版> <文件名> 将分发导出到 tar 文件。 对于标准输出,文件名可以是 -。 --import <分发版> <安装位置> <文件名> [选项] 将指定的 tar 文件作为新分发进行导入。 对于标准输入,文件名可以是 -。 选项: --version <版本> 指定用于新分发的版本。 --list, -l [选项] 列出分发。 选项: --all 列出所有分发,包括当前正在 安装或卸载的分发。 --running 只列出当前正在运行的分发。 --quiet, -q 只显示分发名称。 --verbose, -v 显示有关所有分发的详细信息。 --set-default, -s <分发版> 将分发设置为默认值。 --set-default-version <版本> 更改新分发的默认安装版本。 --set-version <分发版> <版本> 更改指定分发的版本。 --shutdown 立即终止所有正在运行的分发和 WSL 2 轻型工具虚拟机。 --terminate, -t <分发版> 终止指定的分发。 --unregister <分发版> 注销分发。 --help 显示用法信息。
在这之前可以通过wsl --terminate <DistritubtionName>
的方式来先关闭相关的分发,以免后续造成不必要的问题。
然后通过wsl --export <DistributionName> <FileName>选项导出Linux子系统.:
wsl--export Ubuntu-18.04 d:/Ubuntu-18.04.tar
Tips:此命令等效于:
cd /mnt/c/Users/luoz/AppData/Local/Packages/CanonicalGroupLimited.Ubuntu18.04onWindows_79rhkp1fndgsc/LocalState/rootfs tar -cf /mnt/d/Ubuntu-18.04.tar ./*
等待数十分钟,生成tar文件,文件结构如下:
执行完后我们再通过wsl --unregister Ubuntu-18.04
来注销这个分发,以便避免存在重复的分发,当然也可以不这样做,只是下面的命令需要指定一个不同的DistributionNam.
接下来通过wsl --import <DistributionName> <InstallLocation> <FileName>来导入之前export完的分发:
wsl --import Ubuntu d:/install/tools/Ubuntu d:/Ubuntu-18.04.tar
此时我们就能通过wsl --list看到新导入的Linux分发了。
重新导入后的Linux分发版不再以APP的形式出现于开始菜单中:
这样操作以后不能像原来一样在开始菜单点击图标启动此Linux分发,其他并未改变。可以通过wsl -s Ubuntu命令、Windows terminal程序等方式启动。或者将其设为默认分发版,通过wsl、bash启动。
另一方面,不能像原来那样在应用商店里更新。
不存在原来那样的Ubuntu804.exe这样的命令。
如何配置wsl -import
后的实例,默认以非root账户启动
在注册表中找到HKEY_USERS\\xxx\\Software\\Microsoft\\Windows\\CurrentVersion\\Lxss
xxx为你当前用户在注册表中的代号:
S-1-5-18:代表SYSTEM
S-1-5-19:代表LocalService
S-1-5-20:代表NetworkService
接下来的S-1-5-21-.....便是代表当前用户了。
接下来在Lxss下找到需要更改默认账户的分发版:
通过修改Lxss下的实例配置中的DefaultUid
的值来修改wsl默认的用户。
可用的目标值可以通过在wsl中运行cat /etc/passwd
获取,比如我这里用的是1000,换算成对应的16进制数字是3e8。
此时就大功告成,默认启动不再是root用户了。
其实也可以通过下面介绍的LxRunOffline实现:
LxRunOffline su -n <systemname> -v 1000
二、通过LxRunOffline实现
个人分析此命令是通过修改注册表里面的路径以实现无损迁移的。
项目地址:https://github.com/DDoSolitary/LxRunOffline
在项目地址里下载得到LxRunOffline命令。
LxRunOffline的功能很多,迁移只是功能之一:
oboth@DESKTOP-BUFOEB1:/mnt/c/Users/luoz$ /mnt/d/LxRunOffline.exe [ERROR] No action is specified. Supported actions are: l, list List all installed distributions. gd, get-default Get the default distribution, which is used by bash.exe. sd, set-default Set the default distribution, which is used by bash.exe. i, install Install a new distribution. ui, uninstall Uninstall a distribution. rg, register Register an existing installation directory. ur, unregister Unregister a distribution but not delete the installation directory. m, move Move a distribution to a new directory. d, duplicate Duplicate an existing distribution in a new directory. e, export Export a distribution\'s filesystem to a .tar.gz file, which can be imported by the "install" comm and. r, run Run a command in a distribution. di, get-dir Get the installation directory of a distribution. gv, get-version Get the filesystem version of a distribution. ge, get-env Get the default environment variables of a distribution. se, set-env Set the default environment variables of a distribution. ae, add-env Add to the default environment variables of a distribution. re, remove-env Remove from the default environment variables of a distribution. gu, get-uid Get the UID of the default user of a distribution. su, set-uid Set the UID of the default user of a distribution. gk, get-kernelcmd Get the default kernel command line of a distribution. sk, set-kernelcmd Set the default kernel command line of a distribution. gf, get-flags Get some flags of a distribution. See https://docs.microsoft.com/en-us/previous-versions/windows/ desktop/api/wslapi/ne-wslapi-wsl_distribution_flags for details. sf, set-flags Set some flags of a distribution. See https://docs.microsoft.com/en-us/previous-versions/windows/ desktop/api/wslapi/ne-wslapi-wsl_distribution_flags for details. s, shortcut Create a shortcut to launch a distribution. ec, export-config Export configuration of a distribution to an XML file. ic, import-config Import configuration of a distribution from an XML file. sm, summary Get general information of a distribution. version Get version information about this LxRunOffline.exe.
可以看到LxRunOffline.exe包含了很多wsl.exe的功能。
开始迁移:
首先用LxRunOffline.exe list或者wsl.exe -l
命令查看你可以使用子系统名称。
然后使用 lxrunoffline move
进行迁移 , -n 指定你要迁移的系统名 ,-d 指定你新系统的迁移路径。
.\\LxRunOffline.exe move -n Ubuntu -d d:\\install\\tools\\Ubuntu
迁移过程会出现WARNING 不用管, 等待一段时间结束就算迁移完成了。
使用LxRunOffline.exe get-dir
查询系统目录,可见已经更改成功。
PS C:\\Users\\luoz> d:\\LxRunOffline.exe get-dir -n Ubuntu
d:\\install\\tools\\Ubuntu
三、不同发行版镜像交换/迁移
由于我最开始在应用商店下载了Ubuntu18.04 LTS,后来在子系统内升级到了Ubuntu20.04 LTS。但是名字还是显示Ubuntu18.04,并且后续也不能在应用商店内跟随升级。
但应用商店内的Ubuntu确一直保持在最新LTS版本,可以在应用商店内保持更新。
迫于强迫症的我,想要换到Ubuntu包,但又想保持Ubuntu18.04内的最新镜像和软件。于是试出了以下方法。
1、首先将Ubuntu和Ubuntu1804都转换为wsl2。
PS D:\\> wsl --set-version Ubuntu 2
PS D:\\> wsl --set-version Ubuntu1804 2
2、进到各自的目录交换ext4.vhdx文件。
3、大功告成。若出现unregister错误只需用LxRunOffline重新注册一下即可。
PS C:\\Users\\luoz> d:\\LxRunOffline.exe register -n Ubuntu-18.04 -d D:\\install\\tools\\Ubuntu1804
至此,镜像已经交换啦!
四、WSL离线安装
参照微软官方的文档,里面说得很详细了。
https://docs.microsoft.com/en-us/windows/wsl/install-manual
文档里包含了各个Linux发行版的下载链接。
下载后的文件是appx格式,可以直接双击安装!
安装后的路径在系统默认目录,可以参照上面的方法将rootfs迁移到其他目录。
除此之外,也可以通过LxRunOffline来实现自定义安装:
1、首先解压.appx文件
2、用LxRunOffline安装:
LxRunOffline -i -n <systemname> -d <rootfsdir> -f <systempack>
#d:\\Downloads\\LxRunOffline.exe i -n Debian -d d:\\install\\Debian -f d:\\Debian\\install.tar.gz
以上是关于WSL2教程WSL迁移到非系统盘的主要内容,如果未能解决你的问题,请参考以下文章