由于使用 Vmware 时,有时需要频繁的切换 VPN,结果出现了一些网络问题。因此折腾一下 WSL。

准备

这篇文章可以直接扔到 Windows 开发环境配置里的,后来想想算了,还是单开一篇来写,不至于篇幅过长。微软官方推荐使用 WSL2,拥有更好的性能和使用体验。

阅读本文默认你不是 Windows 家庭版用户,家庭版无法开启 Hyper-V(听说可以自行安装,浪子没试,只要是 windows 电脑拿回来我就给重装专业版了😉)。浪子配置时的环境和目标:

  • Windows 11
  • Git Bash
  • Debian 子系统
  • WSL2

Git Bash 是浪子喜欢使用的,Windows 下基本全部替换为了这个,Git 相关篇中已经介绍过。如果少侠使用的 Windows 10 以上系统,推荐使用 Powershell 代替 CMD。话说 CMD 这种东西现在真的还有开发喜欢嘛?

官网教程

微软的教程非常 Nice!

Follow me

开启使用 WSL 必需的服务

首先,按下 Windows 徽标键,输入 “启用或关闭 Windows 功能”,勾选 Hyper-V适用于 Linux 的 Windows 子系统,点击确定,然后进行重启。

更新 WSL 内核

下载 安装后打开自己的终端执行以下命令:

1
2
3
4
5
6
# 更新 wsl 版本
wsl --update
# 查看版本
wsl --version
# 配置 wsl2 为默认版本
wsl --set-default-version 2

之后我们进行安装 Debian,打开 Git Bash:

1
2
3
4
5
6
7
# 查询 Windows 支持安装的 Linux 子系统
wsl -l -o
# 安装指定的系统(如果是旧版本可能需要 -d 选项指定子系统)
wsl --install Debian

# 安装完成后启动 linux 子系统
wsl -d Debian --cd ~
search
search

看到以下内容就代表成功了,只需按照提示创建用户即可。

成功标志
成功标志

这里第一张截图有一个错误,文末有讲。

其它配置

wsl 的两个文件

  • .wslconfig 用于在 WSL 2 上运行的所有已安装发行版中配置全局设置。
  • wsl.conf 用于为在 WSL 1 或 WSL 2 上运行的每个 Linux 发行版按各个发行版配置本地设置。

设置 root 用户密码

1
sudo passwd root

安装 Neovim

浪子还是习惯于使用 Vim 或者 Neovim。这个安装在你没有换源之前还是比较慢的,也可以使用 echo 追加或者替换命令直接替换为国内源后再安装。镜像源直接百度就行,这个资料有很多。

1
2
3
4
# 更新系统
sudo apt update && sudo apt upgrade
# 安装
sudo apt intall -y neovim

后面就没有什么大问题了,安装自己常用的工具使用就行了,

安装其它工具

1
sudo apt install -y wget curl ssh iproute2 git

ssh 允许 root 用户登录

由于浪子是本机安装,这一项直接开放,用的时候方便。

/etc/ssh/sshd_config
1
2
#PermitRootLogin prohibit-password
PermitRootLogin yes

保存修改后运行 systemctl restart ssh 重启即可。

使用 systemd 管理系统服务

浪子安装的 Debian 同时存在 systemd 和 sysVinit 初始化程序,但默认使用的 sysVinit,这里把它给替换为 systemd。关于这两个服务在 Linux 入门篇有说明,这里不再赘述。

首先使用以下命令查看系统使用的服务管理工具:

1
ps -p 1 -o comm=

执行上面的命令后若打印的是 init,就按照下面的操作,直接编辑文件 /etc/wsl.conf,如果没有该文件,直接新建并加入内容保存,然后重启 Linux 子系统。

/etc/wsl.conf
1
2
3
4
5
6
[boot]
systemd=true

# 默认登录用户
[user]
default=root

如果解决不了(可能你不是按照本文的步骤),请先升级 wsl 后再次尝试:wsl --update

基本命令

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
# 以指定用户进入 linux 系统
wsl -d [linux-name] -u [user]
# 关闭所有的 linux 子系统
wsl --shutdown
# 中断正在运行指定的 linux 子系统
wsl -t [linux-name]

