Windows 配置 WSL2

之前就想搞一下WSL 但是因为有mac的缘故 也就一直懒得弄

然而最近给朋友推销Haskell 感觉在windows上搞不是长久之计 于是写一个WSL2配置教程

然后头被陈旧教程锤烂了..

一个惨痛的教训就是找文档优先看官方page以保证时效性 下次一定..

安装 WSL2

先决条件

必须运行 Windows 10 版本 2004 及更高版本(内部版本 19041 及更高版本)或 Windows 11 才能使用以下命令。

按下win+pause键打开系统页面即可查看操作系统内部版本 不过除非故意不升级一般也不会在这里卡住


启用适用于 Linux 的 Windows 子系统

管理员身份打开 powershell,输入

1
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
  • 启用虚拟化

powershell 输入

1
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart

下载X64的WSL2 Linux内核升级包并安装

在打开的 powershell 中执行

1
wsl --install

然后重启。

管理员身份打开powershell 设置WSL默认版本

1
wsl --set-default-version 2

安装 Ubuntu 子系统

输入命令查看可获得的分发版本

1
wsl --list --online

这里我们选择Ubuntu22.04版本

1
wsl --install -d Ubuntu-22.04

安装好之后Ubuntu会自动启动

等待几分钟的设置后会要求设置用户名和密码。

输入密码时不会显示,建议设置的不要太复杂。

在 powershell 中输入

1
wslconfig /list

这里我得到的结果是

1
2
适用于 Linux 的 Windows 子系统分发版:
Ubuntu-22.04(默认)

到这里我们就得到了可用的Windows for Linux子系统

如果你电脑上有windows terminal的话,Ubuntu 22.04应该会自动加入到列表里

没有的话建议去Microsoft Store下载一个,挺好用的 而且WSL默认的配色比较阴间

Microsoft Store无法打开的话可能是因为挂了代理 关掉vpn即可

WSL2 迁移到其他盘

总所周知很多人都是c盘战士宴宁

所以将虚拟机从c盘迁移到别的盘是很有必要的

关闭正在运行的虚拟机

1
wsl --shutdown

查看安装的虚拟机名称

1
wsl -l -v

文件导出路径:填写一个 tar 结尾的路径 例如 D:\u.tar

1
wsl --export 虚拟机名称 文件导出路径
1
wsl --export Ubuntu-22.04 D:\\u.tar

删除虚拟机

1
wsl --unregister 虚拟机名称
1
wsl --unregister Ubuntu-22.04

导入新的虚拟机

1
wsl --import 虚拟机名称 目标路径 虚拟机文件路径 --version 2
1
2
mkdir D:\\wsl\\Ubuntu
wsl --import Ubuntu D:\\wsl\\Ubuntu D:\\u.tar --version 2

查看安装的虚拟机

1
wsl -l -v

修改登录用户

迁移之后 我们的默认登陆用户可能从用户变成了root 导致拿不到之前的设置

管理员powershell执行

1
ubuntu2204.exe config --default-user syh 改成你的用户名即可

当然,你也可以在虚拟机中的/etc/wsl.conf中添加

1
2
[user]
default=username

WSL配置

开启 systemd

WSL饱受诟病的一点 但是微软现在提供了支持 即使是Win10!

WSL2为独立内核 我们在设置了版本之后

1
wsl --set-default-version 2

还需要更新内核

1
2
wsl --update
wsl --shutdown

注意下载的时候还是要关掉代理 和微软商店同理

估计cdn走的是国内的缘故 挂梯子反而基本没网

之后执行

1
wsl --version

如果返回正常的版本号 说明内核更新成功

我们再打开子系统 找到 /etc/wsl.conf 没有就直接新建

1
cd /etc && sudo vim wsl.conf

在内容中加入

1
2
[boot]
systemd=true

如果你不会Vim 请先阅读(Vim操作)部分 左侧目录可以直接跳转

保存之后在powershell中输入

1
wsl --shutdown

再次打开时会发现已经启用了 systemd

我们可以执行看看

1
systemctl list-unit-files --type=service

发现服务已经成功启用 按q退出

WSL2配置代理(可选)

WSL2基于Hyper-V运行 在网络上和本机是两个ip

这里主要讲WSL2怎么用本机的clash

首先本机clash面板打开Allow Lan(允许局域网) 端口设置7890

中间可能会有防火墙询问 放行即可

在WSL上我们需要写一个脚本 用来拿到本机ip并设置代理 省的每次都设一遍

新建一个proxy.sh脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#!/bin/sh
hostip=$(cat /etc/resolv.conf | grep nameserver | awk '{ print $2 }')
wslip=$(hostname -I | awk '{print $1}')
port=7890

PROXY_HTTP="http://${hostip}:${port}"

set_proxy(){
export http_proxy="${PROXY_HTTP}"
export HTTP_PROXY="${PROXY_HTTP}"

export https_proxy="${PROXY_HTTP}"
export HTTPS_proxy="${PROXY_HTTP}"

export ALL_PROXY="${PROXY_SOCKS5}"
export all_proxy=${PROXY_SOCKS5}

git config --global http.https://github.com.proxy ${PROXY_HTTP}
git config --global https.https://github.com.proxy ${PROXY_HTTP}

echo "Proxy has been opened."
}

unset_proxy(){
unset http_proxy
unset HTTP_PROXY
unset https_proxy
unset HTTPS_PROXY
unset ALL_PROXY
unset all_proxy
git config --global --unset http.https://github.com.proxy
git config --global --unset https.https://github.com.proxy

echo "Proxy has been closed."
}

