保姆式WSL2基础配置指南

记录下之前折腾WSL2的记录,点太多还是聚合起来阅读比较好用,文章用ChatGPT组织。

最近不断看到有网友询问关于WSL2的问题,因此决定写一篇详细的入门配置教程,手把手教你如何配置WSL2,从入门到熟练使用。

通过这篇文章,你将学会:

  1. 在你的Windows电脑上安装Ubuntu到WSL2中;
  2. 迁移你的WSL2系统镜像,让系统随时可用;
  3. 优化WSL2系统设置,让其可以后台启动并高效运行;
  4. 设置Ubuntu内的应用开机自启。
  5. 其他的一些安全设置选项
  6. 给你的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和交换分区大小。

  1. 打开Windows资源管理器,地址栏输入 %UserProfile% 回车。在该目录下创建一个名为.wslconfig的文件,写入以下内容(以8GB内存电脑为例,分配2GB内存和2个CPU线程给WSL,设置4GB交换分区):

Update:最新版本已经回自动释放内存了,具体配置参看资料三,可能那个定时任务和稀疏转换已经不需要了!

[wsl2]
memory=2GB
swap=4GB
processors=2
localhostForwarding=true
# 自动释放内存
autoMemoryReclaim=dropcache
# 自动释放磁盘
sparseVhd=true
  1. 执行以下命令关闭并重新启动WSL:
wsl --shutdown

如果你不想限制WSL2的内存占用,可以通过定时任务定期清理内存。编辑crontab设置每小时释放一次内存:

crontab -e
0 */1 * * * echo 3 > /proc/sys/vm/drop_caches

3.2 设置WSL2后台启动

  1. 在你的WSL2的Debian或Ubuntu中执行以下命令,允许用户执行所有命令而不需要密码:
sudo bash -c "echo '$USER ALL=(ALL) NOPASSWD: ALL' >/etc/sudoers.d/$USER"
  1. 在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

进一步学习

学完以上基础内容后,你可能会感兴趣以下内容:

Update

  1. WSL2新增网络镜像模式,能解决很多之前的网络问题了,NAT模式(WSL2默认)在我这里已经够用,有更多需求的请参看参考资料3的内容。

参考资料

comments powered by Disqus