# 查看安装的 linux 发行版列表和状态以及 wsl 版本
wsl -l -v
# 设置默认启动的 linux 发行版,设置完成后不需要添加任何选项
# 可以直接使用 wsl 进行默认的发行版
wsl -s [linux-name]

# 设置默认的 wsl 版本,Version 替换为 1 or 2
wsl --set-default-version [Version]
# 命令可用于从 WSL 2 降级到 WSL 1,或将以前安装的 Linux 发行版从 WSL 1 更新到 WSL 2。
wsl --set-version [linux-name] [Version]

# 查找支持的 Linux 分发版系统
wsl -l -o
# 安装支持的分发版 Linux 系统
wsl --install -d [Linux-name]

# 更新 wsl
wsl --update
# wsl 状态
wsl --status
# wsl 版本
wsl --version

不是很推荐使用 wsl -t 来停止正在运行的 wsl 子系统。

安装 Arch Linux

借助 ArchWSL 项目进行,官方文档:https://wsldl-pg.github.io/ArchW-docs/locale/zh-CN/How-to-Setup/

配置中文环境

编辑 vim /etc/locale.gen 文件,把 zh_CN.UTF-8 UTF-8 这一行取消注释。然后执行以下命令:

1
2
3
4
5
locale-gen

echo "LANG=zh_CN.UTF-8" | sudo tee /etc/locale.conf
source /etc/locale.conf
locale

Arch Wiki 不推荐直接修改该文件,浪子本机有中文字体,这点儿不需考虑。你可以按照 wiki 来配置。

使用 pacman

使用 ArchWSL 时,默认情况下,pacman 是不能直接使用的,需要做一些修改。编辑 /etc/pacman.d/mirrorlist,在文件的最顶端添加:

/etc/pacman.d/mirrorlist
1
Server = https://mirrors.bfsu.edu.cn/archlinux/$repo/os/$arch

执行以下命令:

1
2
3
4
sudo pacman-key --init
sudo pacman-key --populate
sudo pacman -Sy archlinux-keyring
sudo pacman -Su

参考:https://wsldl-pg.github.io/ArchW-docs/How-to-Setup/#initialize-keyring

禁用 cgroup v1

编辑 ~/.wslconfig 文件(不存在就新建),加入以下内容,重启 wsl 子系统。

~/.wslconfig
1
2
[wsl2]
kernelCommandLine = cgroup_no_v1=all

附:一些错误

无法解析服务器的名称或地址

1
2
3
4
5
6
7
wsl -l -o
无法解析服务器的名称或地址

或者以下错误:

无法从“https://raw.githubusercontent.com/microsoft/WSL/master/distributions/DistributionInfo.json”中提取列表分发。无法解析服务器的名称或地址
Error code: Wsl/WININET_E_NAME_NOT_RESOLVED

网上百度说是 DNS 的问题(也算是 DNS 污染),浪子没有按照那个改。亲自尝试,使用魔法或者打开 hosts 添加以下内容都可以:

1
185.199.108.133 raw.githubusercontent.com

hosts 的 IP 不一定非要相同,这个 IP 是可以查出来的,就和访问 Github 修改 hosts 原理是一样的,归根结底都是国内的网络问题。

安装启动时 WslRegisterDistribution failed with error

1
2
3
4
WslRegisterDistribution failed with error: 0x800701bc
Error: 0x800701bc WSL 2 ?????????????????? https://aka.ms/wsl2kernel

Press any key to continue...

解决办法,下载安装新的 wsl 内核,下载链接在上面。

docker/podman 运行容器时报错

1
Error: netavark: unable to append rule '-d 10.88.0.0/16 -j ACCEPT' to table 'nat': code: 4, msg: iptables v1.8.9 (nf_tables):  RULE_APPEND failed (No such file or directory): rule in chain NETAVARK-1D8721804F16F

解决办法:

1
2
sudo update-alternatives --set iptables /usr/sbin/iptables-legacy
sudo update-alternatives --set ip6tables /usr/sbin/ip6tables-legacy

参考:https://github.com/microsoft/WSL/issues/6655


本站由 江湖浪子 使用 Stellar 1.29.1 主题创建。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。