test_setting(){
echo "Host IP:" ${hostip}
echo "WSL IP:" ${wslip}
echo "Try to connect to Google..."
resp=$(curl -I -s --connect-timeout 5 -m 5 -w "%{http_code}" -o /dev/null www.google.com)
if [ ${resp} = 200 ]; then
echo "Proxy setup succeeded!"
else
echo "Proxy setup failed!"
fi
}

if [ "$1" = "set" ]
then
set_proxy

elif [ "$1" = "unset" ]
then
unset_proxy

elif [ "$1" = "test" ]
then
test_setting
else
echo "Unsupported arguments."
fi

给定权限

1
chmod 777 proxy.sh

指令用法

source ./proxy.sh set 开启代理
source ./proxy.sh set 测试连接
source ./proxy.sh unset 关闭代理

可以在 ~/.bashrc 或者你的终端配置文件中加入

1
alias proxy="source /path/to/proxy.sh"

然后soure ~/.bashrc一下 之后的命令就可以改为proxy set等等了

这部分内容其实就是WSL2配置代理抄过来的

终端更换为zsh

1
2
apt install zsh #安装zsh
chsh -s /bin/zsh #将zsh设置成默认shell(不设置的话启动zsh只有直接zsh命令即可)

之后退出重开Ubuntu终端 会有第一次使用的设置

这里我们选择0 只让他帮我们创建基本的.zshrc文件 这就是zsh的配置文件

然后下载oh-my-zsh

1
sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"

下载好用的插件并在.zshrc的plugins中添加(你自己可以探索更多!)

1
2
3
4
#zsh-autosuggestions 命令行命令键入时的历史命令建议
git clone https://github.com/zsh-users/zsh-autosuggestions ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-autosuggestions
#zsh-syntax-highlighting 命令行语法高亮插件
git clone https://gitee.com/Annihilater/zsh-syntax-highlighting.git ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-syntax-highlighting

我个人因为嫌卡手就没有装什么插件

如果你设置了网络代理并alias了proxy 记得也加到.zshrc中

还有一些别的.zshrc设置可以参考

我加了两条

1
2
3
4
# > 不会覆写原有文件,若要强制执行需使用 >|
setopt NO_CLOBBER
# 禁用烦人的提示音
unsetopt beep

重新配置ssh连接

自带的ssh似乎有点问题 无法连接到服务器

我们更新apt之后重装即可

1
2
sudo apt update && sudo apt upgrade
sudo apt reinstall ssh

配置vscode连接

官网下载 System Installer 安装时勾选所有选项(是否添加到桌面看情况勾选)

ctrl+shift+x打开插件栏 下载WSL

ctrl+shift+p打开控制面板 输入wsl

ctrl+shift+e打开资源管理器 打开你所需要的文件夹(工作区)

选择WSL:Conntect to WSL 就可以连接到你的WSL了

ctrl+`打开终端 开始你的WSL之旅吧


如果你本地没有别的需求的话 把所有插件和开发环境迁移到WSL是一个很好的选择

节省本地空间 同时Linux环境更适合编程学习 本地只需保留所需要的内容即可

开发环境配置

这里不建议换源 不然版本会有一堆问题 还是把网络问题解决了一步到位比较好

如果没有刷新apt缓存 请先刷新

1
2
sudo apt update && sudo apt upgrade
sudo apt autoremove
  • 获取NodeJS

安装nvm

1
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/master/install.sh | bash

完成后输入commang -v nvm 查看 应当输出nvm

如果没有相应则重新打开终端查看

鉴于频繁的重开终端等行为 建议在vscode中连接上wsl后操作

使用nvm管理你的nodejs

  • 获取cmake
1
sudo apt install cmake
  • 安装 llvm clang 等
1
sudo apt install llvm clang clangd

配置Haskell环境(可选)

虽说是可选 不过这是我一开始捣鼓WSL的目的不是 所以还是搞一下

新建~/.cabal/config文件 将以下内容写进去

1
2
3
repository mirrors.ustc.edu.cn
url: https://mirrors.ustc.edu.cn/hackage/
secure: True

然后执行

1
curl --proto '=https' --tlsv1.2 -sSf https://get-ghcup.haskell.org | sh

一路选择 a y y 一直回车安装即可

在Vscode上下载Haskell和Haskell Syntax Highlighting插件

这个过程可能有点慢.. 暂时不清楚为什么

之后打开一份.hs文件时 会自动检查hls版本下载并更新等等 这个过程可能会失败

报错信息说占用端口127.0.0.1:7890什么的 如果没有是最好了

如果报错的话就本地指令

1
ghcup tui

下载最新的HLS即可·

Vim操作

补充一点关于 vim 的知识,会的可以跳过

vim是linux自带的编辑器,也是十分好用的编辑器,当然学习曲线比较陡,可能难以上手,但是习惯了之后可以带来便利。

vim有多种模式,在 normal 的常规模式下,我们可以执行常规模式下的指令。

如果要编辑文件,则按 i 在当前光标进入到编辑模式,当然,按 a 也可以在光标之后的一个位置进入编辑模式

此外还有一些操作,例如 normal 模式下 d 为删除命令,接上一下参数可以删除指定的内容

gg 使光标移动到 第一行,G 使光标移动到最后一行,因此常规模式下,无论光标在何处,ggdG都可以删除第一行到最后一行,也就是全部的内容

如果要从其他模式返回 normal,只要按 esc 即可,当然vim也支持绑定键位,后期不顺手可以改键

更多的 vim 基础内容可以在命令行中输入

normal 模式下输入 :wq 保存并退出。 如果你没有更改文件的权限而想要退出 vim 并不保存,请使用 :q!