WSL使用
WSL安装和使用
Termianl和Ubuntu的安装
- 打开Hype-V虚拟化配置
- Microsoft Store中搜索Window Terminal并安装
- Microsoft Store中搜索Ubuntu, 选择安装Ubuntu 22.04.3 LTS版本
- 打开Window Terminal选择Ubuntu标签栏, 进入命令行
中文输入法安装
查看是否安装了fcitx框架
fcitx --version
安装fcitx框架, 如果安装不成功, 记得将软件源切成国内的
- 中途会让你输入Y/N, 记得都选择Y即可
sudo apt-get update
sudo apt-get install fcitx-bin
安装拼音
sudo apt-get install fcitx-table
Ubuntu中文乱码解决
安装中文支持包
- 碰到输入Y/N选择输入Y即可
sudo apt-get install language-pack-zh-hans
使用vim在/etc/environment环境变量追加中文支持(如果没有就新建), 内容如下
LANG="zh_CN.UTF-8"
LANGUAGE="zh_CN:zh:en_US:en"
修改/var/lib/locales/supported.d/local(如果没有这个文件就新建一个)
en_US.UTF-8 UTF-8
zh_CN.UTF-8 UTF-8
zh_CN.GBK GBK
zh_CN GB2312
最后执行
sudo locale-gen
vim编辑文件乱码
编辑文件(没有则手动创建) 添加如下几行
set fileencodings=utf-8,ucs-bom,gb18030,gbk,gb2312,cp936
set termencoding=utf-8
set encoding=utf-8
固定IP
默认情况下, WSL实例的 IP 地址不是固定的。每次 WSL 实例启动时,它通常会从 Windows 主机的一个虚拟网络适配器获得一个新的 IP 地址。这个虚拟网络适配器充当 DHCP服务器,为 WSL 实例分配 IP 地址
最常用的方案是与宿主机共享IP, 这可以通过配置wslconfig文件做到:
- 默认情况下,.wslconfig 文件不存在。 它必须创建并存储在
%UserProfile%
目录中才能应用这些配置设置 - 只能用于 WSL 2 运行的发行版
- 该目录路径应类似于:
C:\Users\<UserName>\.wslconfig
在用户目录下的.wslconfig文件中添加如下内容:
[experimental]
# 如果值为 mirrored,则会启用镜像网络模式。 默认或无法识别的字符串会生成 NAT 网络
networkingMode=mirrored
# 更改将 DNS 请求从 WSL 代理到 Windows 的方式
dnsTunneling=true
# 如果设置为 true,则 Windows 防火墙规则以及特定于 Hyper-V 流量的规则可以筛选 WSL 网络流量
firewall=true
# 强制 WSL 使用 Windows 的 HTTP 代理信息
autoProxy=true
修改/etc/resolv.conf配置(这个是DNS配置), 在后续追加一下内容
# google的域名解析服务器
nameserver 8.8.8.8
# 联通的域名解析服务器
nameserver 114.114.114.114
执行下述命令, 发现可以联网了
ping baidu.com
查看发行版相关命令
启动默认的Linux发行版shell
wsl
在默认发行版中Linux中执行指定指令
wsl <command>
查看可安装的Linux发行版
wsl --list --online
查看已安装的发行版本
wsl --list
更新 WSL 的 Linux 内核
wsl --update
显示 WSL 的状态以及默认的 WSL 版本和发行版
wsl --status
显示所有可用的 WSL 命令和用法选项
wsl --help
磁盘管理
切换WSL的Linux存储位置
查看vhdx 文件在window的存放路径
- 由于我目前使用的版本名为Ubuntu-22.04, 所以版本名就应该填写成Ubuntu-22.04, 这可以通过wsl --status查
(Get-ChildItem -Path HKCU:\Software\Microsoft\Windows\CurrentVersion\Lxss | Where-Object { $_.GetValue("DistributionName") -eq '版本名' }).GetValue("BasePath") + "\ext4.vhdx"
例如查出来的位置为C:\Users\Admin\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu22.04LTS_79rhkp1fndgsc\LocalState\ext4.vhdx
由于我们不想将Ubuntu安装在C盘, 所以打算将其移动到E:\software\WSL\Ubuntu\Ubuntu-22.04下
方式一
将C盘中的vhdx文件拷贝到E:\software\WSL\Ubuntu\Ubuntu-22.04\ext4.vhdx
注销并删除指定的 Linux 发行版, 同时会删除磁盘文件
wsl --unregister Ubuntu-22.04
将指定vhdx导入
wsl --import-in-place Ubuntu-22.04 E:\software\WSL\Ubuntu\Ubuntu-22.04\ext4.vhdx
方式二
导出Ubuntu-22.04到E:\software\WSL\Ubuntu\Ubuntu-22.04.tar
- 注意了, 必须是以tar包结尾的
wsl --export Ubuntu-22.04 E:\software\WSL\Ubuntu\Ubuntu-22.04.tar
注销并删除指定的 Linux 发行版, 同时会删除磁盘文件
wsl --unregister Ubuntu-22.04
将指定tar导入
- 将E:\software\WSL\Ubuntu\Ubuntu-22.04.tar导入到E:\software\WSL\Ubuntu\Ubuntu-22.04 , 并且分发名为Ubuntu-22.04
- 导入后, 发现Ubuntu-22.04下存放的是ext4.vhdx,和方式一一样
wsl --import Ubuntu-22.04 E:\software\WSL\Ubuntu\Ubuntu-22.04 E:\software\WSL\Ubuntu\Ubuntu-22.04.tar
- 这个tar包就相当于一个快照备份, 当出问题了, 那么就可以将原理分发版本注销, 然后重新解压一份出来
清理vhdx磁盘空间, 因为wsl不会自动收缩vhdx文件大小
立即终止所有运行的 WSL Linux 发行版并关闭虚拟机。
wsl --shutdown
diskpart解释器
- 执行完后进入到一个新的DISKPART命令行解析器
diskpart
选择指定的ext4.vhdx
- 这里选择的是刚才导入的vhdx
- 执行完下述代码会提示"DiskPart 已成功选择虚拟磁盘文件。"
select vdisk file="E:\software\WSL\Ubuntu\Ubuntu-22.04\ext4.vhdx"
显示与此虚拟磁盘关联的详细信息
- 包括虚拟大小,表示当前分配给 VHD 的大小上限
detail vdisk
修改文件的磁盘管理方式
只读模式链接虚拟磁盘
attach vdisk readonly
虚拟磁盘修改紧凑模式
compact vdisk
退出磁盘
detach vdisk
退出DISKPART
exit
设置磁盘稀疏以自动回收
.wslconfig默认情况下,.wslconfig 文件不存在。 它必须创建并存储在 %UserProfile% 目录中才能应用这些配置设置
下面是我的全局配置.wslconfig
配置以下内容, 设置完后重新启动wsl
[experimental]
# 可以在 gradual, dropcache, disabled 之间选择, 检测空闲 CPU 使用率后,自动释放缓存的内存。 设置为 gradual 以慢速释放,设置为 dropcache 以立即释放缓存的内存
autoMemoryReclaim=gradual
# 如果设置为 true,则任何新创建的vhdx磁盘将自动设置为稀疏
sparseVhd=true
如果是局部配置则是配置在wsl.conf
- 作为 unix 文件存储在发行版的
/etc
目录 - WSL 1和 WSL 2都可以使用
LxRunOffline
为什么需要LXRunOffline
为了不撑爆系统盘,除了修改 Windows 应用安装位置,还可以把 WSL 整个安装目录进行转移,使用 wsl --export
和 wsl --import
这两个命令可以对 WSL 进行打包再自定义目录安装,就相当于转移
但是wsl自带的原生命令还不够强大, LxRunOffline,它可以安装任意发行版到任意目录、转移已安装的 WSL 目录、备份 WSL、设置默认用户和修改环境变量等操作,完全碾压 wsl
、wslconfig
这些简陋原生管理命令
下载和安装
下载地址,mingw或者msvc格式其中一个即可, 这里我选择的是mingw格式
解压后, 选择一个目录安装, 然后将安装目录配置到环境变量
输入LxRunoffline list或者lxrunoffline list
- 不区分大小写
如果显示如下, 那么就表示成功了
如果出现下述结果, 那么可以参考了这个博客, 去对注册表找到TryStotreWSL, 并从注册表中移除
删除后, 再次执行命令就发现可以了
常用命令
- l , list - 列出所有已安装的发行版
- gd , get-default - 获取 bash.exe 使用的默认发行版
- sd , set-default - 设置 bash.exe 使用的默认发行版
- i , install - 安装新的发行版
- sd , set-default - 设置 bash.exe 使用的默认发行版
- ui , uninstall - 卸载发行版
- rg , register - 注册现有的安装目录
- ur , unregister - 取消注册发行版但不删除安装目录
- m , move - 将发行版移动到新目录
- d , duplicate - 在新目录中复制现有发行版
- e , export - 将发行版的文件系统导出到.tar.gz 文件,该文件可以通过 install 命令安装
- r , run - 在发行版中运行命令
- di , get-dir - 获取发行版的安装目录
- gv , get-version - 获取发行版的文件系统版本
- ge , get-env - 获取发行版的默认环境变量
- se , set-env - 设置发行版的默认环境变量
- ae , add-env - 添加到发行版的默认环境变量
- re , remove-env - 从发行版的默认环境变量中删除
- gu , get-uid - 获取发行版的默认用户的 UID
- su , set-uid - 设置发行版的默认用户的 UID
- gk , get-kernelcmd - 获取发行版的默认内核命令行
- sk , set-kernelcmd - 设置发行版的默认内核命令行
- gf , get-flags - 获取发行版的一些标志有关详细信息,请参考这里
- sf , set-flags - 设置发行版的一些标志有关详细信息,请参考这里
- s , shortcut - 创建启动发行版的快捷方式
- ec , export-config - 将发行版配置导出到 XML 文件
- ic , import-config - 从 XML 文件导入发行版的配置
- sm , summary - 获取发行版的一般信息
转移WSL安装目录
先查看系统中安装的WSL
lxrunoffline l
将WSL进行移动
lxrunoffline m -n <WSL名称> -d <路径>
查看移动的路径
lxrunoffline di -n <WSL名称>
打开目录发现Ubuntu-22.04移动到了"E:\software\WSL\Ubuntu\temp-Ubuntu\ext4.vhdx", 但是"E:\software\WSL\Ubuntu\Ubuntu-22.04"目录不见了
备份和恢复WSL
备份
先查看安装的WSL
lxrunoffline l
输入需要备份的 WSL 名称和备份的目标路径
lxrunoffline e -n <WSL名称> -f <压缩包路径>.tar.gz
- 类似但不等同于
wsl --export <WSL名称> <压缩包路径>.tar
。LxRunOffline 备份完会生成一个.xml
后缀的同名配置文件,比如WSL.tar.gz.xml
。 - 必定是以.tar.gz结尾
- 目前lxrunoffline暂不支持WSL2,如果导出的是WSL2则报以下错误:[ERROR] The action/argument “export” doesn’t support WSL2
- 所以备份还是WSL原来命令备份比较合适
恢复
lxrunoffline i -n <WSL名称> -d <安装路径> -f <压缩包路径>.tar.gz
- 类似但不等同于
wsl --import <WSL名称> <安装路径> <压缩包路径>.tar
。LxRunOffline 会读取备份时生成的配置文件并写入配置,前提是同目录且同名。否则你需要加入-c
参数指定配置文件。
使用命令运行指定 WSL
在有多个 WSL 的情况下,可以指定运行某个发行版。
lxrunoffline r -n <WSL名称>
等同于
wsl -d <WSL名称>
设置默认 WSL
设置默认 WSL 后,可以在 cmd
和 powershell
中输入 wsl
直接调用默认的 WSL 。
lxrunoffline sd -n <WSL名称>
等同于
wsl -s <WSL名称>
使用 LxRunOffline 修改 WSL 名称
查看 WSL 名称。
wsl -l
查看 WSL 安装目录。
lxrunoffline di -n <WSL名称>
导出指定的 WSL 配置文件到目标路径。
lxrunoffline ec -n <WSL名称> -f <配置文件路径>.xml
配置信息可以输入
lxrunoffline sm -n <WSL名称>
查看
取消注册(这个操作不会删除目录)
lxrunoffline ur -n <WSL名称>
使用新名称注册
lxrunoffline rg -n <WSL名称> -d <WSL路径> -c <配置文件路径>.xml
参考资料
WSL入门到入土
如何管理 WSL 磁盘空间
WSL 中的高级设置配置
LxRunOffline下载地址
使用Windows子系统作为生产力工具
LxRunOffline 使用教程 - WSL 自定义安装、备份
WSL2迁移到非系统盘遇到的问题
WSL2 的 2.0 更新彻底解决网络问题
ubuntu下ping域名报错Name or service not known_ubuntu name or service not known