保姆式WSL2基础配置指南
记录下之前折腾WSL2的记录,点太多还是聚合起来阅读比较好用,文章用ChatGPT组织。
最近不断看到有网友询问关于WSL2的问题,因此决定写一篇详细的入门配置教程,手把手教你如何配置WSL2,从入门到熟练使用。
通过这篇文章,你将学会:
- 在你的Windows电脑上安装Ubuntu到WSL2中;
- 迁移你的WSL2系统镜像,让系统随时可用;
- 优化WSL2系统设置,让其可以后台启动并高效运行;
- 设置Ubuntu内的应用开机自启。
- 其他的一些安全设置选项
- 给你的WSL镜像瘦身(102024更新)
1.安装Ubuntu到WSL2
友情提醒: WSL2默认选择Ubuntu系统,它是唯一官方支持GPU加速的发行版,如果你要炼丹或者搞GPU大模型,请务必选择这个系统,可以省区大部分烦恼。
wsl --install
如果你想尝试其他发行版,可以通过以下命令查看并安装:
wsl --list --online 或 wsl -l -o
wsl --install -d <发行版名称>
当然,你也可以安装多个发行版。默认情况下,系统会安装在C盘上,但你可以迁移到其他位置。
2.导出和迁移系统
首先,导出现有的系统:
wsl --export Ubuntu E:\Ubuntu2.tar
然后取消挂载当前系统:
wsl --unregister Debian
最后,将系统重新挂载到新的位置:
wsl --import Debian E:\wsl2\Ubuntu E:\Ubuntu.tar
3.1 限制WSL2的资源占用
为什么有此操作: 这样当你系统启动,登录系统后,Windows会开启 WSL 实例,它会永久等待输入,不会关闭。所以当你下次再使用WSL命令时,就不会遇到需要重新唤醒 WSL 的耗时。
如果你担心后台挂着WSL对系统资源占用过高,可以通过配置 .wslconfig 文件来限制 WSL 的资源占用。 WSL 会默认占用50%内存,最大8GB。使用所有CPU线程。我> 一般会限制到4GB,2线程。
为了防止WSL长期占用系统资源,你可以通过配置.wslconfig文件来限制WSL的内存、CPU和交换分区大小。
- 打开Windows资源管理器,地址栏输入
%UserProfile%
回车。在该目录下创建一个名为.wslconfig的文件,写入以下内容(以8GB内存电脑为例,分配2GB内存和2个CPU线程给WSL,设置4GB交换分区):
Update:最新版本已经回自动释放内存了,具体配置参看资料三,可能那个定时任务和稀疏转换已经不需要了!
[wsl2]
memory=2GB
swap=4GB
processors=2
localhostForwarding=true
# 自动释放内存
autoMemoryReclaim=dropcache
# 自动释放磁盘
sparseVhd=true
- 执行以下命令关闭并重新启动WSL:
wsl --shutdown
如果你不想限制WSL2的内存占用,可以通过定时任务定期清理内存。编辑crontab设置每小时释放一次内存:
crontab -e
0 */1 * * * echo 3 > /proc/sys/vm/drop_caches
3.2 设置WSL2后台启动
- 在你的WSL2的Debian或Ubuntu中执行以下命令,允许用户执行所有命令而不需要密码:
sudo bash -c "echo '$USER ALL=(ALL) NOPASSWD: ALL' >/etc/sudoers.d/$USER"
- 在Windows开机启动文件夹中添加一个以.vbs结尾的文件,内容如下:
set ws=wscript.CreateObject("wscript.shell")
ws.run "wsl -d Ubuntu", 0
要快速进入开机启动文件夹,可以按Windows+R,然后输入 shell:startup
。你可能还会用到 taskschd.msc
。
4.设置Ubuntu内的应用开机自启
在WSL系统内新建并添加以下内容:
vi /etc/wsl.conf
内容如下:
[boot]
systemd=true
然后开启Ubuntu的开机启动服务:
systemctl status rc-local
并添加以下内容:
cat <<EOF >/etc/rc.local
# !/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.
exit 0
EOF
执行以下命令使脚本可执行并启用:
chmod +x /etc/rc.local
systemctl enable --now rc-local
无视警告即可:
systemctl status rc-local.service
修改 /etc/rc.local
里的内容即可让你的Ubuntu应用开机启动。
5.其他的一些必要配置:
设置root密码,开机必备
sudo passwd root
更新系统
su -
apt-get update && apt-get upgrade
WSL2 Ubuntu 安装openssh-server
sudo apt update
sudo apt install openssh-server
WSL2 启用systemd
在/etc目录下新建wsl.conf配置文件,并编辑该配置文件:
Ubuntu
sudo vi /etc/wsl.conf
输入内容:
[boot]
systemd=true
Windows
在 Windows PowerShell(管理员)中运行:
wsl --shutdown
再重新打开 Ubuntu,使 WSL 彻底重新启动以便启用 systemd。然后在 WSL 中运行:
让你的ssh开机自启
systemctl enable ssh
systemctl start ssh
请注意你的ssh的登录安全,按照你的安全习惯配置即可。
6.精简你的WSL镜像:
为什么会有这个步骤?因为我在使用WSL的Rstudio-server利分析了单细胞 查到了两种方式,两种方式我都试了,不过貌似第一种效果更显著。
方式一
在Windows的PowerShell中打开命令行工具,先关闭正在运行的WSL,然后再执行如下命令
wsl --shutdown
diskpart
# 压缩前记得关闭虚拟机
select vdisk file="E:\WSL2\ext4.vhdx"
attach vdisk readonly
# sudo fstrim -av
compact vdisk
detach vdisk
exit
方式二
使用hyper压缩的WSL镜像,同时调整境相当稀疏性让WSL能够自动回收空间,具体操作时先启用Hvper-V,然后再在然后再在PowerShell中执行如下命令;
Go to Control Panel | Programs and features | Turn windows features on or off Tick Hyper-V | Hyper-V Management tools | Hyper-V Module for Windows PowerShell When installed, reboot if asked
wsl --shutdown
# 1.Revert sparse mode,因为稀疏不支持直接压缩
wsl --manage <distro> --set-sparse false #这里是你镜像的名字
# 2.Optimize the disk
optimize-vhd -Path "E:\WSL2\ext4.vhdx" -Mode full
# 3.Set it back to sparse mode
wsl --manage <distro> --set-sparse true #这里是你镜像的名字
你也可以将以上步骤写成bat文件,然后定期执行即可; 你也可以将以下内容添加到.wslconfig (位于 Windows配置文件目录中,而不是 WSL 内),以使任何新创建的发行版映像变得稀疏:
[experimental]
sparseVhd=true
写成bat处理
wsl --manage <distro> -s false
diskpart
select vdisk file="<distro-location>.vhdx"
attach vdisk readonly
compact vdisk
detach vdisk
exit
; EQUIVALENT TO
; Optimize-VHD -Path "<distro-location>.vhdx" -Mode Full -Verbose
wsl --manage <distro> -s true
进一步学习
学完以上基础内容后,你可能会感兴趣以下内容:
- 如何在WSL2内运行大模型,如部署本地的ollama或GPT;
- 如何让你的本地模型在外网随时可访问,如部署Tailscale或ZeroTrust;
- 还有哪些有趣的场景可以探索呢?
Update:
- WSL2新增网络镜像模式,能解决很多之前的网络问题了,NAT模式(WSL2默认)在我这里已经够用,有更多需求的请参看参考资料3的内容。